组合优化器使用文档
由nolamebrand创建,最终由nolamebrand 被浏览 602 用户
组合优化器是宽邦科技为满足机构投资者对于股票组合优化、绩效归因、风险控制和指数增强需求而提供的一款优化器。
使用概览
- 调用接口:T.PORTFOLIO_OPTIMIZERS
- 每日初始化:T.PORTFOLIO_OPTIMIZERS.get_today_factor_data
- 权重优化:T.PORTFOLIO_OPTIMIZERS.optimize
\
调用接口
opt=T.PORTFOLIO_OPTIMIZERS(stock_pool, start_date, end_date, model_type='daily', benchmark='000905.HIX')
该命令是整个组合优化器的初始化接口,即使用组合优化进行权重选择之前,必须得先运行此行命令并赋值于一个变量
字段解释:
-
stock_pool: 标的池数据(比如中证500成份股数据,需包含字段:date, instrument, weight/score)
-
start_date: 标的池中数据的起始日期
-
end_date: 标的池中数据的结束日期
-
model_type: 因子收益协方差矩阵和特意收益率矩阵的数据类型,三选一:daily, short, long(默认为daily)
-
benchmark: 基准数据代码(默认为’000905.HIX’)
\
输出定义为opt的方法,可继续调用函数有:opt.get_today_factor_data, opt.optimize, 以及其余所有的目标函数和约束条件等
\
每日初始化接口
opt.get_today_factor_data(init_pool,current_date) (无需定义变量赋值)
该命令的用法是在整体初始化之后,进行每日权重分配以及约束条件和目标函数确定之前调用该接口
字段解释:
- init_pool: 每日标的池数据(比如中证500成份股数据,需包含字段:date, instrument, weight/score)
- current_date: 当前初始化日期
无输出结果,仅作每日初始化使用
\
权重优化接口
weights = opt.optimize(target_func, current_date, cons, stock_count=None, response=True, hard=True, verbose=False)
字段解释:
- target_func: 目标函数(类型: method)
- current_date: 当前日期(类型: string)
- cons: 约束条件,其中包含边界约束bounds(类型: methods)
- stock_count: 权重优化最大股票数量,若为None则表示没有设定限制(类型: int),默认为None
- response: 优化错误时,设置为True则返回0值,设置为False则不返回值(类型: bool),默认为True
- hard: 软硬约束定义,设置为True的话则为软约束,为False则为硬约束(类型: bool),默认为True
- verbose: 是否需要输出优化日志(类型: bool),默认为False
输出结果为每天优化后的组合权重结果,主要列名有【date, instrument, weights】
目标函数 & 约束条件
目标函数target_func和约束条件constraints会以方法的形式传入权重优化接口opt.optimize,所以需要在传入之前进行方法的定义
目标函数 | 接口 | 可调参数 |
---|---|---|
最大化风险调整后收益 | MaxReturn | 风险厌恶指数lam,默认为0 |
最小化风险 | MinRisk | 无 |
最小化风格偏离 | MinStyleDeviation | target_function: style - 风格因子名称以及偏离值(类型:dict),例如 {‘size‘:1} 表达的是将size因子暴露于其均值+1倍标准差之上 \n if_pred - 是否为预测数据(类型:bool),默认为False \n relative - 是否相对于基准(类型:bool),默认为False |
最大化预测得分 | MaxScore | 无 |
约束条件or边界条件 | 接口 | 可调参数 |
---|---|---|
总预算权重约束 | TotalWeightsConstraint | upper_limit - 资金组合总权重上限(类型:int / float) |
个股权重边界 | Bounds | lower_limit - 个股权重下限(类型:int / float) \n upper_limit - 个股权重上限(类型:int / float) \n relative - 是否基于基准(类型:bool;默认为False) |
个股风格约束 | StyleConstraint | style - 约束风格名称(类型:str / list)- 可使用风格因子列表见后表 \n lower_limit - 风格约束下限(单位为均值加n倍标准差,类型:int / float) \n upper_limit - 风格约束上限(单位为均值加n倍标准差,类型:int / float) \n relative - 是否基于基准(类型:bool;默认为False) \n priority - 软约束优先级(类型:int) |
个股风格除外约束 | ExcludeStyleConstraint | exclude_style - 除外风格名称(类型:str / list) \n lower_limit - 风格约束下限(单位为均值加n倍标准差,类型:int / float) \n upper_limit - 风格约束上限(单位为均值加n倍标准差,类型:int / float) \n relative - 是否基于基准(类型:bool;默认为False) \n priority - 软约束优先级(类型:int) |
个股行业约束 | IndustryWeigtedConstraint | style - 约束行业名称(类型:str / list)- 可使用行业因子列表见后表 \n lower_limit - 行业约束下限(单位为均值加n倍标准差,类型:int / float) \n upper_limit - 行业约束上限(单位为均值加n倍标准差,类型:int / float) \n relative - 是否基于基准(类型:bool;默认为False) \n priority - 软约束优先级(类型:int) |
个股行业除外约束 | ExcludeIndustryWeigtedConstraint | industry - 除外行业(类型:str / list) \n lower_limit - 除外行业约束下限(单位为均值加n倍标准差,类型:int / float) \n upper_limit - 除外行业约束上限(单位为均值加n倍标准差,类型:int / float) \n relative - 是否基于基准(类型:bool;默认为False) \n priority - 软约束优先级(类型:int) |
预期收益约束 | PredictReturnConstraint | lower_limit - 收益约束下限(类型:int / float) \n priority - 软约束优先级(类型:int) |
波动率约束 | VolatilityConstraint | upper_limit - 约束上限(类型:int / float) \n relative - 是否基于基准(类型:bool;默认为False) \n priority - 软约束优先级(类型:int) |
换手率约束 | TurnoverConstraint | turnrate - 换手率约束(类型:int / float) \n priority - 软约束优先级(类型:int) |
追踪误差上限约束 | TrackingError | upper_limit - 追踪误差上限(类型:int / float) \n priority - 软约束优先级(类型:int) |
基准成份股权重约束 | BenchmarkWeightedConstraint | lower_limit - 最低基准成份占比(类型:int / float) \n priority - 软约束优先级(类型:int) |
行业内个股权重约束 | IndustryComponentConstraint | industry - 行业名称(类型:int / list) \n limit - 最低行业内个股占比(类型:int / float) \n priority - 软约束优先级(类型:int) |
可用风格因子&行业因子
- 风格因子
- leverage
- beta
- momentum
- growth
- nonlinear_size
- liquidity
- size
- residual_volatility
- value
- 行业因子
- industry_prefix_* → 其中星号为申万一级行业code,具体code可见:
DataSource("basic_info_IndustrySw").read()
使用方法示例
目标函数&约束条件定义方法
目标函数只能有一个,约束条件可以通过列表的方式进行多个方法的存入
## 定义多个约束条件(list / str)
constraints = [
opt.StyleConstraint('beta', lower_limit=0.1, upper_limit=1, relative=True, priority=1), ## 风格约束
opt.ExcludeStyleConstraint('beta', lower_limit=-0.1, upper_limit=0.1, relative=True, priority=0), ## 风格除外约束
opt.TotalWeightsConstraint(upper_limit=1), ## 总权重约束
opt.Bounds(lower_limit=0, upper_limit=0.04, relative=True) ## 个股边界约束
]
## 定义目标函数
objective= opt.MaxReturn(lam=0.1)
## 权重优化
weights = opt.optimize(objective, current_date, constraints, stock_count=50, hard=False)
软硬约束定义:
其中,priority为当optimize中的hard=False时,即定义优化约束为软约束的时候,优化失败时会优先去掉priority值越小的约束。比如约束A的参数priority=1,约束B的参数priority=0,则在hard=False的时候,首次优化失败则会删除约束B进行第二次约束,若再次优化失败则删掉约束A,依次类推。约束条件中的TotalWeightsConstraint和Bounds是不带priority参数的,也就是说其不参与软硬约束的判断。
\