量化数据库复权与指标设计避坑指南

本文系 AI 生成,仅供参考,不保证准确性,实战中务必将结果与专业软件中的数据进行对比。


在量化交易和股票数据分析中,“复权”是一个绕不开的核心概念。很多新手在搭建自己的数据库或编写策略时,常常因为复权处理不当,导致回测结果失真、技术指标错位,甚至引发系统性的计算灾难。

本文将从底层逻辑出发,用大白话为你讲透复权的本质,并提供一套成熟、高效的数据库与指标设计方案,帮你完美避开各种“坑”。

一、股票中的“复权”是什么意思?

简单来说,复权是为了消除股票因分红、送股、配股等除权除息事件造成的K线价格“断崖式”缺口。

当一家公司实施“10 送 10”时,股票数量翻倍,股价理论上会直接“腰斩”。如果看原始数据,K 线图上会出现一个巨大的向下跳空缺口。复权就是通过按比例调整历史价格,把这种非交易因素造成的断层“修复”,使股票的历史走势在图表上保持连续,从而真实反映投资者的累计收益和趋势变化。

二、如何计算复权因子?

复权因子本质上就是除权前后的价格比例,但不同数据源的定义方向恰好相反:

          BaoStock 算法:复权因子 = 除权后价格 ÷ 除权前价格(结果小于 1,如 10 ÷ 20 = 0.5)。

          掘金量化算法:复权因子 = 除权前价格 ÷ 除权后价格(结果大于 1,如 20 ÷ 10 = 2)。

无论哪种定义,其核心作用都是作为一个乘数,用于在不同历史价格之间进行等比换算。

三、将股票历史价格保存到数据库中时,建议使用真实价格还是复权价格?

强烈建议:只保存不复权的真实价格和复权因子。

前复权价格是一个动态变化的值(以当前最新价格为基准)。如果直接存储前复权价格,每次股票发生新的除权除息,你都需要把过去所有的历史价格全部重算并覆盖更新,维护成本极高且极易出错。而真实价格和复权因子是客观静态的,只需每天增量追加,历史数据永远无需修改。

四、以MA5为例,如何计算和保存指标价格?

遵循 “底层存真实指标,前端按需乘因子” 的原则:

          计算与存储:永远使用“真实价格”来计算 MA5,并将结果存入数据库。这样历史指标是客观事实,无需因复权而重算。

          展示与应用:在看盘或跑策略时,将数据库中的真实 MA5 乘以“当前的复权因子”,即可动态映射出完美的复权 MA5。

举个例子:某 6 天的真实价格是 20,21,22,23,24,12,其中最后一天进行了除权,且假设这天没涨没跌,掘金因子是24/12=2,这样的话,倒数据第 2 天的 MA5 是 (20+21+22+23+24)/5=22,最后一天的 MA5 是 (21/2+22/2+23/2+24/2+12)/5=11.4,所以数据库中这两天的 MA5 值分别是 22 和 11.4 。复权因子同样适用于 MA5 值,即从最后一天看,其前一天的前复权 MA5 值是 22/2=11。

五、如何解决复权因子与四舍五入叠加产生的偏差问题?

核心原则是 “真实价格负责算钱,复权价格负责算趋势” (实盘中):

          交易与风控层:涉及真实盈亏、涨跌停价计算、下单挂单等,必须使用精确到两位小数的“真实价格”。

          研究与回测层:涉及画K线图、计算 MA 等趋势指标时,才使用复权价格。此时允许存在极微小的尾数误差(如 1 分钱),因为技术指标看的是宏观趋势,微小偏差对信号毫无影响。

举个例子:真实价格 12.34(2位小数),复权因子 0.965678,前复权价格 12.34 × 0.965678 = 11.91646652(8 位小数)

如果你用这个 11.91646652 去算涨停价:11.91646652 × 1.1 = 13.108113172,四舍五入变成 13.11。

但是,真实的涨停价是 13.57,它的前复权价应该是:13.57 × 0.965678 = 13.10429046,四舍五入变成 13.10。

六、前复权与后复权在实际应用中该如何选择?

          前复权:以当前最新价格为基准,向下平移历史价格。优点是最新价格与真实交易价格一致,适合看近期K线走势、分析短期技术形态。

          后复权:以历史最早价格为基准,向上放大最新价格。优点是能真实反映上市以来的累计涨幅,适合计算长期累计收益率、评估长线投资价值。

附:复权因子计算实战案例(小白秒懂版)

【场景设定】

假设某只股票在 T-1 日的收盘价是 20元

T 日公司宣布“10 送 10”,股价直接“腰斩”变成 10元。假设 T 日当天市场不涨不跌,实际收盘价依然是 10元。

1. 复权因子怎么算?

          BaoStock算法:10 ÷ 20 = 0.5

          掘金量化算法:20 ÷ 10 = 2

2. 前复权怎么算?

前复权的核心是:T 日的 10元 保持不变,把 T-1 日的价格乘以 BaoStock 的因子(0.5)。

          T-1 日前复权价 = 20 × 0.5 = 10元

          T 日前复权价 = 10元(因为T日是基准日,保持不变)最终结果:T-1 日是 10元,T 日是 10元。K 线图完美连续,没有缺口。

3. 后复权怎么算?

后复权的核心是:T-1 日的 20元 保持不变,把 T 日的价格乘以掘金的因子(2)。

          T-1 日后复权价 = 20元

          T 日后复权价 = 10 × 2 = 20元最终结果:T-1 日是 20元,T 日是 20元。K 线图同样连续,反映了你“虽然股价没涨,但手里股票翻倍了,总资产没变”的真实情况。

4. 技术指标(以 MA2 为例)怎么算?

          数据库里存什么? 存真实价格算出来的指标。

       T-1 日前复权价格 = 20 × 0.5 = 10

       T 日前复权价格 = 10(前复权以当日为基准,保持真实价格不变)

       T 日真实 MA2 = (10 + 10) ÷ 2 = 10

【一句话总结】

复权只是数学游戏。真实价格负责算钱,复权价格负责看趋势;数据库里只存真实指标,看盘时再乘因子映射。

(AI 生成)


xoyozo 2 小时前
转载请注明出处
可能相关的内容