精准回测第一步:搞定复权数据!复权因子使用指南

在量化交易的道路上,很多人花费大量时间优化策略参数、挖掘新因子,却往往忽略了最基础也最关键的一环:数据的质量。
如果你直接使用交易所下载的原始价格数据进行回测,很可能会得到一个“虚假繁荣”的策略曲线。原因很简单:你忽略了分红、送股、配股带来的价格断层。
现在我们基于免费且强大的 Baostock 数据源,手把手教你理解复权、获取复权因子,并在回测中正确使用它,确保你的策略评估真实可靠。
一、什么是复权?为什么必须做?
价格的“假摔”现象:股票在发生分红(派息)或送转股(拆股)时,股价会在除权除息日(Ex-Date)出现大幅下跌。
例子:某股票收盘价 20 元,第二天实施“10 送 10”。
除权后:股本翻倍,股价理论上变为 10 元。
原始数据表现:K 线图上会出现一个从 20 元到 10 元的巨大向下跳空缺口。
实际情况:投资者的总资产并没有减半(股数翻倍了),这并非市场抛售导致的暴跌。
如果不处理这个缺口,技术指标(如均线、MACD)会失真,回测系统会误以为发生了巨额亏损,从而错误地触发止损或得出错误的收益率结论。
复权(Adjustment)就是通过算法,将因权益变动导致的价格断层“修复”,使 K 线恢复连续,真实反映股票的涨跌趋势。
核心工具是复权因子(Adjustment Factor)。
公式逻辑:复权后价格 = 原始价格 × 复权因子(注:具体计算需考虑现金分红的扣除,不同软件算法略有差异,但核心思想一致)
二、前复权 vs 后复权:回测该用哪个?
在 Baostock 和大多数量化场景中,我们主要接触两种复权方式:
特性:前复权 (Forward Adjusted);后复权 (Backward Adjusted)。
基准点:以当前最新价格为基准,向前推算历史价格。 以上市首日价格为基准,向后推算当前价格。
价格特征:现价 = 真实市场价;历史价可能被压缩得很低(甚至负数)。 历史价 = 真实发行价;现价可能非常高(几千几万)。
主要用途:技术分析、策略回测。因为回测时的“当前信号”必须基于真实市场价格。 计算长期真实收益率、查看股票从上市以来的总涨幅。
回测推荐:强烈推荐
结论:在做策略回测时,请务必使用前复权数据。这样能保证你策略发出的“买入价”就是市场上真实的成交价。
三、实战:使用 Baostock 获取复权数据
核心代码:获取前复权日线数据
Baostock 的 query_history_k_data_plus 接口通过 adjustflag 参数控制复权:"3": 不复权;"2": 前复权(回测专用);"1": 后复权
{{{
import baostock as bs
import pandas as pd
def get_adjusted_data(code, start_date, end_date):
# 1. 登录系统
lg = bs.login()
if lg.error_code != '0':
print(f"Login failed: {lg.error_msg}")
return None

# 2. 查询数据
# adjustflag="2" 表示前复权
fields = "date,time,code,open,high,low,close,volume,amount,adjustflag"
rs = bs.query_history_k_data_plus(
code,
fields,
start_date=start_date,
end_date=end_date,
frequency="d",
adjustflag="2" # <--- 关键:设置为前复权
)
# 3. 转换为 DataFrame
data_list = []
while (rs.error_code == '0')
发表时间 2026-02-25 13:06     来自上海

赞同来自:

要回复问题请先登录注册

发起人

问题状态

  • 最新活动: 2026-02-25 13:06
  • 浏览: 99
  • 关注: 1