大熊猫指数加权移动平均线问题

时间:2018-03-18 17:44:09

标签: python python-3.x pandas dataframe average

我遇到了一个小问题,试图用熊猫计算指数加权移动平均线(ewma):

在这里,我正在使用熊猫的功能来计算我的价格的9期ewma:

df = m1["open"].ewm(min_periods=9,span=9).mean()

用于计算ewma的公式如下:

ewm(t+1) = alpha * price + (1-alpha) * ewm(t) 

alpha = 2/(period+1)

大熊猫的功能给我的结果似乎不正确,所以我试着验证它:

df = m1["open"].ewm(min_periods=9,span=9).mean()
alpha = 2/(9+1)
df_bis = alpha*m1["open"].shift(1) + (1-alpha)*df.shift(1)
bol_array = df == df_bis

df是pandas函数返回的DataFrame,df_bis使用公式使用df和价格的数据。

bol_array应始终为真,因为dfdf_bis应该相等。

然而,事实并非如此,我在bol_array

中随机抽取了一部分
2015-01-09 21:32:00    False
2015-01-09 21:33:00    False
2015-01-09 21:34:00     True
2015-01-09 21:35:00    False
2015-01-09 21:36:00    False
2015-01-09 21:37:00    False
2015-01-09 21:38:00    False
2015-01-09 21:39:00    False
2015-01-09 21:40:00    False
2015-01-09 21:41:00    False
2015-01-09 21:42:00    False
2015-01-09 21:43:00     True
2015-01-09 21:44:00    False
2015-01-09 21:45:00    False

有时,他们是平等的,有时不是。

我在特定时间检查了它是否可能是一个舍入问题:

m1["open"][15]*alpha + df[15]*(1-alpha)
Out[7]: 1.1931468623934722

df[16]
Out[8]: 1.1930652375329887

结果真的不一样,这不是一个舍入问题(我需要一个5位数的精度)。

有人知道这里有什么问题吗? 我似乎无法找到问题所在。

编辑:要查看它是否可能是一个舍入问题,我正在添加一个数组来确定pandas之间的差异

diff_array = df-df_bis

我需要一个5位数的精度,所以我将这个数组乘以10 ^ 5,以更好地可视化差异的大小:

diff_array*10**5
Out[16]: 
DateTime
2015-01-04 22:00:00          NaN
2015-01-04 22:01:00          NaN
2015-01-04 22:02:00          NaN
2015-01-04 22:03:00          NaN
2015-01-04 22:04:00          NaN
2015-01-04 22:05:00          NaN
2015-01-04 22:06:00          NaN
2015-01-04 22:07:00          NaN
2015-01-04 22:08:00          NaN
2015-01-04 22:09:00    -2.610024
2015-01-04 22:10:00   -60.325142
2015-01-04 22:11:00    27.044649
2015-01-04 22:12:00    32.072310
2015-01-04 22:13:00   -25.944314
2015-01-04 22:14:00     8.201273
2015-01-04 22:15:00     8.358418
2015-01-04 22:16:00    -8.162486
2015-01-04 22:17:00   -11.381701
2015-01-04 22:18:00     8.610419
2015-01-04 22:19:00     4.862610
2015-01-04 22:20:00     3.875236
2015-01-04 22:21:00     1.659843

差异的幅度有时非常大。 虽然我正在寻找5位数的精度,但我可以有10 ^( - 5)的差异,或两倍的差异,但我有差异高达60 *(10 ^ -5 )只是在第一个值之间,这太大了。

编辑2:我查看了emw的每个参数,我得到了直接指定对应于9周期ewma的alpha参数的相同结果,这意味着我的参数确实是正确的。

调整参数默认设置为True,查看pandas文档:

  

当adjust为False时,递归计算加权平均值:   weighted_average [0] = arg [0]; weighted_average [i] =(1-alpha)* weighted_average [i-1] + alpha * arg [i]。

我将adjust参数设置为False,这应该可以解决问题:

df = m1["open"].ewm(min_periods=9,alpha=0.2,adjust=False).mean()
alpha = 2/(9+1)
df_bis = alpha*m1["open"].shift(1) + (1-alpha)*df.shift(1)
diff_array = df-df_bis

diff_array*10**5
Out[11]: 
DateTime
2015-01-04 22:09:00    -5.6
2015-01-04 22:10:00   -56.8
2015-01-04 22:11:00    27.2
2015-01-04 22:12:00    30.4
2015-01-04 22:13:00   -25.8
2015-01-04 22:14:00     8.0
2015-01-04 22:15:00     8.0
2015-01-04 22:16:00    -8.2
2015-01-04 22:17:00   -11.2
2015-01-04 22:18:00     8.6
2015-01-04 22:19:00     4.8

但这并没有解决我的问题。 我找不到任何可以解释这种差异的东西,有人会知道为什么会有区别吗?

以下是关于该主题的熊猫文档,其中我之前使用的公式来自:http://pandas.pydata.org/pandas-docs/stable/computation.html#exponentially-weighted-windows

我正在使用的数据非常大,这是一个示例:

m1["open"]
Out[10]: 
DateTime
2015-01-04 22:00:00    1.19548
2015-01-04 22:01:00    1.19388
2015-01-04 22:02:00    1.19102
2015-01-04 22:03:00    1.18826
2015-01-04 22:04:00    1.19085
2015-01-04 22:05:00    1.19257
2015-01-04 22:06:00    1.19270
2015-01-04 22:07:00    1.19350
2015-01-04 22:08:00    1.19427
2015-01-04 22:09:00    1.19399
2015-01-04 22:10:00    1.19115
2015-01-04 22:11:00    1.19251
2015-01-04 22:12:00    1.19403
2015-01-04 22:13:00    1.19274
2015-01-04 22:14:00    1.19314
2015-01-04 22:15:00    1.19354
2015-01-04 22:16:00    1.19313
2015-01-04 22:17:00    1.19257
2015-01-04 22:18:00    1.19300
2015-01-04 22:19:00    1.19324
2015-01-04 22:20:00    1.19343
2015-01-04 22:21:00    1.19351
2015-01-04 22:22:00    1.19353
2015-01-04 22:23:00    1.19376
2015-01-04 22:24:00    1.19408
2015-01-04 22:25:00    1.19370
2015-01-04 22:26:00    1.19381
2015-01-04 22:27:00    1.19439
2015-01-04 22:28:00    1.19435
2015-01-04 22:29:00    1.19419

1 个答案:

答案 0 :(得分:0)

解决了这个问题,我只是个白痴。

我使用了公式:df_bis = alpha*m1["open"].shift(1) + (1-alpha)*df.shift(1)

但是价格不应该转移到这里,正确的计算是:

df_bis = alpha*m1["open"] + (1-alpha)*df.shift(1)

哪个收益率:

diff_array
Out[24]: 
DateTime
2015-01-04 22:09:00    0.0
2015-01-04 22:10:00    0.0
2015-01-04 22:11:00    0.0
2015-01-04 22:12:00    0.0
2015-01-04 22:13:00    0.0
2015-01-04 22:14:00    0.0
2015-01-04 22:15:00    0.0
2015-01-04 22:16:00    0.0
2015-01-04 22:17:00    0.0
2015-01-04 22:18:00    0.0
2015-01-04 22:19:00    0.0
2015-01-04 22:20:00    0.0