我试图从Investopedia计算一个特殊的EMA公式
EmaToday = (ValueToday ∗ (Smoothing / 1+Days))
+ (EmaYesterday * (1 - (Smoothing / 1+Days)))
我们可以简化为:
Smoothing and Days are constants.
Let's call (Smoothing / 1 + Days) as 'M'
The simplified equation becomes:
EmaToday = ((ValueToday - EmaYesterday) * M) + EmaYesterday
我们可以在传统的python中使用以下循环来实现这一点:
# Initialize an empty numpy array to hold calculated ema values
emaTodayArray = np.zeros((1, valueTodayArray.size - Days), dtype=np.float32)
ema = emaYesterday
# Calculate ema
for i, valueToday in enumerate(np.nditer(valueList)):
ema = ((valueToday - ema) * M) + ema
emaTodayArray[i] = ema
emaTodayArray
保存所有计算的EMA值。你知道吗
我很难弄清楚如何将其完全矢量化,因为每次新计算都需要emaYesterday
值。你知道吗
如果完全矢量化使用numpy首先是可能的,我真的很感激如果有人能给我指路。你知道吗
你知道吗
注:我必须填写一些假人,使您的代码运行,请检查他们是否可以。你知道吗
循环可以通过变换
ema[i] ~> ema'[i] = ema[i] x (1-M)^-i
来矢量化,然后它就变成了cumsum
。你知道吗这在下面实现为
ema_pp_naive
。你知道吗这种方法的问题是,对于中等大小的
i
(~10^3),(1-M)^-i项可能溢出,从而导致结果无效。你知道吗我们可以通过使用log空间(使用
np.logaddexp
求和)来避免这个问题。这个ema_pp_safe
比naive方法要贵很多,但仍然比原始循环快10倍。在我快速而肮脏的测试中,它给出了一百万个术语甚至更多的正确结果。你知道吗代码:
运行示例:
相关问题 更多 >
编程相关推荐