Files
QuanTAlib/lib/statistics/variance/Variance.md
T
Miha Kralj 86fe32a682 SIMD Refactor: Merge simd-dev into dev (#55)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: aider (openrouter/anthropic/claude-sonnet-4) <aider@aider.chat>
Co-authored-by: Warp <agent@warp.dev>
2026-01-18 19:02:03 -08:00

2.5 KiB

Variance (VAR)

"Volatility is the price of admission for high returns."

Variance measures how far a set of numbers is spread out from their average value. In finance, it is a key measure of volatility and risk.

Historical Context

Variance is a fundamental concept in statistics, formalized by Ronald Fisher in 1918. In finance, it gained prominence with Modern Portfolio Theory (Markowitz, 1952), where it serves as the standard measure of risk.

Architecture & Physics

The Variance indicator uses a sliding window (RingBuffer) to maintain the last N data points. It calculates the variance using an O(1) running sum of squares algorithm, ensuring constant time complexity regardless of the period length.

O(1) Calculation

The algorithm maintains two running sums:

  1. Sum of values (\sum x)
  2. Sum of squared values (\sum x^2)

When a new value enters and an old value leaves:

\sum x_{new} = \sum x_{old} - x_{out} + x_{in} \sum x^2_{new} = \sum x^2_{old} - x^2_{out} + x^2_{in}

This avoids iterating over the entire window for each update.

Mathematical Foundation

Variance (\sigma^2 or s^2) is defined as:

Population Variance (N)

\sigma^2 = \frac{\sum_{i=1}^{N} (x_i - \mu)^2}{N}

Using the computational formula:

\sigma^2 = \frac{\sum x^2 - \frac{(\sum x)^2}{N}}{N}

Sample Variance (N-1)

s^2 = \frac{\sum_{i=1}^{N} (x_i - \bar{x})^2}{N-1}

Using the computational formula:

s^2 = \frac{\sum x^2 - \frac{(\sum x)^2}{N}}{N-1}

Where:

  • N is the period.
  • \mu or \bar{x} is the mean.

Performance Profile

Metric Score Notes
Throughput 5 ns/bar O(1) complexity using running sums.
Allocations 0 Zero-allocation in hot path.
Complexity O(1) Constant time update.
Accuracy 9 High accuracy, though running sums can accumulate floating point errors over very long periods (mitigated by periodic resync if needed, though not strictly implemented here as window is finite).

Validation

Library Status Notes
Skender Matches StdDev^2 (Sample Variance).
TA-Lib Matches VAR (Population Variance usually, check specific implementation).

Usage

using QuanTAlib;

// Create a 20-period Sample Variance indicator
var variance = new Variance(20, isPopulation: false);

// Update with a new value
var result = variance.Update(new TValue(DateTime.UtcNow, 100.0));

// Access the last calculated value
Console.WriteLine($"Variance: {variance.Last.Value}");