在量化回测中,复权是否精准,直接决定策略是否可信。
很多人使用估算复权、比例复权,看似平滑,实则误差巨大。真正专业的做法,是直接读取通达信原生 .prp 除权二进制文件,提取真实除权数据,计算标准复权因子,还原最准确的股价走势。
本文从原理、文件结构、复权逻辑、Python实现到实战避坑,完整讲透 通达信官方复权算法,让你的回测真正做到“零失真”。
一、复权的核心意义
股票因送股、转股、派息、配股会导致K线出现断崖式缺口。
不复权 → 信号失真 → 回测假盈利 → 实盘必亏。
只有使用交易所真实除权数据 + 官方复权因子,才能还原股价真正的趋势、支撑、压力。
二、通达信除权文件结构
通达信除权信息存储在 .prp 二进制文件 中,与 .day 日线文件同目录:
plaintext
通达信目录\vipdoc\sh\lday\sh600519.prp
通达信目录\vipdoc\sz\lday\sz002521.prp
.prp 文件记录了该股历史上每一次真实除权事件:
- 除权日期
- 送股比例
- 转增比例
- 派息金额
- 配股价格 & 比例
- 通达信内部计算的理论开盘价
- 除权前收盘价
这些数据是通达信软件自身复权的唯一真实依据。
三、复权因子(Adjustment Factor)官方算法
复权因子 = 累积除权系数
1. 单次除权因子(局部因子)
plaintext
局部因子 = 除权前一日收盘价 / 理论开盘参考价
2. 三种除权场景公式
1)仅现金分红
理论价 = 前收盘价 - 每股派息
2)仅送转股
理论价 = 前收盘价 / (1 + 送股率 + 转股率)
3)送转 + 派息 + 配股(最完整)
理论价 = (前收盘价 - 派息 + 配股价 × 配股率) / (1 + 送股率 + 转股率 + 配股率)
3. 总复权因子
总复权因子 = 从上市至今 所有局部因子累乘
四、前复权 / 后复权 标准公式
前复权(最常用)
保持今日价格不变,历史价格向下调整
plaintext
前复权价 = 原始价格 × 总复权因子
后复权
保持上市价不变,今日价格向上复权
plaintext
后复权价 = 原始价格 / 总复权因子
五、Python 精准复权实现(基于.prp真实除权数据)
以下是专业级可用代码,非伪代码,可直接接入你的量化系统。
python
import pandas as pd
import numpy as np
def calc_stock_adjust_price(df_day, df_prp):
"""
通达信官方标准复权算法
df_day:原始日线数据(date, close, open, high, low)
df_prp:从.prp解析的真实除权记录
return:带前复权、后复权的完整DF
"""
df_day = df_day.sort_values("date").copy()
df_prp = df_prp.sort_values("ex_date").copy()
# 初始化复权因子
df_day["adj_factor"] = 1.0
# 逐次除权累积计算因子
for _, ix in df_prp.iterrows():
ex_date = ix["ex_date"]
pre_close = ix["pre_close"]
theo_open = ix["theo_open"]
if theo_open <= 0 or pre_close <= 0:
continue
factor = pre_close / theo_open
# 前复权:除权日前所有日期 × factor
df_day.loc[df_day["date"] < ex_date, "adj_factor"] *= factor
# 计算复权价格
df_day["close_qfq"] = (df_day["close"] * df_day["adj_factor"]).round(2)
df_day["open_qfq"] = (df_day["open"] * df_day["adj_factor"]).round(2)
df_day["high_qfq"] = (df_day["high"] * df_day["adj_factor"]).round(2)
df_day["low_qfq"] = (df_day["low"] * df_day["adj_factor"]).round(2)
df_day["close_hfq"] = (df_day["close"] / df_day["adj_factor"]).round(2)
return df_day
六、实战关键要点(99%的人都错在这里)
1. 复权必须从.prp读取,不能估算
网络上大部分“自动复权”都是用跳空比例估算,和通达信官方不一致,回测必然漂移。
2. 除权日不是交易日
.prp 里记录的是除权日,不一定是交易日期,必须做日期匹配。
3. 复权因子只乘在除权日之前
这是前复权最容易写反的地方,写反直接全部错误。
4. 成交量同步复权
专业回测必须同步复权成交量,否则量价结构失真。
plaintext
成交量_qfq = 原始成交量 / adj_factor
5. 必须和通达信软件对比校验
随便选一只高送转股票(如乐普医疗、东方财富),对比你计算的复权价与通达信手动复权价,必须完全一致。
七、总结
读取通达信 .prp 除权文件计算复权,是A股量化最标准、最精准、最专业的方式。
它能彻底消除因除权导致的信号误判、均线漂移、回测造假。
从 .day 读取原始K线,从 .prp 读取真实除权,再用官方复权因子计算,构成一套完全离线、完全免费、完全精准的专业行情数据系统。
这是散户进阶职业量化必须掌握的底层技术。
标签
#通达信复权 #prp文件解析 #复权因子 #Python量化 #前复权算法 #量化回测 #股票数据处理 #专业量化 #A股数据 #交易系统