复权说明(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 线是否支持复权同样以实现为准。
回测注意事项
复权口径直接决定回测结果的正确性,务必对齐:
回测一般用前复权(
qfq)。前复权 K 线连续、无跳空,技术指标(均线、MACD 等)与买卖点判定不会被除权缺口干扰。由于 K 线接口默认就是qfq,通常无需额外配置。不要用不复权数据跑趋势策略。
none在除权日会有大幅跳空,会被均线穿越、突破类策略误判为「暴跌 / 暴涨」,产生虚假信号。衡量长期绝对收益时考虑后复权。如果你关心的是「持有 N 年的真实累计回报」,
hfq把分红送股的收益累加进价格,比前复权更贴近实际持仓收益;但hfq价格量纲会随时间放大,不适合直接和现价比对。保持训练 / 回测 / 实盘口径一致。指标计算、信号识别、回测都应使用同一复权口径的 K 线,避免「前复权算信号、不复权算收益」这类口径错配。
复权不改变成交量口径。复权只修正价格,
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 的回测引擎