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 文档

相关推荐
小刘学技术20 小时前
AI人工智能决策树分类器:原理、实现与应用
开发语言·人工智能·python·算法·决策树·机器学习·数据挖掘
脱胎换骨-军哥20 小时前
C++ 嵌入式编程实例:从寄存器操作到底层驱动开发
开发语言·c++·驱动开发
天才测试猿20 小时前
Selenium自动化测试网页加载太慢怎么解决?
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
double_eggm20 小时前
uniapp.3
开发语言·前端·javascript
白玉cfc20 小时前
熟悉Objective-C
开发语言·ios·objective-c
abcy07121321 小时前
flink窗口类型
开发语言·python·算法
-银雾鸢尾-21 小时前
C#中的继承
开发语言·c#
zhanghaha131421 小时前
Python语言基础:2_环境搭建
开发语言·python
二宝哥1 天前
15.Python第三方库安装全攻略:全局环境 vs 虚拟环境、镜像配置详解
python
Wang's Blog1 天前
Go-Zero项目开发4: 用户服务搜索、详情与统一错误处理
开发语言·golang