This prices are expected to fluctuate in this band 95% of the time. As with any sliding window calculation the easy way is

to calculate everything each time for each window. Which usually means quadratic algorithm. A better way exists to calculate

the values for standard deviations using some smart manipulations on the standard deviation formula. (to be more precise the

variance formula which is the square of the standard deviation.)

To the variance formula is (k = )

expanding the quadratic term

extracting the last constant term independent of i

extract the term independent of i from the 2nd part

first term and last term can be handled the way moving averages are handle. When the window slides right, add the new term

remove the old term on the left. This is efficient.

so the middle term becomes

now the second term can also be calculated using the efficient method.

Here is an implementation in code for Bollinger bands

Code: Select all

```
public SuperList<BollingerBand> calculate() {
double totalAvg = 0d;
double totalSq = 0d;
int i = 0;
SuperList<BollingerBand> result = new SuperList<>();
for (Double value : values) {
totalAvg += value;
totalSq += value * value;
if (i >= PERIOD - 1) {
double avg = totalAvg / PERIOD;
double stddev = Math.sqrt((totalSq - (totalAvg*totalAvg)/PERIOD)/ PERIOD);
BollingerBand band = new BollingerBand(avg, avg + 2 * stddev, avg - 2 * stddev);
result.add(band);
totalAvg -= values.get(i - PERIOD + 1);
totalSq -= values.get(i - PERIOD + 1) * values.get(i - PERIOD + 1);
}
i++;
}
return result;
}
```