刘翼 学号:221040012
本策略的实现主要来源于《20180705-天风证券-金工专题报告:基于自适应风险控制的指数增强策略》,核心内容主要有以下三点:
- 数据预处理及因子计算 :从规模、估值、成长、盈利、技术等维度筛选出十几个具有长期稳定选股能力的因子,进行缺失值、去极值、标准化、市值和行业中性化处理。
- 收益预测模型 :我们最后要优化的目标函数中的预期收益通过因子IR加权法计算获得,各因子权重值为各因子在滚动时间内平均IR值在所有因子在滚动时间内平均IR值之和中的占比,因子在滚动时间内平均IR值越大,说明该因子在选股时作用越大,权重也越大,反之亦然。
- 风险控制模型 :策略的核心是控制投资组合在更多的风险因子上的暴露与基准指数一致,以期获得更小的跟踪误差。该策略需要通过求解二次优化或非线性优化问题来构建最优组合。
配置文件,存储了聚宽账户的用户名和密码,用于读取数据
实现对上述配置文件读取
定义FilterStocks类,内置delete_stop函数和delete_pause函数,对于上市时间太短或者近期停牌的股票进行筛选。 输入Params:
- param index: 'A'全市场或者其他指数的聚宽代码,str
- param date: 日期,str
- param N: 上市日期不足N日
- param active_day: 过滤交易不足N日的股票
包含了所有获取数据的功能函数:
- get_price_info 获取指定股票池指定时间段的行情数据,在回测模块中用到
- get_trade_period 获取从起始日期到终止日期指定频率的日期list(以datetime的形式返回)
- get_factor 将4.5.6三个函数中获取到的因子的dataframe整合成一个完整的dataframe 三维:证券,日期,因子
- query_model_factor 获取指定日期规模、估值、成长、盈利、技术等维度的因子 二维:证券,因子
- industry 获取指定日期股票行业分类 二维
- market_cap 获取指定日期股票市值 二维
这部分共有四个函数:factors_null_process、extreme_process_MAD、data_scale_Z_score、neutralization,对因子数据进行了缺失值、去极值、标准化、市值和行业中性化处理。
这个模块用于计算基于因子IR加权法计算获得,各因子权重值为各因子在滚动时间内平均IR值在所有因子在滚动时间内平均IR值之和中的占比,因子在滚动时间内平均IR值越大,说明该因子在选股时作用越大,权重也越大,反之亦然。 1.get_next_return:计算预期收益,用于ICIR值计算 2.IR_weight:计算IR值对应权重并加入factor的dataframe返回
1.get_weighs:获取指数标准权重 2.get_opt_weight:根据输入限制条件优化目标函数获得最优的权重 3.optimization_result:获得最后的包含日期、证券、权重三个维度的dataframe,输入回测框架
import 上述各个模块中的功能函数,依次运行
回测模块使用了backtrader的第三方模块 策略为每月底调仓,调仓目标权重由main.py生成的trade_info.csv文件(时间、股票、权重三个维度)输入 策略的data feed由functional.py中的get_price_info获取指定回测区间的行情数据 构建一个完整的回测object运行即可
股票池:沪深300指数 周期:2018/7/1 - 2021/7/31
类别 | 因子名称 | 因子code | 因子计算方式 |
---|---|---|---|
规模 | 对数市值 | natural_log_of_market_cap | 总市值取对数 |
估值 | 账面市值比 | book_to_price_ratio | 净资产/总市值 |
技术指标 | 一个月反转 | ROC20 | 过去 20 个交易日涨跌幅 |
技术指标 | 三个月反转 | ROC60 | 过去 60 个交易日涨跌幅 |
成长 | 净利润增长率 | net_profit_growth_rate | (今年净利润(TTM)/去年净利润(TTM))-1(修改) |
成长 | 营业收入增长率 | operating_revenue_growth_rate | 今年营业收入(TTM)/去年营业收入(TTM))-1(修改) |
成长 | 利润总额增长率 | total_profit_growth_rate | (今年利润总额(TTM)/去年利润总额(TTM))-1(修改) |
盈利 | 单季度净资产收益率 | roe_ttm | 单季度归母净利润2/(期初归母净资产+期末归母净资产)(修改) |
盈利 | 单季度总资产收益率 | roa_ttm | 单季度息税前利润2/(期初总资产+期末总资产)(修改) |
流动性 | 一个月日均换手 | VOL20 | 过去20个交易换手率均值 |
流动性 | 三个月日均换手 | VOL60 | 过去60个交易换手率均值 |
采用MAD(Median Absolute Deviation 绝对中位数法)去极值,对于极值部分将其均匀插值到 3-3.5 倍绝对中位数范围内。具体操作如下,首先计算当期所有股票在因子f上的中位数 𝑚𝑓 ,然后计算绝对中位数 𝑀𝐴𝐷=𝑚𝑒𝑑𝑖𝑎𝑛(|𝑓−𝑚𝑓|) 采用与 3𝜎 法等价的方法,保留 [𝑚𝑓−3∙1.483∙𝑀𝐴𝐷,𝑚𝑓+3∙1.483∙𝑀𝐴𝐷] 之间股票 的因子值不变,取值大于 𝑚𝑓 + 3 ∙ 1.483 ∙ 𝑀𝐴𝐷 的所有股票的因子取值按排序均匀压缩到 [𝑚𝑓+3∙1.483∙𝑀𝐴𝐷,𝑚𝑓+3.5∙1.483∙𝑀𝐴𝐷] 之间,取值低于 𝑚𝑓 − 3 ∙ 1.483 ∙ 𝑀𝐴𝐷 的所 有股票的因子取值按排序均匀压缩到 [𝑚𝑓−3.5∙1.483∙𝑀𝐴𝐷,𝑚𝑓−3∙1.483∙𝑀𝐴𝐷] 之间,这样去除了极值同时也在极值的股票之间保序。
为了使得构造复合因子时各因子间量纲统一,我们对每个因子进行标准化处理,采用 Z-Score 方法来对因子取值标准化,使得因子的均值为 0,标准差为 1,即 𝑓′=𝑓−𝑚𝑒𝑎𝑛(𝑓)𝑠𝑡𝑑(𝑓)
由于因子可能受到市值以及行业的影响较大,因此需要对市值和 行业进行中性化处理,即对下式做回归取残差:
𝑓𝑖=𝛽𝑀𝑉𝑀𝑉𝑖+Σ𝛽ind𝑗𝑋𝑖𝑗+𝜖
其中 𝑀𝑉𝑖 为股票𝑖的对数总市值,也进行了去极值、标准化的处理, 𝑋𝑖𝑗 为股票 𝑖 对于行业 𝑗 的0-1哑变量,对回归后得到的残差 𝜖 继续做去极值、标准化处理得到中性化后的因子取值。
多因子线性优化模型指数增强策略的核心是控制投资组合在更多的风险因子上的暴露与基准指数一致,以期获得更小的跟踪误差。常见的风险控制形式主要包括风险暴露约束、行业暴露约束、相对于基准跟踪误差约束、个股权重约束等,这些约束条件都能有效地控制组合相对基准指数的偏离,使组合能稳定的战胜基准指数。该策略一般需要通过求解二次优化或非线性优化问题来构建最优组合。
策略的组合优化模型形式如下所示:
目标函数: 𝑚𝑎𝑥(𝑟𝑇𝑤)
约束条件: 𝑠𝑙⩽𝑋(𝑤−𝑤𝑏)⩽𝑠ℎ
ℎ𝑙⩽𝐻(𝑤−𝑤𝑏)⩽ℎℎ
𝑤𝑙⩽𝑤−𝑤𝑏⩽𝑤ℎ
𝑏𝑙⩽𝐵𝑏𝑤⩽𝑏ℎ
0⩽𝑤⩽𝑙
𝐼𝑇𝑤=1
该优化问题的目标函数为最大化组合收益,其中 𝑟𝑇𝑤 为组合预期收益,w为待求解的股票权重向量,r为前面计算得到的每股综合得分。模型的约束条件包括在风格因子上的偏离度、行业偏离度、个股偏离度、成分股权重占比控制、个股权重上限控制,具体解释如下: 约束条件1控制了组合相对于基准指数的风格暴露,X为股票对风格因子的因子暴露矩阵,𝑤𝑏为基准指数成分股的权重向量,s𝑙,𝑠ℎ 分别为风格因子相对暴露的下限和上限; 约束条件2限制了组合相对于基准指数的行业偏离,H为股票的行业暴露矩阵,当股票i属于行业j时, 𝐻𝑗𝑖 为1,否则为0,ℎ𝑙,ℎℎ分别为组合行业偏离的下限和上限,此处行业采用前文的32个行业分类方法; 约束条件3限制了个股相对于基准指数成分股的偏离,𝑤𝑙,𝑤ℎ分别为个股偏离的下限和上限; 约束条件4限制了组合在成分股内权重的占比下限及上限,𝐵𝑏为个股是否属于基准指数成分股的0-1向量, 𝑏𝑙,𝑏ℎ分别为成分股内权重占比的上限及下限; 约束条件5限制了卖空,并且限制了个股权限的上限l; 约束条件6要求权重和为1,即组合始终满仓运作。 注:该组合优化模型没有采用二次项的跟踪误差约束( (𝑤−𝑤𝑏)𝑇Σ(𝑤−𝑤𝑏)⩽𝑇𝐸2/250 , 𝑇𝐸2 为组合的预期年化跟踪误差的上限)来控制组合对基准的偏离,而是用的约束条件3中的个股相对于基准指数成分股的偏离度,原因是: 1、直接用跟踪误差作为约束条件进行风险控制需要估计协方差矩阵,跟踪误差是否控制成功依赖于协方差矩阵估计的准确性,而协方差矩阵的估计本身受很多假设条件的限制,估计较为困难,不稳定性较大,而用个股相对于基准指数成分股的偏离度来控制跟踪误差更为直接,个股偏离度越小,对基准指数的跟踪误差也就越小; 2、跟踪误差约束是二次约束,而偏离度约束是线性约束,后者比前者的求解更高效。 本策略的基准指数选沪深300指数,且在基准指数成份股内选股,所以约束条件4不用设置。