나는이 접근이인지 확실하지 않다 찾고 있지만 여기는 매우 빠른 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 일이 거의 비슷합니다. 컴파일러 최적화에
참고 :
여러 계산은 하나의 CPU 사이클에서 휘저어 될 수 SSE 또는 AVX 옵션을 켜면 사용할 수 이러한 알고리즘의 엄청난 속도 향상을 가능하게 할 것이다 경우주의 마십시오.
출처
2014-07-11 23:04:59
hnk
가 대신 지수 이동 평균을 사용하여 생각 해 봤나? 논란의 여지는 있지만 논리적으로 점진적으로 계산하기가 쉽습니다. –
@javapowered를 사용하면 코드를 공유 할 수 있습니까? –
@AlanStokes 왜 기하 급수적으로 점진적으로 계산하기가 쉬운 지 흥미로운 이유는 링크를 추가 할 수 있습니까? – javapowered