Files
QuanTAlib/lib/dynamics/aroonosc/AroonOsc.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

3.4 KiB

AroonOsc: Aroon Oscillator

Tushar Chande's Aroon system is a dual-line argument. The Oscillator is the verdict.

The Aroon Oscillator condenses the struggle between the "Aroon Up" and "Aroon Down" lines into a single, normalized value. It quantifies not just the existence of a trend, but its freshness. It answers the question: "Are new highs appearing faster than new lows?"

Historical Context

Introduced by Tushar Chande in The New Technical Trader (1995), the Aroon system was a departure from price-based momentum. It focused on time. While RSI asks "how much did price move?", Aroon asks "how long has it been since the last extreme?". The Oscillator is simply the arithmetic difference between the two, providing a zero-centered metric for trend bias.

Architecture & Physics

The physics of Aroon are temporal, not spatial. It measures the decay of "recency."

  1. Time Measurement: The bars since the highest high and lowest low within the period are counted.
  2. Normalization: These counts are converted to a 0-100 scale (100 = happened right now, 0 = happened Period bars ago).
  3. Differential: The Oscillator is Up - Down.

The Drift Resistance

Unlike recursive indicators (EMA, RSI) which accumulate floating-point errors over time, Aroon is stateless in the long term. Its value depends only on the data within the lookback window. This makes it mathematically robust and immune to "poisoning" from bad data in the distant past.

Mathematical Foundation

The math is purely arithmetic.

1. Aroon Up

\text{AroonUp} = \frac{\text{Period} - \text{Days Since High}}{\text{Period}} \times 100

2. Aroon Down

\text{AroonDown} = \frac{\text{Period} - \text{Days Since Low}}{\text{Period}} \times 100

3. The Oscillator

\text{AroonOsc} = \text{AroonUp} - \text{AroonDown}

Performance Profile

The algorithm is O(N) where N is the period, as the window must be scanned for extremes. However, for typical periods (14-25), this is negligible.

Zero-Allocation Design

The implementation uses a circular buffer (RingBuffer) to store historical highs and lows, ensuring O(1) access and zero heap allocations during the update cycle. The min/max search is performed in-place on the buffer.

Metric Score Notes
Throughput 10ns 10ns / bar.
Allocations 0 Hot path is allocation-free.
Complexity O(P) Linear scan of the lookback window.
Accuracy 10/10 Matches standard implementations.
Timeliness 10/10 Reacts immediately to new extremes.
Overshoot 0/10 Bounded -100 to +100.
Smoothness 2/10 Step-function behavior.

Validation

Validation is performed against industry-standard libraries.

Library Status Notes
QuanTAlib Validated.
Skender Matches GetAroon (Oscillator).
TA-Lib Matches TA_AROONOSC.
Tulip Matches ti.aroonosc.
Ooples Deviates significantly from standard.

Common Pitfalls

  • Lag: Because it looks back Period bars, it will not signal a reversal until the previous extreme "ages out" or is superseded. It is a lagging indicator of trend changes.
  • Flatlining: In strong trends, the oscillator can peg at +100 or -100 for extended periods. This is a feature, not a bug—it indicates a "fresh" extreme on every bar.