3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资与资产配置过程中,控制资产在单一或特定行业上的风险暴露是降低组合集中度风险、实现行业中性或偏好配置的重要手段。聚宽(JoinQuant)平台提供了 portfolio_optimizer 模块,可以通过 IndustryConstraint 限制函数轻松实现对指定行业权重的上下限约束。
IndustryConstraint 是聚宽组合优化器(jqlib.optimizer)中的一种限制函数,专门用于约束股票组合在某些行业上的整体权重。
IndustryConstraint(industry_code, low=0.0, high=1.0)
industry_code (str 或 list):单一行业代码或行业代码列表(例如 'HY007' 或 ['HY001', 'HY007'])。如果传入行业代码列表,则表示属于列表中所有行业的股票总权重需满足该约束条件。low (float, 默认 0.0):行业总权重的下限(范围为 0.0 到 1.0)。high (float, 默认 1.0):行业总权重的上限(范围为 0.0 到 1.0)。在策略中使用时,需要先导入聚宽优化器模块 from jqlib.optimizer import *,然后在调用 portfolio_optimizer 时,将 IndustryConstraint 对象作为列表元素传递给 constraints 参数。
import pandas as pd
from jqdata import *
from jqlib.optimizer import *
def market_open(context):
# 1. 准备股票池
buy_list = get_index_stocks('000016.XSHG') # 上证50成分股
# 2. 设置组合优化参数与约束条件
# 示例:限制组合在金融行业(行业代码 'HY007')上的总权重在 0% 到 20% 之间
industry_limit = IndustryConstraint(industry_code=['HY007'], low=0.0, high=0.2)
# 3. 运行组合优化器(以组合风险最小化 MinVariance 为例)
optimized_weight = portfolio_optimizer(
date=context.previous_date,
securities=buy_list,
target=MinVariance(count=250),
constraints=[industry_limit],
bounds=[Bound(0.0, 0.1)], # 单只股票权重最大不超过10%
default_port_weight_range=[0.0, 1.0],
ftol=1e-09,
return_none_if_fail=True
)
# 4. 执行调仓
if optimized_weight is not None:
total_value = context.portfolio.total_value
for stock, weight in optimized_weight.items():
order_target_value(stock, total_value * weight)
如果你需要限制整个行业分类体系(如聚宽一级行业分类 'jq_l1')下所有具体行业均满足统一的权重范围,可以使用 IndustriesConstraint:
# 限制 jq_l1 下的每个一级行业,权重均不超过 20%
constraint = IndustriesConstraint('jq_l1', low=0.0, high=0.2)
若需要约束组合相对于基准指数(如沪深300)的行业偏离度,则可以使用 IndustryDeviationConstraint:
# 限制组合在 HY001 行业上相对于沪深300指数的权重偏离不超过 5%
constraint = IndustryDeviationConstraint(industry_code='HY001', benchmark='000300.XSHG', limit=0.05)
return_none_if_fail=True 时函数会返回 None,策略中需做好空值兜底处理。IndustryConstraint 限制的是该行业下所有股票的权重之和,单只股票的持仓限制仍需通过 bounds=[Bound(low, high)] 参数配置。