3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化交易平台中,portfolio_optimizer(投资组合优化器)提供了强大的风险控制与资产配置功能。通过设置 MarketConstraint(市场权重限制),开发者可以精确控制组合中不同类别标的(如股票、ETF、期货等)的总权重上限与下限。
MarketConstraint 属于限制函数(constraints),专门用于对特定市场类型的标的资产进行整体权重约束。
MarketConstraint(market_type, low=0.0, high=1.0)
market_type (str): 目标标的的市场类型,可选值包括:
'stock': 股票'etf': 交易所交易基金'fund': 基金'futures': 期货'index', 'lof', 'fja', 'fjb', 'bond_fund', 'stock_fund', 'QDII_fund', 'money_market_fund', 'mixture_fund' 等。low (float, 默认 0.0): 对应市场类型资产在组合中的总权重下限。high (float, 默认 1.0): 对应市场类型资产在组合中的总权重上限。假设我们构建了一个混合股票与 ETF 的投资组合,要求:
import pandas as pd
from jqdata import *
from jqlib.optimizer import *
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 拟配置的股票与ETF标的池
g.buy_list = [
'600519.XSHG', '000001.XSHE', '600036.XSHG', # 股票
'510300.XSHG', '159915.XSHE' # ETF
]
run_monthly(rebalance, monthday=1, time='09:30')
def rebalance(context):
# 1. 定义约束条件:通过 MarketConstraint 设置市场类型权重
constraints = [
MarketConstraint('stock', low=0.0, high=0.9), # 股票总权重: 0% - 90%
MarketConstraint('etf', low=0.0, high=0.1) # ETF总权重: 0% - 10%
]
# 2. 调用投资组合优化器
optimized_weight = portfolio_optimizer(
date=context.previous_date,
securities=g.buy_list,
target=RiskParity(count=250, risk_budget=None), # 风险平价模型
constraints=constraints,
bounds=[Bound(0.0, 0.1)], # 单标的权重上限10%
default_port_weight_range=[0.0, 1.0],
ftol=1e-09,
return_none_if_fail=True
)
# 3. 打印优化后的权重分配
if optimized_weight is not None:
print("组合优化后的各标的权重为:")
print(optimized_weight)
else:
print("警告:组合优化失败!")
MarketConstraint 会自动识别 securities 列表中标的的类型。确保传入的代码符合规范(如 .XSHG 或 .XSHE)。default_port_weight_range 以及 WeightConstraint 的总权重范围保持逻辑一致,避免出现无解约束导致优化失败(返回 None)。RiskParity 或 MinVariance)需要足够的历史收益率数据(通常由 count 参数指定,如 250 个交易日)。标的上市时间较短可能导致计算失败。