AI量化知识树

寻找沪深300中的有效因子

由ypyu创建,最终由ypyu 被浏览 1503 用户

导语

本文通过StockRanker算法在单因子上进行了批量回测试验,尝试在沪深300样本股范围内中寻找具有获取超额收益潜力的因子,以实现较好的的相对收益。结果表明,通过批量测试能够快速因子筛选,同时指导新策略的开发。

背景介绍:因子分析是对冲基金常用工具之一,用来分析研究收益率均值和因子暴露在截面上的关系。对冲基金通常从规模、技术反转、流动性、波动性、财务等维度中寻找能够产生正向收益的因子或其组合来进行股票并进行组合投资以获取超额收益。传统的多因子模型通常采用线性模型,研究周期尺度通常为月。

2017年是市场风格转变的一年,以往的小市值因子突然失效,很多依靠市值因子进行投资组合配置的量化策略失灵,产品净值大幅回撤。在这样的行情下,很多量化投资者面临一个严峻的挑战,即如何在这样的市场条件下快速挖掘到新的有效因子。

相比于传统因子分析而言,在AI量化技术的支持下,可以通过批量回测试验快速挖掘寻找有效因子,同时策略研究周期从月度扩展到日线级别、因子模型也从线性扩展到非线性,以更好地适应变化的市场环境。

单因子批量试验设计:

策略设计

我们采取N天固定周期轮仓的策略,每次轮仓M只股票。

测试因子范围

在因子选择和构建方面,我们首先选择平台支持的几大类基础因子:

量价因子 如rank_avg_amount_20, 资金流因子 如mf_net_pct_xl,财务因子如:fs_net_profit_qoq_0, 股东因子 如sh_holder_avg_pct_0, 技术分析因子 如ta_aroon_down _28_0, 波动率因子 如swing_volatility_10 BETA值因子 如beta_sse50_30_0

然后我们通过表达式引擎函数构建部分因子: 例如sum(turn_0,20),mean(mf_net_amount_main_0,20),group_rank(industry_sw_level1_0,sum(mf_net_amount_l_0,20))

在因子参数选择方面,我们选择了一些较长周期的因子以匹配较长的持仓周期,例如因子rank_avg_amount_$我们选择了rank_avg_amount_10和rank_avg_amount_20。

变量设计

针对每个单因子,我们固定验证集时间段为2017-01-01至今,利用StockRanker模板策略,我们尝试循环枚举:训练集起始时间,持仓股数,持仓天数等变量。

结果记录

我们针对每组循环变量的回测结果记录对应的alpha,annual_ret,beta,max_drawdown,return_ratio,sharpe_ratio等项。

试验流程实现

封装循环体

我们新建AI可视化策略,并查看代码模式,将其代码整体封装为函数,篇幅原因仅这里展示部分代码:

def cal_test(features_input,start_date,split_date,end_date,freq,count):
    #模板策略代码(针对变量做参数化修改)
    #提取回测结果放在res_tmp中
    res=m12.read_raw_perf()[['algorithm_period_return','alpha','beta','max_drawdown','sharpe']]
    res_tmp=pd.DataFrame(res.iloc[-1]).T
    #返回回测结果
    return  res_tmp

循环计算和结果记录

代码举例:

flag=0
for s in features_all:
    fac=[s]
    for hold_days in [5,10,20]:
        for hold_count in [5,15,30]:
            try:
                if flag>0:
                    tmp_record=cal_test(fac,start_date,split_date,end_date,hold_days,hold_count)
                    tmp_record.to_csv('record_'+str(mm)+'.csv',header=False,mode='a')
                else:
                    tmp_record=cal_test(fac,start_date,split_date,end_date,hold_days,hold_count)
                    tmp_record.to_csv('record_'+str(mm)+'.csv',header=True,mode='w') 
                    flag+=1
            except:
                continue

试验结果

结果文件

首先我们获取所有试验结果的csv文件,如图1所示:

图1 结果文件截图 我们针对所有的试验结果可以按年化收益或夏普比率进行排名,进而找到一些表现较好的因子,如图2: 图2 年化收益排名截图

结果复现

我们复现排名靠前的几个参数组合,这里仅列出其中一个参数组合的回测表现,其中深红色为参照指数的相对收益。可以看到通过枚举循环可以快速找到一些参数组合得到在2017年后取得超越沪深300指数基准收益的策略,但总的来说在沪深300内做单因子的指数增强相对于在全市场选股难度明显增加。 image|690x228

结果分析

图2 年化收益为正的参数组合截图 我们通过分析年化收益为正的参数组合,可以发现一些统计规律: a. 对于长期持仓收益(例如20日),财务类因子表现较技术类因子好; b. 持股数量出现频数最多的为5只; c. 从因子角度重复出现次数较多的为:

  • rank_sh_holder_num_0相关类的股东因子

  • mf_net_pct_main_0相关类的资金流因子

    说明这两类因子可以获取相对稳定的超额收益。

构建新策略

根据上述单因子分析的结论,可以快速指导我们构建策略如下: 持仓时间22日(月度频率换仓),持股数量为5只,因子采用测试结果中排名靠前的部分因子。我们按照此原则选取一组因子如下: group_rank(industry_sw_level1_0,west_eps_ftm_0) rank_sh_holder_avg_pct_3m_chng_0 rank_sh_holder_num_0 sh_holder_avg_pct_6m_chng_0 group_rank(industry_sw_level1_0,fs_gross_profit_margin_0) fs_operating_revenue_qoq_0 group_rank(industry_sw_level1_0,sum(mf_net_pct_main_0,20)) group_rank(industry_sw_level1_0,fs_proj_matl_0) group_rank(industry_sw_level1_0,sh_holder_avg_pct_3m_chng_0) sum(rank(mf_net_pct_main_0),20) mean(rank(mf_net_pct_main_0),20) 回测得到的净值曲线如下:

结论

本文示例了一个固定周期调仓策略研究流程,我们首先通过枚举遍历进行单因子测试,并利用测试结果进行策略参数的分析筛选,最后利用分析结果指导构建新策略。 通过本例可以看到,AI可以显著提升新策略开发以及策略优化的效率和优化效果。

\

标签

StockRanker算法因子分析对冲基金
评论
  • 有sample code么
  • 截图怎么都看不到呀