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

相关推荐
Chester_19999 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
DeepVisionary10 小时前
谷歌 Gemini Omni 1.1 Flash 正式发布:4K 视频、40 秒场景延伸,视频生成进入按 token 计费时代
python·自动化
阡之尘埃10 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
海兰10 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
EXI-小洲10 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
cvcode_study10 小时前
Ollama+ComfyUI 多模态
大数据·人工智能·python
会周易的程序员11 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导11 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan11 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_6952514911 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt