我不确定这是否是您正在寻找的方法,但这里是非常快速的 SMA 的伪代码。
简单移动平均线:
我假设您的数据以某种流的形式出现并存储在连续的内存位置(至少具有连续可映射的地址)
x[1] to x[2000] contain the first 2000 data points
// they don't have to be a real array, could just be a function which manages
// a 'circular' array and maps the 'locations' to real locations in memory.
// Either case, it's small enough to be fully in the cache hopefully
//
// Subsequent prices will be accessible in 'locations x[2001], etc.
// Here we are looking to calculate the MA over the latest 2000 ticks
MA2000(1,2000) = (x[1] + x[2] + ... + x[2000]) / 2000 // Usual average
// Done only once
MA2000(2,2001) = MA2000(1,2000) * 2000 + x[2001] - x[1]
MA2000(2,2001) /= 2000
这样,通过两次加法和一次乘法(使用 1/2000 ),您可以为新的分时生成后续移动平均线。
指数移动平均线:
如上所述,这是一个不错的选择:
// For an N-day EMA
Alpha = 2 / (N+1) // one time calculation
EMA(new) = Alpha * NewTickPrice + (1-Alpha) * EMA(old)
这里并不是真正的 N 日移动平均线。它只是一个加权移动平均线,对最后 N 天的权重约为 87%,因此几乎 N 天更像它。
编译器优化注意事项:
请注意,如果可用,打开 SSE 或 AVX 选项将大大加快这些算法的速度,因为多个计算可以在单个 CPU 周期内进行。