我们从事量化工作的都会了解研发策略时候一个最关键的基础:干净、准确的数据
其中包括:
1 清洗过的准确的数据
2 避免未来数据的存在
3 避免幸存者偏差
我们想分享下准备量化数据时候应该注意和我们所做过的工作,首先谈谈股票中的拆分和分红:
为了避免因拆分(送股、增股)而出现的股价大幅变动,我们根据拆分把股价进行调整,用户在回测时可以忽略股票的拆分影响。我们仅根据拆分对历史交易数据做了前复权,并未加入股息分红因素,因为单独计算股息分红的影响可以让您的策略收益计算更加准确,想详细了解,请参考后续的股息分红
在下面的例子中我们使用 Apple inc.的股票来演示我们如何对股价进行拆分调整:
Apple 的股票在 20140609 ( 2014 年 6 月 9 号)进行了一次拆分。我们首先对 20140609 以前的股价进行 1:7 调整,即调整后收盘价=收盘价 / 7 。之后我们再对成交量进行 7:1 调整,即调整后成交量=成交量 x 7 。在调整前后交易日当天的总交易值保持不变。
对股价进行拆分调整可以使股价曲线更平滑。我们把上面的数据用图形显示出来,正如下图:蓝色线代表收盘价,红色线代表调整后收盘价,浅蓝色虚线注明了拆分出现的时间 20140609 (横坐标为 780 );时间从 20110428 (横坐标为 0 )到最近完成的交易日(横坐标为 1000 );另外由于从 20140609 到最近完成的交易日没有出现拆分,在图形中蓝色线和红色线重合。
我们是把股票的拆分和分红分开处理。这样才会更精确。
分红:
我们很乐意分享我们是如何处理较复杂的分红计算的,我们花了很大功夫如此计算为了让用户能收到最准确的策略收益值。在股息事件中有四个关键的日期:
方案实施公告日 :公司公布股息分配方案的日期。
股权登记日 :在股权登记日这一天收盘时仍持有或买进该公司的股票的投资者可以享有此次股息分红。
除权除息日 :股权登记日的下一个交易日即是除权除息日,该日证券交易所会计算出股票的除权除息价,以作为投资者在除权除息日开盘的参考。
股息到帐日 :现金股息划拨到投资者资金账户的日期。
当您的投资策略在股权登记日时仍持有分股息的股票,那么您的投资策略将有资格参与此次股息分红。
在除权除息日结束的时候您投资组合中的 DividendRecivable 会增加对应持有股票的股息分红数目。然后在股息到帐日那天 DividendRecivable 将会被搬入投资组合中的 AvailableCash - 您最终拿到了应收股息分红的金额,并且可以用这笔钱进行再投资了。
整个回测框架会在股权登记日及之前将已有持仓部分计入分红,而在公告之后不计入。
未来数据
顾名思义:就是在回测时候交易决策的时候刻意或无意地用了尚未发生 /公布 /将来才会获知的数据。我们经常看到一些表现极其逆天的回测表现,而实盘却平凡得不值一提的策略,往往是误用了未来数据。
在整个交易系统的设计中我们都努力地避免了未来数据的出现:
这里包括数据的预处理和数据 API 的设计
以上是 Ricequant 的一个模板策略的例子:
其中 Handle_bar 是进行数据处理和交易的函数: 切片数据的更新会自动触发调用这个方法,如果是日回测则是每日的切片数据( OHLC )会触发调用,分钟回测则会是每分钟的切片数据会调用,那么在实时模拟交易中则是实时每分钟会调用一次。
而这个函数中,你要使用下一分钟或者明天的数据,都是无法获取的。
而根据这一个切片的 OHLC ( Open Hign Low Close )所下的单,也只能在下一个切片中完成。
这个就是从制度上避免了未来数据的读取。
详见误用未来数据的例子:
例子一:在前复权的股票池中,选取历史某一点股票价格最低的十只股票购入并持有到现在。你会发现,我勒个去,表现也忒惊人了。 各位可以想想这是出了什么问题。
例子二:(自黑系列)
滚雪球啊滚雪球,以为自己从此就财务自由了...http://xueqiu.com/7381621247/64723727
幸存者偏差 Survivorship bias :
尽管由于中国的退市制度不完善,过去几十年间中国的退市公司还是寥寥无几;然而在成熟的股票市场中、每年被迫退市的股票多不胜数。
相信在将来股票市场日渐完善的过程中,退市也会变成一种常态,这样小盘股完胜大市,壳资源效应就不那么奏效了。。扯远了。
而你根据现在存在的股票进行历史回测,它的表现不至于太差(至少不会退市)。而实际上我们买的股票,在将来是有退市的可能的,这个时候你的 Portfolio 中如果有较多此类股票的持仓,就会遭受重大的损失。 所以我们在制定选股策略的时候,不仅把眼光放在现在,而是要往前移。
by Ricequant 量化 http://www.ricequant.com