Skip to content

复权说明(qfq / hfq)

股票在分红、送股、配股后,价格会出现「除权除息」缺口。复权就是把历史价格按这些事件平滑修正,让 K 线在视觉与计算上连续——否则均线、回测收益等都会被价格跳空污染。

stock-sdk 在 K 线接口上支持三种复权口径。

三种口径

口径含义适用场景
qfq前复权:以最新价为基准,向前修正历史价看图、做技术指标、做回测(最常用
hfq后复权:以最早价为基准,向后累加计算长期累计收益、跨越多次除权的真实涨幅
none不复权:原始价,保留除权缺口还原历史真实成交价、对账

直观区别:

  • 前复权保持「当前价格」真实,历史价被压低;图形右端贴合现价,是大多数行情软件的默认。
  • 后复权保持「最早价格」真实,越往后价格越高;适合衡量「从上市到现在涨了多少倍」。
  • 不复权则两头都是原始价,除权日会有明显跳空。

默认前复权

stock-sdk 的 K 线接口默认前复权(qfq。直接调用即可拿到前复权日 K:

ts
import { StockSDK } from 'stock-sdk'

const sdk = new StockSDK()

// 默认前复权
const qfq = await sdk.kline.cn('600519')

// 显式指定复权口径
const hfq = await sdk.kline.cn('600519', { adjust: 'hfq' })  // 后复权
const raw = await sdk.kline.cn('600519', { adjust: 'none' }) // 不复权

港股、美股 K 线同理:

ts
const hk = await sdk.kline.hk('00700', { adjust: 'qfq' })
const us = await sdk.kline.us('AAPL', { adjust: 'hfq' })

参数以实现为准

复权参数的精确字段名(如 adjust 的取值集合)与默认值以最终实现为准;本页约定为 qfq / hfq / none 三选一,默认 qfq。分钟 K 线是否支持复权同样以实现为准。

回测注意事项

复权口径直接决定回测结果的正确性,务必对齐:

  1. 回测一般用前复权(qfq。前复权 K 线连续、无跳空,技术指标(均线、MACD 等)与买卖点判定不会被除权缺口干扰。由于 K 线接口默认就是 qfq,通常无需额外配置。

  2. 不要用不复权数据跑趋势策略none 在除权日会有大幅跳空,会被均线穿越、突破类策略误判为「暴跌 / 暴涨」,产生虚假信号。

  3. 衡量长期绝对收益时考虑后复权。如果你关心的是「持有 N 年的真实累计回报」,hfq 把分红送股的收益累加进价格,比前复权更贴近实际持仓收益;但 hfq 价格量纲会随时间放大,不适合直接和现价比对。

  4. 保持训练 / 回测 / 实盘口径一致。指标计算、信号识别、回测都应使用同一复权口径的 K 线,避免「前复权算信号、不复权算收益」这类口径错配。

  5. 复权不改变成交量口径。复权只修正价格,volume 不受复权影响;成交量的单位问题见技术指标与信号中的成交量口径说明。

把带指标的前复权 K 线直接喂给回测引擎,是最常见也最稳妥的组合:

ts
import { StockSDK } from 'stock-sdk'

const sdk = new StockSDK()

// 默认前复权 + 自带指标,直接作为回测输入
const kline = await sdk.kline.withIndicators('600519', {
  ma: [5, 20],
  macd: true,
})
// 交给 stock-sdk/screener 的回测引擎