我创建了这个 pandas 数据框
import pandas as pd
ds = {'col1' : [1,2,3,4,3,3,2,2,2,4,5,6,7,5,4,3,2,2,4,5,12]}
df = pd.DataFrame(data=ds)
数据集如下所示:
display(df)
col1
0 1
1 2
2 3
3 4
4 3
5 3
6 2
7 2
8 2
9 4
10 5
11 6
12 7
13 5
14 4
15 3
16 2
17 2
18 4
19 5
20 12
我现在计算 3 周期指数移动平均线如下:
time_window = 3
df['ema3'] = df['col1'].ewm(com=time_window - 1,
min_periods=time_window).mean()
生成的数据框如下所示:
col1 ema3
0 1 NaN
1 2 NaN
2 3 2.263158
3 4 2.984615
4 3 2.990521
5 3 2.993985
6 2 2.642059
7 2 2.419350
8 2 2.275833
9 4 2.860698
10 5 3.582139
11 6 4.394353
12 7 5.267388
13 5 5.177952
14 4 4.784403
15 3 4.188695
16 2 3.458389
17 2 2.971930
18 4 3.314775
19 5 3.876685
20 12 6.585000
问题:
col1
的什么值会返回记录21
的 EMA 8.12?
col1 ema3
0 1 NaN
1 2 NaN
2 3 2.263158
3 4 2.984615
4 3 2.990521
5 3 2.993985
6 2 2.642059
7 2 2.419350
8 2 2.275833
9 4 2.860698
10 5 3.582139
11 6 4.394353
12 7 5.267388
13 5 5.177952
14 4 4.784403
15 3 4.188695
16 2 3.458389
17 2 2.971930
18 4 3.314775
19 5 3.876685
20 12 6.585000
21 ?? 8.120000
是否有一个公式可以反转
ewm
并给出 col1
的值,使得记录 21 处的 EMA 为 8.12000?
我不想重复很多值。我问是否有人知道一个公式(我可以用 python 编写)。
谢谢!
指数加权移动平均线定义如下:
EWMA(t) = a * value(t) + (1-a) * EWMA(t-1)
就您而言,您想要
value(t)
并且您知道 EWMA(t) = 8.12
和 EWMA(t-1) = 6.585
以及 a = 1/(1+com)
。您可以这样解决:
com = time_window - 1
a = 1/(1+com) # 0.333
x = (8.12 - (1-a)*6.585) / a
输出:
11.189999999999996
验证(不精确):
col1 ema3
0 1.00 NaN
1 2.00 NaN
2 3.00 2.263158
3 4.00 2.984615
4 3.00 2.990521
5 3.00 2.993985
6 2.00 2.642059
7 2.00 2.419350
8 2.00 2.275833
9 4.00 2.860698
10 5.00 3.582139
11 6.00 4.394353
12 7.00 5.267388
13 5.00 5.177952
14 4.00 4.784403
15 3.00 4.188695
16 2.00 3.458389
17 2.00 2.971930
18 4.00 3.314775
19 5.00 3.876685
20 12.00 6.585000
21 11.19 8.120205