【发布时间】:2019-08-29 07:06:14
【问题描述】:
我正在尝试从 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 进行完全矢量化,如果有人能告诉我方法,我将不胜感激。
【问题讨论】:
-
首先,我认为您不需要
nditer来进行迭代;它对速度没有帮助(如果这就是您使用它的原因)。如果你确实使用它,有一种方法可以获取索引和值,所以你不应该使用enumerate。 -
你的问题本质上是连续的;一个值取决于前一个。大多数快速编译的
numpy操作本质上是并行的 - 至少从 Python 的角度来看 - 所有值都是一次计算的。 (底层的 C 代码实际上是迭代的)。我们最接近串行操作的是ufuncs的accumulate方法,其中cumsum是最常见的。 -
@hpaulj 所以基本上你的意思是,一旦我修复了循环的 nditer 部分,只要这个计算正确,就没有什么可以做的了吗?
标签: python numpy vectorization