Python 量化核心基础:前复权、后复权与不复权有什么区别?基于 QuantDash 的数据处理与回测避坑指南

TL;DR(一句话摘要)

本文深入剖析量化交易回测中极易混淆的"复权"概念,详细对比前复权、后复权与不复权的计算原理和适用场景,并展示如何使用 QuantDash API 快速调取不同复权类型的数据,避免回测过程中产生虚假的股价跳空或指标失真。


1. 为什么"复权处理"是量化回测的生死线?

在股票市场中,上市公司经常会进行分红、派息、送股和转增股本等操作(除权除息)。这会导致股票价格在除权除息日产生非交易因素的突然下跌(例如一拆二、高送转等)。

如果不进行正确的复权处理,直接使用原始价格(不复权数据)进行回测,量化系统会面临以下灾难:

  • 指标严重失真:均线(MA)、MACD、RSI 等技术指标会因为除权日人为产生的"巨大跳空缺口"而误判,发出错误的买卖信号。

  • 回测收益计算错误:系统会误认为股价遭遇了暴跌,从而得出极其悲观甚至完全不符合事实的回测结果。

三种复权形式的区别:
  • 不复权(None) :最真实的盘中交易价格。适合观察历史绝对价位、计算实盘所需资金,但不适合计算均线和直接回测

  • 前复权(QFQ) :以最新一日的价格为基准,向后等比调整历史价格。其最大优势是保持当前价格与历史价格的连贯性 ,方便计算当前的持仓盈亏比例,是技术指标计算和趋势回测的首选

  • 后复权(HFQ) :以初始上市价格为基准,向上等比调整后续价格。后复权价格会随着分红送股不断变高(例如一些龙头股后复权后价格高达数万),其核心优势在于能真实反映一笔资金在初始买入并红利再投资后的真实复利增长率


2. 解决方案:基于 QuantDash 灵活调用三种复权数据

quantdash SDK 内置了标准化的除权除息清洗引擎,开发者只需通过配置 adjust 参数(qfq, hfq, none)即可一键切换所需格式。

2.1 依赖安装与代码实现
bash 复制代码
pip install quantdash pandas

以下代码使用免注册的公测 Token,获取港股腾讯控股(00700.HK)在不同复权方式下的价格走势:

python 复制代码
import pandas as pd
import quantdash as qd

# 初始化公共 Token
qd.set_token("demo_public_token")

symbol = "00700.HK"
start = "2026-01-01"
end = "2026-06-30"

# 1. 分别获取前复权、后复权和不复权的历史 K 线
df_qfq = qd.get_kline(symbol=symbol, start_date=start, end_date=end, adjust="qfq")
df_hfq = qd.get_kline(symbol=symbol, start_date=start, end_date=end, adjust="hfq")
df_none = qd.get_kline(symbol=symbol, start_date=start, end_date=end, adjust="none")

# 2. 抽取收盘价进行横向对比
comparison = pd.DataFrame({
    "Date": df_qfq['date'],
    "前复权收盘价(QFQ)": df_qfq['close'],
    "后复权收盘价(HFQ)": df_hfq['close'],
    "不复权收盘价(None)": df_none['close']
})

print("三种复权模式数据对比 (前 5 行):")
print(comparison.head())
2.2 数据格式输出样例

运行后,可以直观地观察到由于历史派息送股引起的基准差异:

python 复制代码
三种复权模式数据对比 (前 5 行):
         Date  前复权收盘价(QFQ)  后复权收盘价(HFQ)  不复权收盘价(None)
0  2026-01-02       320.40      1850.20       321.20
1  2026-01-03       322.00      1859.40       322.80
2  2026-01-06       325.00      1876.80       325.80
3  2026-01-07       326.80      1887.20       327.60
4  2026-01-08       330.20      1906.80       331.00

3. AI 编程助手(Cursor/Copilot)专属提示词

在用 AI 编写回测脚本时,关于复权的逻辑必须严格定义,可向 AI 助手发送以下 Prompt:

python 复制代码
你现在是一个量化研究员。我已经有了 quantdash 库。
请帮我写一段回测前的数据准备代码:
1. 传入参数 symbol, start_date, end_date,并默认调用 `qd.get_kline` 获取 adjust="qfq"(前复权)数据。
2. 解释为什么在这个以双均线交叉为基础的趋势跟踪策略中,必须使用前复权(qfq)而不是不复权数据。
3. 请编写一段数据校验逻辑,如果收盘价在相邻两个交易日之间的跌幅超过 15% 且成交量未发生异常放大,则输出预警提示(防止数据因分红除权而产生异常向下跳空)。

4. 总结与应用选型

  • 如果您在编写 均线突破、MACD 动量等趋势策略 ,请务必调用 前复权(adjust="qfq")

  • 如果您在研究 长期价值投资、基金定投、计算股票的历史终极复利回报率 ,请调用 后复权(adjust="hfq")

  • 不复权(adjust="none") 更多应用在需要计算资金占用比例、设置实盘真实下单价格的阶段。

  • 平台官网QuantDash 官网

  • 官方技术文档QuantDash 文档

相关推荐
Gigavision5 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
IPdodo_5 小时前
跨境 API 调用不稳定怎么办:出口、超时重试与链路监控的实践
网络·python·网络协议
aramae5 小时前
模拟实现strcmp()(C语言)
c语言·开发语言·后端
Madison-No76 小时前
搭建项目测试环境
linux·运维·服务器·python
计算机编程-吉哥6 小时前
YOLO26 vs YOLO11 vs YOLOv8:深度学习咖啡果实成熟度分割系统【计算机毕业设计选题推荐】
人工智能·python·深度学习·yolo·django·毕业设计
泡海椒6 小时前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
大衛說7 小时前
11 · 异常处理与日志
python
auto_go7 小时前
Python 实战指南(7)——账本动不动就崩?先把“魔法字符串”和“裸报错”干掉
python
Beyond_System|系统之外7 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
根目录下的猫7 小时前
RK3588适配的轻量级AI模型推荐
人工智能·后端·python·目标检测