GK Vol -- Garman-Klass Volatility Estimator
Contents
Overview
Garman-Klass Volatility is the most efficient single-estimator for historical volatility because it uses all four OHLC prices -- open, high, low, and close -- from each candle. Developed by Mark Garman and Michael Klass in 1980, it extracts the maximum amount of volatility information from standard OHLC data.
The formula incorporates two components:
GK = sqrt( (1/N) * sum( 0.5 * ln(H/L)^2 - (2*ln(2) - 1) * ln(C/O)^2 ) )
The first term ln(H/L)^2 captures the intraday range (similar to Parkinson). The second term ln(C/O)^2 captures the open-to-close movement. By combining both, Garman-Klass achieves approximately 7.4x the efficiency of close-to-close volatility -- meaning it produces equally accurate estimates with far fewer data points.
This makes Garman-Klass the gold standard among single-estimator volatility measures. It is strictly better than Parkinson because it uses additional information (open and close) at no extra cost. The only limitation it does not address is overnight gaps -- the drift between one candle's close and the next candle's open. For that, you need Yang-Zhang volatility.
Format
gk_vol_{period}
The period defines how many candles the estimator averages over.
| Example | Period | Use Case |
|---|---|---|
gk_vol_10 | 10 | Short-term -- tracks recent volatility changes quickly |
gk_vol_20 | 20 | Standard -- the recommended default for most strategies |
gk_vol_50 | 50 | Long-term -- captures the broader volatility regime, very smooth |
Period range: 5 to 500.
Value range: 0 to infinity (annualized volatility, always positive). Typical crypto range: 0.005 to 0.15.
Understanding GK Vol Values
Like Parkinson, GK Vol values are annualized volatility estimates expressed as decimals. They are not bounded to a fixed range. Values depend on the asset, timeframe, and market conditions.
| GK Vol Range | Interpretation |
|---|---|
| Below 0.01 | Ultra-low volatility -- extreme squeeze. The market is barely moving on any dimension (range or body). Strong breakout potential. |
| 0.01 -- 0.04 | Low volatility -- calm, orderly market. Ideal environment for squeeze-based entry strategies. |
| 0.04 -- 0.08 | Moderate volatility -- normal trading conditions for major crypto pairs. Healthy for trend-following strategies. |
| 0.08 -- 0.15 | High volatility -- large moves with significant candle bodies and wicks. Elevated risk per trade. |
| Above 0.15 | Extreme volatility -- crisis or euphoria. Exercise extreme caution with new entries. |
GK Vol tends to produce slightly higher values than Parkinson because it incorporates the open-close component. Do not use Parkinson thresholds for GK Vol directly -- recalibrate through backtesting. The ranges above are approximate for major crypto pairs on hourly timeframes.
Understanding Operators with GK Vol
Each operator behaves differently with GK Vol. As a filter indicator measuring market conditions rather than direction, GK Vol is almost always combined with directional triggers.
< (Less Than) -- State-Based
What it does: The trigger is true on every candle where GK Vol is below the threshold.
On the chart: Volatility is compressed across all dimensions -- small wicks and small candle bodies. The market is coiling. This state-based trigger stays active for as long as GK Vol remains below the threshold.
[[actions.triggers]]
indicator = "gk_vol_20"
operator = "<"
target = "0.03"
timeframe = "1h"
Typical use: Squeeze detection. When GK Vol is low, both the range and the body of candles are small. This is an even more comprehensive squeeze signal than Parkinson alone, because it confirms that neither the wicks nor the closes are showing significant movement.
> (Greater Than) -- State-Based
What it does: The trigger is true on every candle where GK Vol is above the threshold.
On the chart: Volatility is elevated. Candles have large bodies, large wicks, or both. The market is making decisive moves.
[[actions.triggers]]
indicator = "gk_vol_20"
operator = ">"
target = "0.08"
timeframe = "1h"
Typical use: High-volatility filter. Either avoid entries during chaotic conditions, or require that enough volatility exists for trades to be profitable after fees and slippage.
cross_below -- Event-Based
What it does: Fires once, at the exact candle where GK Vol transitions from above the threshold to below it. The previous candle had GK Vol >= the target, and the current candle has GK Vol < the target.
[[actions.triggers]]
indicator = "gk_vol_20"
operator = "cross_below"
target = "0.04"
timeframe = "1h"
Typical use: Detect the transition into a low-volatility regime. The market has just calmed down after a volatile period. This can signal the beginning of a consolidation phase that will eventually resolve with a breakout.
cross_above -- Event-Based
What it does: Fires once, at the exact candle where GK Vol transitions from below the threshold to above it. The previous candle had GK Vol <= the target, and the current candle has GK Vol > the target.
[[actions.triggers]]
indicator = "gk_vol_20"
operator = "cross_above"
target = "0.06"
timeframe = "1h"
Typical use: Detect the moment volatility expands. This captures the exact transition from a quiet market to an active one. A volatility expansion often marks the start of a new trend -- combine with a directional indicator (RSI, ROC, EMA cross) to determine which side to trade.
= (Equal) -- Not Recommended for GK Vol
Why: GK Vol produces floating-point values calculated to many decimal places. Exact equality will almost never be true. Use < or > instead.
- Use
<for squeeze detection -- low GK Vol means the market is quiet on all fronts. - Use
>to filter for sufficient volatility or to block entries during chaos. - Use
cross_below/cross_aboveto detect the exact moment a volatility regime shifts.
TOML Examples
Moderate Volatility with Trend Entry
Enter when GK Vol shows the market is in a healthy range (not too quiet, not too chaotic) and the EMA signals a bullish trend.
[[actions]]
type = "open_long"
amount = "100 USDC"
[[actions.triggers]]
indicator = "gk_vol_20"
operator = ">"
target = "0.02"
timeframe = "1h"
[[actions.triggers]]
indicator = "gk_vol_20"
operator = "<"
target = "0.08"
timeframe = "1h"
[[actions.triggers]]
indicator = "ema_21"
operator = ">"
target = "ema_55"
timeframe = "1h"
GK Vol Band Filter -- Goldilocks Zone
Only trade when volatility is in the "goldilocks zone" -- enough movement for profitable trades, but not so much that risk is uncontrollable. Combine with an RSI dip entry.
[[actions]]
type = "open_long"
amount = "100 USDC"
[[actions.triggers]]
indicator = "gk_vol_20"
operator = ">"
target = "0.025"
timeframe = "1h"
[[actions.triggers]]
indicator = "gk_vol_20"
operator = "<"
target = "0.07"
timeframe = "1h"
[[actions.triggers]]
indicator = "rsi_14"
operator = "<"
target = "30"
timeframe = "1h"
EMA Cross with Volatility Confirmation
Only act on an EMA crossover when GK Vol confirms the market has enough energy for the trend to follow through.
[[actions]]
type = "open_long"
amount = "100 USDC"
[[actions.triggers]]
indicator = "ema_9"
operator = "cross_above"
target = "ema_21"
timeframe = "1h"
[[actions.triggers]]
indicator = "gk_vol_20"
operator = ">"
target = "0.03"
timeframe = "1h"
Volatility Regime Change Detection
Detect the exact moment the market transitions from low to higher volatility. When GK Vol crosses above the threshold while momentum is positive, ride the expansion.
[[actions]]
type = "open_long"
amount = "75 USDC"
[[actions.triggers]]
indicator = "gk_vol_20"
operator = "cross_above"
target = "0.04"
timeframe = "1h"
[[actions.triggers]]
indicator = "roc_10"
operator = ">"
target = "1"
timeframe = "1h"
Tips
Garman-Klass is theoretically 7.4x more efficient than close-to-close volatility, meaning it needs far fewer candles to produce an equally accurate estimate. This makes it the best single indicator for volatility measurement when you have standard OHLC data. If you can only pick one volatility estimator, GK Vol is the strongest choice.
Running Parkinson, GK Vol, and Yang-Zhang simultaneously gives you a complete volatility picture. If all three agree that volatility is low, you have a high-confidence squeeze. If Parkinson is low but GK Vol is moderate, it means the open-close moves are significant even though the high-low range is small -- the market is trending within its range. These divergences provide additional strategic insight.
Like all volatility estimators, GK Vol values differ dramatically between assets. BTC/USDC might show GK Vol of 0.04 in normal conditions, while a volatile altcoin might sit at 0.12. Never reuse thresholds across different trading pairs. Backtest on each specific pair and timeframe to determine what "low," "moderate," and "high" mean for that asset.
Garman-Klass assumes that the open of each candle equals the close of the previous candle -- it ignores any gap between them. While cryptocurrency markets trade 24/7 (minimizing true overnight gaps), there can still be significant jumps between candle closes and opens during exchange maintenance, liquidity gaps, or fast-moving markets. If gap-driven volatility is important to your strategy, use Yang-Zhang volatility which explicitly accounts for inter-candle drift.