疯人院里的快乐时光

疯,不为常规所度测……

用Pandas计算前复权数据

得到大智慧的除权数据琢磨了好些日子,最后发现还是用Pandas来解决是最便捷的,后复权还没做,先在这里做个笔记,备忘。

以股票600725为例,除权数据赋予变量ea,数据为dataframe格式,结构如下:

            present  bonus  price  rationed
date                                       
2016-12-28     10.0   0.00    0.0       0.0
2012-06-04      0.0   0.50    0.0       0.0
2011-05-20      0.0   1.00    0.0       0.0
2010-05-13      8.0   0.23    0.0       0.0
2009-05-15      0.0   2.00    0.0       0.0
2008-04-09      0.0   3.00    0.0       0.0
2007-04-12      0.0   1.00    0.0       0.0
2006-05-22      0.0   1.00    0.0       0.0
2006-02-10      3.5   0.00    0.0       0.0
2005-03-28      5.0   0.50    0.0       0.0
2003-03-26      0.0   2.00    0.0       0.0
2002-04-15      0.0   2.00    0.0       0.0
1997-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  rationed
date                                       
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线数据的头尾日期去切片,切完之后再做处理节约计算机资源。

点赞