PLUS会员-不公开

组合优化器使用文档

由nolamebrand创建,最终由nolamebrand 被浏览 605 用户

组合优化器是宽邦科技为满足机构投资者对于股票组合优化、绩效归因、风险控制和指数增强需求而提供的一款优化器。

使用概览

  1. 调用接口:T.PORTFOLIO_OPTIMIZERS
  2. 每日初始化:T.PORTFOLIO_OPTIMIZERS.get_today_factor_data
  3. 权重优化: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参数的,也就是说其不参与软硬约束的判断。

\

基于成长因子的中证500指数增强策略示例

标签

风险控制
{link}