得到大智慧的除权数据琢磨了好些日子,最后发现还是用Pandas来解决是最便捷的,后复权还没做,先在这里做个笔记,备忘。
以股票600725为例,除权数据赋予变量ea,数据为dataframe格式,结构如下:
present bonus price rationeddate 2016-12-28 10.0 0.00 0.0 0.02012-06-04 0.0 0.50 0.0 0.02011-05-20 0.0 1.00 0.0 0.02010-05-13 8.0 0.23 0.0 0.02009-05-15 0.0 2.00 0.0 0.02008-04-09 0.0 3.00 0.0 0.02007-04-12 0.0 1.00 0.0 0.02006-05-22 0.0 1.00 0.0 0.02006-02-10 3.5 0.00 0.0 0.02005-03-28 5.0 0.50 0.0 0.02003-03-26 0.0 2.00 0.0 0.02002-04-15 0.0 2.00 0.0 0.01997-06-05 0.0 2.00 0.0 0.0
如果做2016年11月1日到12月31日的复权,则对数据做切片:
ea = ea.ix[datetime.datetime(2016,12,31,0,0,0):datetime.datetime(2016,11,1,0,0,0)]
这样除权数据就只剩一条了:
present bonus price rationeddate 2016-12-28 10.0 0.0 0.0 0.0
接着取出2016年11月1日到12月31日期间600725的日K数据赋予变量df,同样是dataframe格式,虽然我这里现在只需要一条除权数据,但做成循环更好一些,拿出每条除权数据去计算。里面再嵌套K线数据的字段循环,完成所有字段的前复权处理:
for key,val in ea.iterrows(): date = key - datetime.timedelta(days=1) for field in df.columns.values: if field != 'volume' and field != 'amount': df.ix[date:,field] -= val.bonus/10 df.ix[date:,field] += val.price*(val.rationed/10) df.ix[date:,field] /= 1 + val.present/10 + val.rationed/10
PS:交易量和交易金额不需要做复权,所以加了个判断排除掉。后复权公式有点不同,但方法是类似的,方法上需要注意的就是时间切片这个问题。另外我喜欢用数据倒序使用,所以在前复权时key需要减一天,如果是正序是不用的。另在动态的情况下,对于除权数据的切片可以使用K线数据的头尾日期去切片,切完之后再做处理节约计算机资源。