【问题标题】:Create a rolling custom EWMA on a pandas dataframe在 pandas 数据框上创建滚动自定义 EWMA
【发布时间】:2016-08-08 18:50:47
【问题描述】:

我正在尝试在 df 的最后 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

我有一个像这样的每月回报率:

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 因子。

帮助将不胜感激!谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    @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)
    

    【讨论】:

    • 这里似乎没有定义 ln 和 weight,仅供参考。我认为应该分别是 np.log 和 weights
    【解决方案2】:

    使用ewmmean()

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

    【讨论】:

    • 有没有办法用 numpy 做到这一点?
    • 谢谢@piRSquared 你知道是否可以只使用最后 13 个值吗?
    猜你喜欢
    • 2015-08-28
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多