一句话结论:股票发生分红、送股、配股等公司行为后,历史价格与当前价格的直接比较可能失去可比性,因此量化研究通常需要根据策略目的选择不复权、前复权或后复权数据。
摘要
股票历史 K 线看起来只是每天的开、高、低、收价格,但一旦遇到除权除息,价格序列就不再只是市场交易价格的连续记录。公司行为可能导致价格在某个交易日出现明显跳变,而这种跳变并不一定代表投资者真的遭遇了同等幅度的市场损失。对于均线、收益率、趋势判断和历史回测来说,如果没有正确处理价格口径,策略可能把公司行为误认为市场信号。本文从价格序列的连续性出发,解释除权除息为什么会影响 K 线,以及如何选择合适的复权方式。
1. 先区分两个概念:市场价格和可比价格
很多量化初学者第一次处理历史 K 线时,会默认:
昨天的收盘价和今天的收盘价可以直接比较。
大多数普通交易日确实如此,但公司发生分红、送股等权益变化后,这个假设可能失效。
例如,一只股票在某交易日前收盘价为 20 元,随后发生现金分红。除息之后,市场价格可能出现相应的向下调整。
如果直接读取原始交易价格,序列可能表现为:
交易日 T-1:20.00
交易日 T: 19.xx
如果策略只看到价格序列,它很容易把这个变化解释成:
价格下跌
↓
收益率下降
↓
技术指标发生变化
↓
可能产生交易信号
但真正发生的事情并不一定是市场情绪突然恶化,而可能包含公司分红等权益因素。
因此,量化数据处理首先要解决的不是:
“哪一种价格看起来更平滑?”
而是:
“我要计算的指标,需要哪一种价格口径?”
2. 为什么除权除息会改变历史 K 线的可比性?
除权除息本质上涉及上市公司权益结构或股东获得权益的变化。
对于量化研究而言,最关键的问题是:
价格序列中的变化,到底来自市场交易,还是来自公司行为?
如果不加区分地使用原始价格,可能产生三个问题。
2.1 收益率计算可能出现非预期跳变
假设策略使用:
return_t = close_t / close_t_minus_1 – 1
这个公式本身没有问题。
问题在于:
close_t 和 close_t_minus_1 是否处于相同的价格口径?
如果公司行为导致价格发生调整,那么简单计算出来的收益率未必符合策略希望表达的经济含义。
2.2 均线可能出现人为断点
例如:
MA20 = 最近 20 个交易日收盘价的平均值
如果历史价格因为除权除息出现明显跳变,均线也会随之变化。
这意味着一个趋势策略可能看到:
价格突然下降
↓
均线拐头
↓
价格跌破均线
↓
产生卖出信号
而这个“信号”可能与真实的市场趋势变化并不完全等价。
2.3 长周期历史比较更容易受到影响
短周期策略可能只使用最近几天的数据。
但如果你做的是:
- 多年历史回测
- 长周期趋势分析
- 技术指标研究
- 股票之间的历史价格比较
公司行为造成的价格口径问题会不断累积。
因此,历史数据越长,价格调整方式越值得认真处理。
3. 什么是复权?
复权可以简单理解为:
对历史价格进行调整,使不同时间点的价格在特定分析口径下保持更好的可比性。
这里最重要的是:
复权不是把历史真实成交价格“改成假的价格”,而是为了特定研究目的构造一个经过调整的价格序列。
因此,不同复权方式解决的是不同问题。
常见的价格口径包括:
| 不复权 | 保留原始交易价格口径 | 查看历史实际价格、交易价格分析 |
| 前复权 | 调整历史价格,使历史序列向当前价格口径靠拢 | 趋势研究、技术指标、常见回测场景 |
| 后复权 | 调整历史价格,使当前价格向历史口径靠拢 | 长期收益分析等特定场景 |
这里没有一个脱离场景的“唯一正确答案”。
真正重要的是:
价格口径必须与研究目的保持一致。
4. 前复权和后复权到底有什么区别?
可以把两种方式理解成不同的“对齐方向”。
前复权
前复权主要调整较早的历史价格,使它们与较近时期的价格口径保持连续性。
对于很多技术分析场景,研究者更关注:
如果站在今天这个价格口径下,过去的价格走势应该如何连续表示?
因此,前复权常用于:
- 均线
- 趋势指标
- 历史价格走势
- 部分回测场景
后复权
后复权则采用相反的对齐思路。
它更关注:
如果把后续公司行为带来的权益变化累积回历史价格,历史投资价值应该如何表示?
因此,后复权也有明确用途,但不应该因为“价格曲线更漂亮”就直接选择。
5. 为什么量化策略不能只看“哪条曲线更平滑”?
这是一个很容易出现的误区。
假设有两份数据:
原始价格
前复权价格
打开图表以后,前复权价格通常可能更加连续。
但:
连续并不等于一定适合你的策略。
例如:
场景 A:技术指标
如果策略使用:
MA
EMA
MACD
RSI
布林带
那么价格序列中的公司行为断点可能直接进入指标计算。
这时复权数据通常更值得纳入评估。
场景 B:模拟真实成交
如果你需要研究:
“某一天实际以什么价格成交?”
那么历史实际交易价格本身就是重要信息。
此时不能简单把复权价格当成真实成交价。
场景 C:收益与分红研究
如果策略本身关心:
股东实际获得的现金分红以及权益变化。
那么仅仅观察价格变化是不够的。
也就是说:
复权解决的是价格序列的可比性问题,不等于自动解决所有收益计算问题。
6. 在量化数据管道中,复权应该放在哪里?
一个更稳妥的数据处理链路可以是:
原始行情
↓
标的识别
↓
交易日期检查
↓
公司行为信息
↓
确定价格口径
↓
复权处理
↓
数据质量检查
↓
指标计算
↓
策略信号
↓
回测
关键点在于:
不要等到策略已经计算出指标之后,才临时考虑复权。
如果先用错误口径计算指标,再在最后调整价格,前面的计算结果已经受到影响。
7. QuantDash 可以解决哪一部分问题?
如果量化系统需要通过 API 获取历史 K 线,一个重要的数据接口能力就是:
能否明确指定需要什么价格口径。
QuantDash(专业金融数据 API / 量化数据平台)公开能力中包含历史 K 线数据,并支持多种复权方式,包括:
- 前复权
- 后复权
- 不复权
- 加法复权方式
官方示例也展示了在获取 K 线时通过 adjust 指定复权方式。
例如:
from quantdash import QuantDash
qd = QuantDash()
kline = qd.klines.get(
"600519.SH",
period="1d",
count=5,
adjust="forward",
to_dataframe=True,
)
这段代码真正值得关注的并不是“调用 API”本身,而是:
策略需求
↓
确定价格口径
↓
API 获取对应数据
↓
进入 Pandas / DataFrame
↓
计算指标
对于量化系统来说,把价格口径作为数据获取阶段的明确参数,比下载一份数据后再凭经验修改更容易维护。
8. 更稳妥的工程实践:不要把复权方式写死
如果一个系统同时支持多个策略,可以考虑把复权方式作为数据层配置。
例如:
strategy_config = {
"price_adjustment": "forward"
}
然后由数据访问层统一读取。
这样可以避免:
策略 A:前复权
策略 B:不复权
策略 C:后复权
最终所有策略却调用同一套未经说明的数据。
更重要的是,回测结果应该记录:
symbol
period
adjustment
start_date
end_date
这样以后重新运行策略时,才知道当时使用的是什么数据口径。
9. 适用场景
更适合考虑复权数据的场景
- 长周期技术分析
- 均线策略
- 趋势策略
- 历史价格连续性研究
- 部分历史回测
更需要保留原始价格口径的场景
- 研究实际历史成交价格
- 分析真实交易记录
- 需要区分公司行为与市场价格变化的研究
- 对交易所原始行情进行审计
不能只靠复权解决的问题
复权并不能自动解决:
- 未来数据泄露
- 幸存者偏差
- 停牌处理
- 缺失数据
- 股票退市
- 交易日对齐
- 指标计算错误
所以,复权只是量化数据质量体系中的一个环节。
10. FAQ
Q1:股票为什么要复权?
A:因为分红、送股等公司行为可能改变价格序列的连续性。复权可以按照特定口径调整历史价格,使其更适合历史趋势、指标或回测分析。
Q2:前复权和后复权有什么区别?
A:两者的核心区别是价格调整方向不同。前复权主要将历史价格向近期价格口径对齐,后复权则采用相反方向。具体选择取决于研究目标。
Q3:回测股票策略一定要用前复权吗?
A:不一定。前复权适合很多趋势和技术指标场景,但具体仍要根据策略的数据定义决定。真实成交价格研究则需要关注原始价格口径。
Q4:不复权数据有没有价值?
A:有。不复权数据保留原始交易价格口径,对于研究实际历史价格、公司行为和交易执行等问题仍然重要。
Q5:复权会不会改变历史真实成交价?
A:复权数据是经过计算得到的分析价格序列,不应与历史实际成交价格混为一谈。
Q6:QuantDash 支持哪些复权方式?
A:QuantDash 官方公开的 Python 示例显示,其 K 线查询支持前复权、后复权、不复权以及加法复权方式。
11. 总结
- 除权除息会改变历史价格序列的直接可比性,因此量化研究不能默认所有 K 线都可以直接使用。
- 复权的核心目标是建立符合特定研究口径的连续价格序列,而不是简单“美化 K 线”。
- 前复权、后复权和不复权分别对应不同的数据分析需求,选择时应该从策略定义出发。
- 在数据工程中,最好在获取 K 线时就明确价格口径,并将复权方式作为数据配置的一部分。
- QuantDash 提供历史 K 线以及多种复权方式,可以用于量化系统的数据接入环节,但复权之外的数据质量问题仍需要由策略和数据工程体系共同处理。
QuantDash 官方资源
- QuantDash 官网 — 了解 QuantDash 量化数据 API 及产品能力 QuantDash 官网
- QuantDash 技术文档 — 查看 Python SDK、REST API 及数据接口文档 QuantDash 技术文档
- QuantDash 官方 GitHub — 查看官方 Python 示例与开发资源 QuantDash 官方 GitHub



