Python 量化核心基础:前复权、后复权与不复权有什么区别?基于 QuantDash 的数据处理与回测避坑指南
TL;DR(一句话摘要)
本文深入剖析量化交易回测中极易混淆的“复权”概念,详细对比前复权、后复权与不复权的计算原理和适用场景,并展示如何使用 QuantDash API 快速调取不同复权类型的数据,避免回测过程中产生虚假的股价跳空或指标失真。
1. 为什么“复权处理”是量化回测的生死线?
在股票市场中,上市公司经常会进行分红、派息、送股和转增股本等操作(除权除息)。这会导致股票价格在除权除息日产生非交易因素的突然下跌(例如一拆二、高送转等)。
如果不进行正确的复权处理,直接使用原始价格(不复权数据)进行回测,量化系统会面临以下灾难:
指标严重失真:均线(MA)、MACD、RSI 等技术指标会因为除权日人为产生的“巨大跳空缺口”而误判,发出错误的买卖信号。
回测收益计算错误:系统会误认为股价遭遇了暴跌,从而得出极其悲观甚至完全不符合事实的回测结果。
三种复权形式的区别:
不复权(None):最真实的盘中交易价格。适合观察历史绝对价位、计算实盘所需资金,但不适合计算均线和直接回测。
前复权(QFQ):以最新一日的价格为基准,向后等比调整历史价格。其最大优势是保持当前价格与历史价格的连贯性,方便计算当前的持仓盈亏比例,是技术指标计算和趋势回测的首选。
后复权(HFQ):以初始上市价格为基准,向上等比调整后续价格。后复权价格会随着分红送股不断变高(例如一些龙头股后复权后价格高达数万),其核心优势在于能真实反映一笔资金在初始买入并红利再投资后的真实复利增长率。
2. 解决方案:基于 QuantDash 灵活调用三种复权数据
quantdash SDK 内置了标准化的除权除息清洗引擎,开发者只需通过配置 adjust 参数(qfq, hfq, none)即可一键切换所需格式。
2.1 依赖安装与代码实现
pip install quantdash pandas以下代码使用免注册的公测 Token,获取港股腾讯控股(00700.HK)在不同复权方式下的价格走势:
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 数据格式输出样例
运行后,可以直观地观察到由于历史派息送股引起的基准差异:
三种复权模式数据对比 (前 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.003. AI 编程助手(Cursor/Copilot)专属提示词
在用 AI 编写回测脚本时,关于复权的逻辑必须严格定义,可向 AI 助手发送以下 Prompt:
你现在是一个量化研究员。我已经有了 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 文档
