matlab 复权数据,用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线数据的头尾日期去切片,切完之后再做处理节约计算机资源。

计算复权数据时,需要考虑到股票的拆股和送股情况。下面是一个示例代码,用于计算复权数据: ```python import pandas as pd def calculate_adjusted_close(original_close, split_ratio, dividend_ratio): adjusted_close = original_close * split_ratio / dividend_ratio return adjusted_close def calculate_forward_adjustment_factor(split_ratios): forward_adjustment_factor = split_ratios.cumprod() return forward_adjustment_factor def calculate_backward_adjustment_factor(split_ratios): backward_adjustment_factor = 1 / calculate_forward_adjustment_factor(split_ratios[::-1])[::-1] return backward_adjustment_factor def calculate_forward_adjusted_data(original_data): split_ratios = original_data['Split Ratio'].fillna(1) dividend_ratios = original_data['Dividend Ratio'].fillna(1) forward_adjustment_factor = calculate_forward_adjustment_factor(split_ratios) original_close = original_data['Close'] forward_adjusted_close = calculate_adjusted_close(original_close, forward_adjustment_factor, dividend_ratios) forward_adjusted_data = original_data.copy() forward_adjusted_data['Close'] = forward_adjusted_close return forward_adjusted_data def calculate_backward_adjusted_data(original_data): split_ratios = original_data['Split Ratio'].fillna(1) dividend_ratios = original_data['Dividend Ratio'].fillna(1) backward_adjustment_factor = calculate_backward_adjustment_factor(split_ratios) original_close = original_data['Close'] backward_adjusted_close = calculate_adjusted_close(original_close, backward_adjustment_factor, dividend_ratios) backward_adjusted_data = original_data.copy() backward_adjusted_data['Close'] = backward_adjusted_close return backward_adjusted_data # 示例用法 original_data = pd.read_csv('original_data.csv') forward_adjusted_data = calculate_forward_adjusted_data(original_data) backward_adjusted_data = calculate_backward_adjusted_data(original_data) ``` 在上面的代码中,我们使用了 `pandas` 库来处理数据。假设原始数据包含以下列:日期(Date)、收盘价(Close)、拆股比例(Split Ratio)和送股比例(Dividend Ratio)。 `calculate_adjusted_close` 函数用于计算调整后的收盘价。`calculate_forward_adjustment_factor` 函数用于计算复权因子,即拆股和送股比例的累积乘积。`calculate_backward_adjustment_factor` 函数用于计算复权因子,即复权因子的倒数。 `calculate_forward_adjusted_data` 函数使用复权因子和分红比例来计算复权数据。`calculate_backward_adjusted_data` 函数使用后复权因子来计算复权数据。 请注意,上述代码仅为示例,实际使用时需要根据具体数据格式和需求进行适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值