Если вы хотите что-то действительно простое, вы можете принять среднее значение абсолютных различий между последовательными рангами как волатильность. У этого есть дополнительный бонус того, чтобы быть рекурсивным. Используем это для инициализации:
double sum=0;
for (int i=1; i<N; i++)
{
sum += abs(ranks[i]-ranks[i-1]);
}
double volatility = sum/N;
Затем для обновления волатильности, если доступен новый ранг в момент времени N + 1, вы вводите параметр K, где K определяет скорость, с которой ваше измерение волатильности адаптируется к изменениям волатильности. Более высокое K означает более медленную адаптацию, поэтому K может рассматриваться как «время затухания» или как-то так:
double K=14 //higher = slower change in volatility over time.
double newvolatility;
newvolatility = (oldvolatility * (K-1) + abs(rank[N+1] - rank[N]))/K;
Это также известно как скользящее среднее (в данном случае абсолютных различий в рангах).