8.5 KiB
CVI: Chaikin's Volatility
Volatility expansion precedes major moves—when the trading range starts widening, pay attention.
| Property | Value |
|---|---|
| Category | Volatility |
| Inputs | OHLCV bar (TBar) |
| Parameters | rocLength (default 10), smoothLength (default 10) |
| Outputs | Single series (Cvi) |
| Output range | \geq 0 |
| Warmup | 1 bar |
| PineScript | cvi.pine |
- Chaikin's Volatility (CVI) measures the rate of change of the EMA-smoothed high-low trading range.
- Similar: ATR | Complementary: BandWidth | Trading note: Chaikin Volatility; ROC of high-low EMA range.
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
Chaikin's Volatility (CVI) measures the rate of change of the EMA-smoothed high-low trading range. Unlike traditional volatility measures that focus on returns, CVI directly tracks the expansion and contraction of price ranges over time. A positive CVI indicates expanding volatility (wider trading ranges), while a negative CVI signals contracting volatility (narrower ranges). This makes CVI particularly useful for identifying breakout conditions and market transitions.
Historical Context
Marc Chaikin developed this indicator as part of his suite of technical analysis tools focused on price and volume dynamics. The indicator emerged from a practical observation: before significant price moves, the trading range often expands as buyers and sellers contest prices more aggressively.
Traditional volatility measures like standard deviation or ATR tell you the level of volatility, but CVI answers a different question: is volatility increasing or decreasing? This directional information can be more actionable for traders timing entries and exits.
The indicator combines two smoothing mechanisms: EMA smoothing on the raw high-low range to reduce noise, followed by a Rate of Change (ROC) calculation to measure the trend in volatility. This two-stage approach filters out day-to-day noise while capturing meaningful shifts in market character.
Architecture & Physics
1. Range Calculation
The daily trading range is the difference between high and low prices:
R_t = H_t - L_t
where:
H_t= high price at timetL_t= low price at timetR_t= range at timet
This captures the full extent of intraday price movement.
2. EMA Smoothing
The range is smoothed using an Exponential Moving Average:
EMA_t = \alpha \cdot R_t + (1 - \alpha) \cdot EMA_{t-1}
where:
\alpha = \frac{2}{smoothLength + 1}(smoothing factor)- Default
smoothLength = 10gives\alpha \approx 0.182
Equivalently, using FMA optimization:
EMA_t = (R_t - EMA_{t-1}) \cdot \alpha + EMA_{t-1}
3. Rate of Change Calculation
CVI is the percentage change of the smoothed range over the ROC period:
CVI_t = \frac{EMA_t - EMA_{t-rocLength}}{EMA_{t-rocLength}} \times 100
where:
rocLength= lookback period for ROC (default 10)- Output is expressed as a percentage
4. Interpretation
CVI_t = \begin{cases}
> 0 & \text{Expanding volatility (range increasing)} \\
= 0 & \text{Stable volatility (range unchanged)} \\
< 0 & \text{Contracting volatility (range decreasing)}
\end{cases}
Mathematical Foundation
EMA Properties
Smoothing Factor:
\alpha = \frac{2}{n + 1}
| smoothLength | α | Half-life (bars) |
|---|---|---|
| 5 | 0.333 | 1.7 |
| 10 | 0.182 | 3.4 |
| 14 | 0.133 | 4.8 |
| 20 | 0.095 | 6.9 |
Exponential Decay:
The weight of a value k bars ago is:
w_k = \alpha (1 - \alpha)^k
ROC Properties
Percentage Change Formula:
ROC = \frac{V_{current} - V_{prior}}{V_{prior}} \times 100
Symmetry Note: A +50% increase followed by -33% decrease returns to the original value. CVI preserves this percentage-based interpretation.
Combined Effect
The warmup period is the sum of both smoothing requirements:
WarmupPeriod = smoothLength + rocLength
This ensures both the EMA has stabilized and enough history exists for the ROC calculation.
Performance Profile
Operation Count (Streaming Mode, Scalar)
Per-bar operations after warmup:
| Operation | Count | Cost (cycles) | Subtotal |
|---|---|---|---|
| SUB (range) | 1 | 1 | 1 |
| FMA (EMA) | 1 | 4 | 4 |
| Buffer lookup | 1 | 3 | 3 |
| SUB | 1 | 1 | 1 |
| DIV | 1 | 15 | 15 |
| MUL (×100) | 1 | 3 | 3 |
| Total | — | — | ~27 cycles |
The primary cost is the division for the ROC calculation.
Batch Mode (512 values, SIMD/FMA)
| Operation | Scalar Ops | SIMD Ops (AVX2) | Speedup |
|---|---|---|---|
| Range calculation | 512 | 64 | 8× |
| EMA (sequential) | 512 | 512 | 1× |
| ROC calculation | 512 | 64 | 8× |
Note: EMA is inherently sequential due to the EMA_{t-1} dependency. Total batch improvement is limited by this constraint.
Memory Profile
- Per instance: ~80 bytes (state struct + RingBuffer header)
- RingBuffer:
(rocLength + 1) \times 8bytes for EMA history - Default (10,10): ~80 + 88 = ~168 bytes per instance
Quality Metrics
| Metric | Score | Notes |
|---|---|---|
| Accuracy | 8/10 | Direct measure of range dynamics |
| Timeliness | 7/10 | EMA introduces lag |
| Smoothness | 8/10 | Two-stage smoothing reduces noise |
| Interpretability | 9/10 | Clear meaning: + expanding, - contracting |
| Robustness | 8/10 | Handles gaps and spikes well |
Validation
CVI is a classic indicator with multiple implementations:
| Library | Status | Notes |
|---|---|---|
| TA-Lib | N/A | Not implemented |
| Skender | N/A | Not implemented |
| Tulip | N/A | Not implemented |
| OoplesFinance | N/A | Not implemented |
| PineScript | ✅ | Matches cvi.pine reference |
| Manual | ✅ | Validated against formula |
Note: While many libraries include ATR or standard deviation-based volatility, Chaikin's specific ROC-of-EMA-range formulation is less common.
Common Pitfalls
-
Warmup period: CVI requires
smoothLength + rocLengthbars before producing meaningful results. With defaults (10,10), this means 20 bars. TheIsHotproperty indicates when warmup is complete. -
Zero/near-zero old EMA: If the historical EMA value is very small (near zero), the division can produce extreme or infinite values. The implementation guards against this with an epsilon threshold.
-
Interpretation of magnitude: CVI values are percentages, not absolute ranges. A CVI of +50 means volatility increased 50% compared to
rocLengthbars ago, regardless of the actual range values. -
Not a directional indicator: CVI measures volatility direction, not price direction. High CVI can precede moves in either direction.
-
Parameter sensitivity:
- Shorter
smoothLength= more responsive to range changes but noisier - Shorter
rocLength= more volatile CVI readings - Common combinations: (10,10), (14,10), (10,14)
- Shorter
-
Requires OHLC data: Unlike many indicators that work with closing prices only, CVI requires high and low prices. When using TValue input, the value is interpreted as a pre-calculated range.
-
Negative ranges: If TValue input has negative values (invalid for a range), the implementation substitutes the last valid value.
Trading Applications
Breakout Detection
High positive CVI values suggest expanding volatility, often preceding breakouts:
Entry signal: CVI crosses above +20 (volatility expanding)
Confirmation: Price breaks key support/resistance
Consolidation Identification
Sustained negative CVI indicates contracting ranges, typical of consolidation:
Consolidation: CVI < -10 for several bars
Watch for: CVI reversal signaling potential breakout
Volatility Regime Filter
CVI can filter other signals based on volatility conditions:
Trade breakouts when: CVI > 0 (expanding volatility)
Avoid range trades when: CVI rising sharply
References
- Chaikin, M. (1966). "Stock Market Trading Systems." Various publications and interviews.
- Achelis, S. B. (2000). "Technical Analysis from A to Z." McGraw-Hill. Chapter on Chaikin Volatility.
- Murphy, J. J. (1999). "Technical Analysis of the Financial Markets." New York Institute of Finance.