问题描述
我的理解是在只有派息的情况下前复权系数的计算公式是:
factor = (收盘价 - 每股派息) / 收盘价
以 000607.XSHE 在 2019年7月19派息为例计算:
收盘价价4.8
每10股派0.11
我自己计算的复权系数应该是:(4.8 - 0.011) / 4.8 = 0.997708
但是get_price() API给出来这一天的复权系数却是 0.997921,这个差别远大于浮点数计算误差了。
我哪里计算错了?
notebook中有完整的代码
解决方案
您好!您计算前复权系数的思路大体是正确的,但使用的数据基准价格出现了偏差。导致您手动计算结果与 get_price() API 返回结果不一致的核心原因在于:复权系数的计算基准应该是“股权登记日的收盘价”(即除权除息日的前一交易日收盘价),而不是除权除息日当天的收盘价。
正确的前复权系数计算公式
在仅有现金分红(派息)的情况下,前复权因子的计算公式为:
前复权因子 = (股权登记日收盘价 - 每股派息) / 股权登记日收盘价
您的计算误差分析
在您的计算中:
- 您使用的收盘价是
4.8,这很可能是除权除息日当天的收盘价,或者是除息后的某个价格。 - 实际上,根据 API 返回的复权因子
0.997921和每股派息0.011元,我们可以反推股权登记日(即派息前一个交易日)的收盘价:
股权登记日收盘价 = 0.011 / (1 - 0.997921) ≈ 5.29 元
也就是说,000607.XSHE 在 2019年7月19日(除权除息日)的前一个交易日(股权登记日),其收盘价应该是 5.29 元左右。使用 5.29 元代入公式:
(5.29 - 0.011) / 5.29 ≈ 0.9979206,四舍五入后正好是 API 返回的 0.997921。
如何在 JoinQuant 中验证
您可以使用 JoinQuant 的 API 获取前一交易日的收盘价(pre_close)来进行验证。示例代码如下:
import jqdata
# 获取除权除息日当天的行情数据,包含前收盘价(即股权登记日收盘价)
df = get_price('000607.XSHE', start_date='2019-07-19', end_date='2019-07-19', fields=['pre_close', 'factor'], fq='pre')
pre_close = df['pre_close'][0] # 获取前收盘价
factor_api = df['factor'][0] # 获取API提供的复权因子
# 每股派息
dividend_per_share = 0.011
# 手动计算复权因子
factor_manual = (pre_close - dividend_per_share) / pre_close
print("股权登记日收盘价 (pre_close):", pre_close)
print("API 返回的复权因子:", factor_api)
print("手动计算的复权因子:", factor_manual)
总结: 计算复权因子时,请务必使用**除权除息日的前一交易日收盘价(pre_close)**作为分母和被减数,这样就能与系统提供的复权因子完全对上了。