3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在投资组合管理中,控制单一标的的持仓权重是分散风险和防止个股黑天鹅事件的关键手段。JoinQuant(聚宽)平台提供了功能强大的 portfolio_optimizer 投资组合优化器,支持通过 bounds 参数灵活设置标的权重的边界条件。
本文将详细介绍如何组合使用通用边界函数 Bound 与行业专用边界函数 IndustryBound,实现全局控制与特定行业精细化调控。
Bound(low=0.0, high=1.0)low:单标的权重下限(默认 0.0)。high:单标的权重上限(默认 1.0)。Bound(0.0, 0.1) 表示任意单只股票的权重不可超过 10%。IndustryBound(industry_code, low=0.0, high=1.0)industry_code:单一行业代码或行业代码列表(例如 'HY001' 或 ['HY001', 'HY007'])。low:若股票属于指定行业,其权重下限为 low,否则下限为 0.0。high:若股票属于指定行业,其权重上限为 high,否则上限为 1.0。IndustryBound(['HY001', 'HY007'], low=0.0, high=0.05) 表示属于 HY001 或 HY007 行业的股票,单只权重最高不超过 5%。注意:当
bounds列表中存在多个限制条件时,优化器会对某只股票的权重下限取所有适用Bound的最大值,上限取所有适用Bound的最小值。
以下示例展示了如何在 portfolio_optimizer 中,设置默认单股上限为 10%,同时将金融等特定行业的单股上限严格限制在 5% 以内:
import pandas as pd
from jqdata import *
from jqlib.optimizer import *
def market_open(context):
# 假设 g.buy_list 为选定的股票池
securities = g.buy_list
# 设置边界条件:
# 1. 通用边界:所有股票权重范围在 0% ~ 10%
# 2. 行业边界:属于 HY007(多元化银行指数)行业的股票,权重范围在 0% ~ 5%
bounds = [
Bound(low=0.0, high=0.1),
IndustryBound(industry_code='HY007', low=0.0, high=0.05)
]
# 调用组合优化器(例如以风险平价 RiskParity 为目标)
optimized_weight = portfolio_optimizer(
date=context.previous_date,
securities=securities,
target=RiskParity(count=250),
constraints=[WeightConstraint(low=0.9, high=1.0)], # 组合总权重限制在 90%~100%
bounds=bounds,
default_port_weight_range=[0.0, 1.0],
ftol=1e-09,
return_none_if_fail=True
)
if optimized_weight is not None:
print("优化后的权重配置:")
print(optimized_weight)
else:
print("警告:组合优化失败,未找到可行解")
Bound 设置上限为 0.1,而 IndustryBound 设置上限为 0.05,对于该行业的股票,最终生效的上限将是两者中的最小值即 0.05。return_none_if_fail=True,并对返回结果进行空值校验。bounds 列表参数,动态调整对敏感行业的敞口偏好。