在pandas数据框中创建一个滚动的自定义EWMA(指数加权移动平均)。

4

我尝试在以下数据框的最后13个值上创建具有以下衰减率= 1-ln(2)/3的滚动EWMA:

factor
Out[36]: 
    EWMA
0  0.043
1  0.056
2  0.072
3  0.094
4  0.122
5  0.159
6  0.207
7  0.269
8  0.350
9  0.455
10 0.591
11 0.769
12 1.000

I have a df of monthly returns like this :

change.tail(5)
Out[41]: 

date                                                                                                                                    
2016-04-30      0.033         0.031     0.010     0.007     0.014    -0.006    -0.001      0.035    -0.004     0.020     0.011     0.003
2016-05-31      0.024         0.007     0.017     0.022    -0.012     0.034     0.019      0.001     0.006     0.032    -0.002     0.015
2016-06-30     -0.027        -0.004    -0.060    -0.057    -0.001    -0.096    -0.027     -0.096    -0.034    -0.024     0.044     0.001
2016-07-31      0.063         0.036     0.048     0.068     0.053     0.064     0.032      0.052     0.048     0.013     0.034     0.036
2016-08-31     -0.004         0.012    -0.005     0.009     0.028     0.005    -0.002     -0.003    -0.001     0.005     0.013     0.003

我只是试图将这个滚动的EWMA应用到每一列。我知道pandas有一个EWMA方法,但我无法弄清如何传递正确的1-ln(2)/3因子。

希望得到帮助!谢谢!

2个回答

6

@piRSquared的回答是一个很好的近似,但最后13个值之外的值也有加权(虽然非常小),因此它并不完全正确。

pandas可以进行滚动窗口计算。然而,在它支持的所有滚动函数中,ewm不是其中之一,这意味着我们必须自己实现。

假设series是我们要平均的时间序列:

from functools import partial
import numpy as np

window = 13
alpha = 1-np.log(2)/3    # This is ewma's decay factor.
weights = list(reversed([(1-alpha)**n for n in range(window)]))
ewma = partial(np.average, weights=weights)
rolling_average = series.rolling(window).apply(ewma)

1
看起来这里没有定义ln和weight,只是提醒一下。我认为应该分别是np.log和weights。 - user6400946

3

使用mean()函数与ewm一起使用

df.ewm(halflife=1 - np.log(2) / 3).mean()

enter image description here


有没有使用NumPy的方法可以实现这个? - Merlin
2
谢谢@piRSquared,您知道是否可能仅使用最后13个值吗? - Steven G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接