- Rogers-Satchell Volatility (RSV) is a drift-adjusted OHLC-based volatility estimator that uses all four price points (Open, High, Low, Close) to pr...
Rogers-Satchell Volatility (RSV) is a drift-adjusted OHLC-based volatility estimator that uses all four price points (Open, High, Low, Close) to provide more accurate volatility estimates than simpler range-based methods. Developed by L.C.G. Rogers and S.E. Satchell in 1991, this estimator is unique in its ability to account for price drift, making it particularly suitable for trending markets. The implementation uses SMA smoothing and optional annualization.
## Historical Context
Rogers and Satchell introduced this estimator in their 1991 paper "Estimating Variance from High, Low and Closing Prices" published in the Annals of Applied Probability. The key innovation was recognizing that the Parkinson and Garman-Klass estimators assume zero drift (no trend), which can introduce bias during trending markets.
The Rogers-Satchell estimator was designed to be independent of the drift rate, meaning it provides unbiased variance estimates regardless of whether the underlying asset is trending up, down, or sideways. This makes it theoretically superior for real-world markets where trends are common.
The estimator achieves approximately 8.4x the efficiency of close-to-close methods, making it one of the more efficient OHLC-based estimators available. It sits between Garman-Klass (7.4x) and Yang-Zhang (14x) in the efficiency hierarchy.
Unlike Parkinson (HLV) which uses only High-Low, or some implementations that focus on the close-to-close return, RSV extracts information from all four price relationships simultaneously: H/O, H/C, L/O, and L/C.
## Architecture & Physics
### 1. Log Price Ratios
All calculations use log ratios to normalize percentage returns:
- Equal weighting of all observations in the window
- Complete adaptation after exactly $n$ bars
- No exponential decay bias requiring correction
### 4. Volatility Calculation
Convert smoothed variance to volatility (standard deviation):
$$
\sigma_t = \sqrt{\max(0, SMA_t)}
$$
The max(0, ...) guard protects against potential floating-point artifacts.
### 5. Optional Annualization
If annualization is enabled (default):
$$
\sigma_{annual,t} = \sigma_t \times \sqrt{N}
$$
where $N$ = annual periods (default 252 trading days).
## Mathematical Foundation
### Drift Independence
The Rogers-Satchell estimator's key mathematical property is its independence from drift. For a geometric Brownian motion:
$$
dS = \mu S dt + \sigma S dW
$$
The standard close-to-close variance estimator:
$$
\hat{\sigma}^2_{CC} = (\ln C_t - \ln C_{t-1})^2
$$
includes the drift term $\mu dt$, biasing the estimate.
The Rogers-Satchell formula, through its specific combination of high-low-open-close ratios, cancels out the drift component mathematically, yielding an unbiased estimate of $\sigma^2$ regardless of $\mu$.
### Why This Formula Works
Consider the log price path within a single bar:
- The high and low represent extrema of the Brownian path
- The open-to-high and close-to-high paths share the high point
- The open-to-low and close-to-low paths share the low point
The product structure $\ln(H/O) \cdot \ln(H/C)$ captures the "spread" between how far the high was from both boundaries (open and close). Similarly for the low. This geometric information is invariant to drift.
| **Manual** | ✅ | Validated against original paper formula |
The implementation is validated against the original Rogers-Satchell 1991 paper formula.
## Common Pitfalls
1.**Warmup period**: RSV requires $period$ bars before producing stable results. With default period=20, the first 19 values are warming up. The `IsHot` property indicates when warmup is complete.
2.**OHLC data quality**: RSV requires all four OHLC prices. Missing or invalid data (high < low, prices ≤ 0) will trigger last-valid-value substitution. Ensure data quality before feeding to RSV.
3.**Zero prices**: Log ratios require positive prices. Prices of zero are clamped to a small epsilon (1e-10) to prevent log(0) = -∞.
4.**Annualization assumption**: Default annualization assumes 252 trading days/year. For other frequencies (hourly, weekly), adjust the `annualPeriods` parameter accordingly.
5.**SMA vs RMA**: Unlike HLV/GKV which use RMA, RSV uses SMA. This means:
- Complete adaptation after exactly $period$ bars (faster)
- No bias correction needed
- Can be "jumpier" when old high/low variance values drop out of the window
6.**Comparison with HLV**: HLV only uses High-Low, ignoring Open-Close. RSV uses all four prices and is drift-adjusted. Use RSV when OHLC data is available and markets are trending; use HLV when only High-Low data exists.
7.**Comparison with GKV**: Both use OHLC, but RSV is fully drift-adjusted while GKV is only partially. RSV is slightly more efficient (8.4x vs 7.4x) and better for trending markets.
## Trading Applications
### Position Sizing
Use RSV to scale position sizes inversely with volatility:
```
Position size = Risk per trade / (RSV × Price × multiplier)
```
Lower RSV allows larger positions; higher RSV requires smaller positions. RSV's drift adjustment makes it more reliable during trends.
### Volatility Regime Detection
Track RSV percentile rank over lookback period:
```
High rank (>80%): High volatility regime — reduce position size, widen stops
Low rank (<20%): Low volatility regime — potential for breakout
```
### Options Pricing Input
RSV provides a realized volatility estimate for comparison with implied volatility:
```
If IV > RSV significantly: Options may be overpriced (sell vol)
If IV < RSV significantly: Options may be underpriced (buy vol)
```
RSV's drift adjustment makes it preferable to HLV/GKV for options analysis during trending markets.
### Trend Quality Assessment
Compare RSV with simpler estimators during trends:
```
If RSV ≈ HLV: Low drift, range-bound market
If RSV < HLV: Significant drift (trending), HLV is overstating vol
```
### Stop-Loss Calibration
Use RSV to set dynamic stop-loss levels:
```
Stop distance = Entry price ± (RSV × K × Price)
where K is a multiplier (typically 1.5-3.0)
```
RSV's drift adjustment prevents stops from being set too wide during strong trends.
## Implementation Notes
### Circular Buffer for SMA
The implementation uses a fixed-size circular buffer for O(1) updates:
```csharp
// Buffer stores RS variance values
_buffer[_bufferIndex]=rsVariance;
_bufferIndex=(_bufferIndex+1)%_period;
_bufferSum=_bufferSum-oldest+rsVariance;
```
This avoids O(n) summation on each update.
### Price Protection
All price ratios are protected against zero/negative values:
```csharp
open=Math.Max(open,1e-10);
close=Math.Max(close,1e-10);
```
### FMA Optimization
The variance calculation uses FMA where beneficial:
- Rogers, L. C. G., & Satchell, S. E. (1991). "Estimating Variance from High, Low and Closing Prices." *Annals of Applied Probability*, 1(4), 504-512.
- Parkinson, M. (1980). "The Extreme Value Method for Estimating the Variance of the Rate of Return." *Journal of Business*, 53(1), 61-65.
- Garman, M. B., & Klass, M. J. (1980). "On the Estimation of Security Price Volatilities from Historical Data." *Journal of Business*, 53(1), 67-78.
- Yang, D., & Zhang, Q. (2000). "Drift-Independent Volatility Estimation Based on High, Low, Open, and Close Prices." *Journal of Business*, 73(3), 477-492.
- Alizadeh, S., Brandt, M. W., & Diebold, F. X. (2002). "Range-Based Estimation of Stochastic Volatility Models." *Journal of Finance*, 57(3), 1047-1091.