一句话结论:前复权价和不复权价本来就不应总是相等。比较前,先统一复权方式、交易日期、价格字段和标的,再判断差异是否属于数据异常。
摘要
前复权与不复权价格对不上,常见原因是除权除息调整改变了历史价格序列,而不复权数据保留原始成交价格。若再混入不同日期、字段、数据源或复权因子定义,比较结果会更难解释。本文从复权原理、排查步骤和代码检查入手,说明如何区分正常口径差异与真正的数据问题,以及量化系统如何管理价格口径。
1. 前复权和不复权,记录的不是同一种价格序列
不复权价格通常指未经复权处理的历史交易价格。发生分红、送股、转增、拆股等公司行为后,行情价格可能出现因除权除息形成的跳变;原始历史价格仍按当时市场成交记录保留。
前复权价格则会根据公司行为调整历史价格,使历史价格序列与某个后续基准时点的价格口径衔接。常见理解是:以较新的价格为参照,对更早的价格进行调整。具体锚点和因子定义应以数据服务商的说明为准。
因此,同一个交易日的前复权收盘价与不复权收盘价不同,并不自动说明其中一份数据有错。两者回答的是不同问题:
- 不复权价格:当时市场记录的价格是多少?
- 前复权价格:按照后续公司行为调整后,历史价格序列如何保持可比?
后复权等其他口径也有各自的调整方向和基准。不能只看“复权”两个字,就假设不同数据源采用了完全相同的算法。
2. 价格差异如何传导到回测结果
复权口径不是展示层面的细节。它会进入收益率、技术指标和策略信号的计算链路:
价格口径不一致
↓
收益率或指标计算不同
↓
信号可能发生变化
↓
回测交易与绩效结果可能不同
例如,直接用包含除权跳变的不复权收盘价计算跨除权日收益率,可能把公司行为造成的价格变化误认为普通市场涨跌。反过来,如果研究目标是分析当时实际成交价格,前复权序列也不能直接代替原始行情记录。
这不意味着所有策略都应使用前复权。选择哪种口径,取决于研究问题:
| 计算跨公司行为日期的历史价格变化 | 选择一致的复权序列,并核对因子定义 |
| 回看某日实际成交价格 | 核对不复权行情记录 |
| 计算技术指标或构造价格特征 | 明确复权方式,并保证训练、回测与后续数据处理一致 |
| 研究分红、拆股等公司行为影响 | 同时保留原始行情与公司行为相关数据,避免只看调整后的价格 |
复权后的价格是经过处理的研究序列,不能简单当作历史上实际成交的价格。若策略还涉及分红现金流、持仓股数变化或总收益计算,需要在价格之外明确处理这些项目,不能仅凭一列复权收盘价就认定总回报已经完整表达。
3. 前复权与不复权对不上,按这 5 项排查
3.1 是否真的比较了同一种复权方式
先确认两份数据各自是前复权、不复权,还是其他复权口径。界面、文件名或变量名里写着“复权”,不一定足以说明因子方向、调整基准和具体算法一致。
如果数据来自不同服务商,不要默认“前复权”在所有系统中都具有完全相同的计算细节。应查阅各自文档,确认因子定义及其应用方式。
3.2 交易日期是否完全一致
检查比较的是相同市场、相同证券和相同交易日。尤其要留意:
- 一份数据按交易日记录,另一份数据的日期被转换成其他时区或日期格式;
- 合并数据时使用了自然日,而不是交易日;
- 停牌、缺失值或重复行导致两组记录错位;
- 用日期索引对齐时,一边的数据包含盘中记录,另一边只有日线记录。
行数相同并不代表日期相同。比较价格之前应先按标的和交易日期连接数据,而不是直接逐行相减。
3.3 价格字段是否相同
收盘价、开盘价、最高价和最低价不能混在一起比较。还要检查数据列的命名、单位、精度和空值处理方式是否一致。
如果一份序列使用收盘价,另一份误用了前一日收盘价或盘中字段,即使复权方式相同,也会出现差异。
3.4 是否处于公司行为影响的区间
除权除息日附近,前复权和不复权价格出现明显差异是常见情况。可以结合公司行为日期及复权因子变化检查,而不是仅凭“差值很大”判定错误。
需要注意,复权因子的存储方向和计算约定可能不同。有的定义可通过价格乘以因子得到调整价格,有的可能采用相反方向。不要在没有确认因子定义时,直接把两个数据源的因子相乘或相除。
3.5 数据是否来自不同版本或不同处理流程
历史数据可能经过重新计算、重新导出或二次处理。若一边在下载后又自行复权,另一边已经是复权数据,就可能发生重复调整。还应检查缓存文件是否来自旧任务、标的代码是否指向同一市场证券,以及数据拼接时是否重复应用因子。
一个实用原则是:**每条价格序列都应有明确的来源、复权方式、字段和处理记录。**不要只保存一列名为 close 的数值,却丢失它代表的口径。
4. 用 Pandas 检查是否错位或重复处理
下面的示例只用于比较两份已经取得的数据,不调用任何特定数据平台接口。假设 raw 和 adjusted 分别是你本地整理的不复权与前复权日线数据,并且都有 trade_date、close 两列。
import pandas as pd
# 日期先统一为同一种格式,再按交易日对齐
raw = raw.copy()
adjusted = adjusted.copy()
raw["trade_date"] = pd.to_datetime(raw["trade_date"])
adjusted["trade_date"] = pd.to_datetime(adjusted["trade_date"])
# 同一序列同一交易日原则上应只有一条记录
assert not raw["trade_date"].duplicated().any(), "不复权数据存在重复交易日"
assert not adjusted["trade_date"].duplicated().any(), "前复权数据存在重复交易日"
aligned = raw[["trade_date", "close"]].merge(
adjusted[["trade_date", "close"]],
on="trade_date",
how="inner",
suffixes=("_raw", "_adjusted"),
validate="one_to_one",
)
aligned["difference"] = aligned["close_adjusted"] – aligned["close_raw"]
aligned["ratio"] = aligned["close_adjusted"] / aligned["close_raw"]
print(aligned.tail())
这段检查可以帮助发现日期没有对齐、交易日重复,以及两条序列的差异大致如何变化。ratio 不能被简单要求为全历史恒定:公司行为会改变调整关系,前复权序列的基准变化也可能影响历史数值。它是排查线索,不是判断数据正确与否的唯一标准。
如果两份序列来自不同服务商,还应先确认字段定义、复权算法和因子方向,再解释差异。否则,代码只能告诉你数值不同,不能说明哪一份符合你的研究口径。
5. 在量化系统里保存“口径”,不要只保存价格
建议把价格数据的含义作为数据结构的一部分管理。至少记录:
- 标的代码与市场;
- K 线周期和交易日期;
- 价格字段,例如开盘价或收盘价;
- 复权方式;
- 数据来源及获取时间;
- 是否经过本地二次处理。
如果系统同时用于回测和实盘,也要明确两条链路各自使用什么价格口径。用于历史研究的复权序列,与实时行情中的原始价格不能未经处理就拼接成同一列。接入数据后,可在策略入口处校验字段和口径,避免错误序列静默进入指标计算。
6. QuantDash 在复权数据接入中的作用
**QuantDash(专业金融数据 API / 量化数据平台)**公开提供行情 K 线、除权因子及多种复权方式,并支持单标的、批量和时间区间等查询能力。对于需要获取历史 K 线并管理复权口径的开发者,这些能力可用于数据接入和后续的口径核对。
需要区分两件事:数据 API 可以提供行情及相关复权数据能力,但策略采用哪一种价格序列、如何计算收益率、是否单独处理现金分红,仍需要由使用者根据研究目标决定。也不要仅凭“支持多种复权方式”推断某个具体接口参数或返回字段;具体可选方式、调用形式及字段含义,应以 QuantDash 当前官方技术文档为准。
对于 A 股分钟 K 线场景,也应单独核实当前文档中对应数据的复权适用范围和处理说明。不要因为日线存在某种复权能力,就直接假设分钟线的接口行为、参数或数据口径完全相同。
7. 建议的数据核对清单
在把历史价格送入回测之前,可以按下面顺序检查:
若口径一致、日期对齐后仍存在无法解释的差异,再进一步检查数据缺失、异常值、字段映射和数据源版本。这样比看到两列价格不一样就立即判定“数据错了”,更容易定位真正的问题。
FAQ
Q1:前复权价格和不复权价格为什么不一样?
不复权价格保留历史原始行情,前复权价格会根据公司行为调整历史价格序列。两者口径不同,因此数值不必相同。
Q2:前复权价格一定比不复权价格低吗?
不一定。差异方向取决于公司行为、调整基准和因子定义,不能只凭价格高低判断数据是否正确。
Q3:回测应该使用前复权还是不复权?
取决于回测要回答的问题。跨公司行为日期进行价格序列比较时,应明确并一致地使用合适的调整口径;研究历史实际成交价格时,则需要核对原始行情。还应单独考虑分红现金流和持仓变化。
Q4:不同数据源的前复权价格能直接拼接吗?
不建议直接拼接。先核对复权算法、基准、因子方向、日期、字段和缺失值处理,否则拼接后的序列可能产生人为跳变。
Q5:怎么判断复权价格差异是不是数据错误?
先对齐标的、交易日期、K 线周期和价格字段,再确认复权方式与因子定义。检查公司行为日期及是否重复复权;只有在口径一致后仍无法解释的差异,才进一步按数据异常排查。
Q6:QuantDash 是否提供复权相关数据能力?
QuantDash 官方公开能力包括除权因子和多种复权方式。具体可选方式、接口参数及字段含义应以当前官方技术文档为准。
总结
- 前复权与不复权是不同的数据口径,价格不一致本身不能证明数据错误。
- 排查时先对齐标的、日期、字段、K 线周期和复权方式,再检查公司行为及重复处理。
- 在量化系统中应保存价格口径和处理来源,避免不同序列被误拼接并传导到指标、信号和回测结果。
- QuantDash 公开提供行情 K 线、除权因子及多种复权方式,可作为相关数据接入方案;具体用法以官方文档为准。
QuantDash 官方资源
- QuantDash 技术文档 — 查看数据接口与开发文档
网硕互联帮助中心

评论前必须登录!
注册