跳转至

复权数据

为什么要复权

当公司进行分红、配股、拆股、回购等操作时,公司的股本结构会发生变化,这将直接影响其股票的交易价格。股票的复权是指对股票的历史交易数据进行调整,以反映公司的所有股本变动(如股息派发、配股、拆股和回购等)对股价的影响

假设某个股东持有该公司股票 100 股,在每 10 股转增 10 股后,原来的 100 股就会变成 200 股,但以公积金转增实际并不增加公司的总市值,因此假如原来每股价值 13 元,100 股总价值 1300 元,在除权后每股价值会变为 6.5 元,200 股价值 1300 元,转增后持有的股票数量增加 1 倍,但单张股票的价值变为原来的 ½,持有的股票总价值不变

分红也会造成股票价格下降,因为分红后公司的总资产减少,市值也应当相应减少

从上面这个例子可以看到,由于股票存在分红、配股、拆股、回购等事件,会导致股价出现较大的缺口,如果不进行复权处理,直接使用这些历史价格进行分析,可能会得到错误的结论。为了保证数据连贯性,需要使用复权的方法对价格序列进行调整

复权的方法及各自的优缺点

前复权

前复权是以最新的价格变动为基准,将所有历史数据按照这个基准进行调整

前复权的优点是最新复权价格与实际价格一致,因此很直观,也是各种行情软件默认的复权方式

但前复权也有缺点:

  • 由于前复权的方式在每次除权除息后,都需要根据最新的价格重新计算所有的历史数据,这会导致每次发生除权除息事件后,历史数值都会发生变化。由于需要反复调整历史数据,数据更新和维护的成本较高

  • 对于有持续分红的公司来说,前复权价可能出现负值

  • 前复权价格如果处理不当有使用未来数据的风险

后复权

后复权是以某一固定日期(通常为股票上市日期)的价格为基准,将此后的所有数据进行调整

后复权的优点是计算简单,一旦计算完成,后续的数据更新也方便,以前的后复权价格不会因为后面的除权除息事件而发生变动

但后复权价格和真实股票价格可能差别较大,尤其不适用于实盘

复权算法

需要注意的是,复权的算法有很多种,包括:经典算法、递归后复权法、递归前复权法、涨跌幅复权法等等,不同平台、不同数据源由于复权算法不同,导致复权数据存在差异,而且除权次数越多,差异越明显

如何计算复权

复权价格的计算公式为:

后复权价格 = 当日不复权价格 × 当日复权因子

前复权价格 = 当日不复权价格 × 当日复权因子 / 最新复权因子

示例代码:

# 导入需要的库
import pandas as pd
import tushare as ts

# 初始化数据接口并设置token,token在个人主页获取
# 注意:下面语句中的token要更换为你个人的token字符串
pro = ts.pro_api(token)

# 获取平安银行(000001)不复权的行情数据,数据的时间范围从2023年6月12日至2023年6月20日
price_df = pro.daily(ts_code='000001.SZ', start_date='20230612', end_date='20230620').set_index('trade_date')

# 获取平安银行(000001)的复权因子
adj_factor_df = pro.adj_factor(ts_code='000001.SZ', trade_date='').set_index('trade_date')

# 将不复权的收盘价和复权因子放在一个DataFrame数据表中
df = pd.DataFrame()
df['收盘价_不复权'] = price_df['close']
df['复权因子'] = adj_factor_df['adj_factor']

# 计算复权后的收盘价
df['收盘价_后复权'] = df['收盘价_不复权'] * df['复权因子']
df['收盘价_前复权'] = df['收盘价_不复权'] * df['复权因子'] / df['复权因子'].iloc[-1]

在量化投资中使用哪种复权数据

在量化投资中应根据具体情况来选择复权数据:

  1. 进行数据存储和更新时

当需要采集和存储行情数据时,应该用前复权价格、后复权价格还是不复权价格?

用前复权价格并不是一个好的方案,因为每次发生除权除息事件后否需要重新计算历史的前复权价格,数据更新和维护很麻烦

用后复权价格虽然没有重新计算历史数据的问题,但后复权价格跟实际价格往往相差巨大,也不是一个好选择

比较好的方案是存储不复权的价格,并同时存储复权因子,这样数据更新时不用修改历史数据,而且通过复权因子可以很方便的计算出前复权价格和后复权价格

  1. 进行数据分析和策略回测时

在进行数据分析和策略回测时,通常使用后复权价格,这是因为:

1)当回溯的时间很长时,前复权价格可能会出现负值的情况

2)如果需要对结果数据进行存储和定期更新,比如有一个需要定期更新的因子库,那么采用后复权价格更易于维护,因为前复权价格在发生除权除息时要重新计算所有历史数据,相应的因子值也要重新计算,更新和维护因子库的成本高

3)前复权价格处理不当有使用未来数据的风险

  1. 在实盘时

实盘中进行数据运算时应该使用前复权价格,因为后复权价格可能跟实际价格相差巨大,不适合实盘操作