以前我总结过 前复权,现在简单拓展一下其应用。
涨跌幅复权因子只要被记录下来,就无需变动 —— 或者具体地说,新一天的复权因子只与前一天复权因子和当日前收盘价、当日收盘价有关。 这对更新数据十分友好,因为只需从数据库拉取最新一条数据(即前一个交易日的数据),然后计算当天数据就可以入库,完全不需要获取大量数据,也不需要重算任何数据。
日期 | 前收盘价 | 收盘价 | 复权因子(及计算方式) | 前复权价 |
---|---|---|---|---|
上市首日 | $P_1$ | $C_1$ | $f_1 = \frac{C_1}{P_1}$ | $m \times f_1$ |
上市次日 | $P_2$ | $C_2$ | $f_2 = f_1 \times \frac{C_2}{P_2}$ | $m \times f_1$ |
… | … | … | … | … |
上月末 | $P_{n-1}$ | $C_{n-1}$ | $f_{n-1} = f_{n-2} \times \frac{C_{n-1}}{P_{n-1}}$ | $m \times f_{n-1}$ |
本月初 | $P_n$ | $C_n$ | $f_n = f_{n-1} \times \frac{C_n}{P_n}$ | $m \times f_n$ |
… | … | … | … | … |
最新日期 | $P_m$ | $C_m$ | $f_m$ | $m \times f_m$ |
其中系数 $m$ 为
\[m = \frac{C_m}{f_m}\]
上市首日的前收盘价为当日的收盘价,即 $P_1 == C_1, f_1 == 1$。
最新日期的前复权价为当日的收盘价,即 $m \times f_m == C_m$。
此外,涨跌幅复权容易计算涨跌幅数据,比如计算最新日期的月涨跌幅,只需取“最新日期”和“本月初”两行数据,这降低了获取数据的难度:
\[\text{最新月涨幅} = \text{最新日期的前复权价 / 上月末的前复权价}\]即
\[\text{最新月涨幅} = \frac{C_m}{m \times f_{n-1}} = \frac{m \times f_m}{m \times f_{n-1}} = \frac{f_m}{f_{n-1}} = \frac{f_m}{\frac{f_n}{\frac{C_n}{P_n}}} = \frac{f_m}{f_n} \times \frac{C_n}{P_n}\]相应的 Clickhouse SQL 语句(注意,以下代码计算所有股票的所有历史月涨幅):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
code,
toYYYYMM(date) AS m,
((LAST_VALUE(factor) / FIRST_VALUE(factor)) * FIRST_VALUE(close)) / FIRST_VALUE(preclose) AS mgrowth
FROM rustdx.factor
GROUP BY
code,
m
ORDER BY
code ASC,
m DESC
┌─code───┬──────m─┬─────────────mgrowth─┐
│ 000001 │ 202303 │ 0.9092888050051663 │
│ 000001 │ 202302 │ 0.9192795159024402 │
│ 000001 │ 202301 │ 1.139057746574816 │
...
同样地,你可以轻易计算任何周期的涨跌幅。