策略所用方法
本文依次采用了机器学习方法里面的神经网络,k_means,SVR三种学习方法来进行数据流以及信号的生成。
神经网络以及k_means就不介绍了,这里简单的说一下SVR,
SVR是支持向量回归的模型,众所周知SVM是支持向量机的分类算法,而SVR则是支持向量在回归问题上面的运用。与线性回归或者其他高阶回归不同的是,SVR进行回归时会忽略一定范围内的点,而只是对范围外面的点进行回归,如下图:
策略所用思路
第一步:生成股票特征
数据前处理:采用了2005-2016年所有股票的日线数据,数据特征的生成只采用了daily_return
模型:灵感来源于神经网络的自编码模型(Autocode),对每只股票标的做出了100维的特征,即每一只股票采用100维的向量表示
数据后处理:得到100维的向量后,对每一只股票向量做向量长度归一化处理,即处理前的向量元素除以向量的长度(元素平方和),这样能够使每一只股票向量的长度均为1
python框架:tensorflow
缺点:特征维度缺乏明显的经济学含义
第二步:股票聚类分析
数据前处理:基于第一步生成的几千只股票向量,这样可以得到一个matrix(股票数量X100),这里的100是股票的向量维度(即特征维度)
模型:用k_means方法对股票进行聚类,这里我分成了100个类,这样平均每个股票类别含20-40只股票
数据后处理:把不同类别的股票代码进行存储,同属于一个类的股票代表其特征更加接近,这样每一个股票类别形成了我们的一个股票池
python框架:sklearn
缺点:k_means方法不够稳定
第三步:股票反转特征研究
数据前处理:任选一个股票池,获取交易日前28天的收盘价(close_price)数据(形成training集),并获取当天14:50分钟的股票池中所有股票价格(用于预测价格)
模型:SVR(支持向量回归),利用training集对股票池中的每一只股票进行回归,即每一只股票而言,y是该股票过去28天的close_price,X是同一股票池中除了该股票以外的其他股票过去28天的close_price。利用训练好的模型以及14:50的股票池所有股票价格生成一个predict_price(预测价格)
数据后处理(信号生成):如果某只股票的current_price(现价),比起predict_price小了3个sigma(过去28天价格的标准差),这个时候就买入,这代表了价格发生了明显的低估背离,买入后current_price比predict_price大了1个sigma,这个时候就平仓,这代表了价格的低估背离已经消失
python框架:sklearn
缺点:在实际操作过程当中,由于3个sigma的限制条件比较严格,合格股票较少,可能导致长时间不开仓(同时可以避开大盘下行),而且容易选到出现连续好几个跌停板的股票导致损失惨重,这个时候,开仓条件就必须经过一定的条件过滤
可选用的过滤条件:当日跌幅过大时不开仓,current_price对predict_price的偏离程度扩大时不开仓等等
回测结果
最后呈上自己测试的有效的股票池策略回测结果:
优化方向:目前策略回测还有点大,打算是加入股指期货对冲,或者进行最大仓位限制管理,并且因为不同股票池的特征不一样,所以可能有些股票池的超跌反转效应更强(目前只是随机测试两到三个股票池)
结语
最近在跑模拟盘,如果模拟盘跑的还不错的话我会把模拟盘的测试结果和策略代码一起pour出,与大家一起分享