Historical Volatility (HV) measures how much an asset's price actually moved over a past period, expressed as an annualized percentage. It is the statistical foundation of risk measurement — the number that tells you what the market actually did, not what options traders expect it to do next.

Volatility
Category
Advanced
Difficulty
0% to 200%+ (annualized percentage)
Output Range
20 trading days (most common); also 10, 30, 60
Default Period
None
Repaint Risk
Moderate — requires 30+ bars of closing price history
Data Need
VOLATILITY · DATA_INTENSIVE · CODE_HEAVY · LAGGING
Tags

Section 1: Core Mechanics

Historical Volatility is the annualized standard deviation of logarithmic daily returns. It answers the question: "If this asset's daily price changes over the last N days represent the typical risk, how much would it be expected to move over an entire year?"

Formula

Step 1 — Calculate daily log returns:

Step 2 — Calculate the standard deviation of log returns over N days:

Step 3 — Annualize by multiplying by the square root of trading days per year:

Where 252 is the standard number of US equity trading days per year. Forex uses 252 or 260. Crypto markets use 365 (continuous trading).

The result: HV = 25% means the asset's historical price volatility implies a ±25% move at 1 standard deviation over the next year. A 1 SD move in one month = 25% ÷ √12 ≈ 7.2%.

Inputs

  • Close price: Daily closing prices (the only required input)
  • Period (N): Lookback in trading days. Common values: 10, 20, 30, 60.
  • Trading days per year: 252 (equities), 365 (crypto), 260 (some forex)

Parameters

Parameter Default Range Impact
Period (N) 20 5–252 Shorter = reacts to recent volatility; Longer = regime-level average
Annualization factor 252 252/260/365 Must match asset class — wrong value distorts comparison to IV
Return type Log return Log / Simple Log returns are standard in finance — simple returns slightly overestimate

Output

HV is a percentage that plots as a line on a sub-panel below the price chart. Rising HV = volatility expanding. Falling HV = volatility contracting. Multiple HV periods (e.g., HV10, HV20, HV60) shown simultaneously reveal short-term vs. long-term volatility dynamics.

Visual Behavior

  • HV(20) > HV(60): Short-term volatility is elevated above the long-term baseline — recent event or spike
  • HV(20) < HV(60): Market has calmed below its long-term norm — compressed regime
  • HV making a multi-month low: Classic pre-breakout compression signal

Section 2: Interpretation & Signals

HV Regime Identification

HV(20) Level Interpretation Action
Below 10% (equities) Extreme low volatility — market is complacent Breakout potential; watch for catalyst
10%–20% Normal low-volatility regime Trend-following strategies work well
20%–35% Elevated volatility — active market Wider stops; reduce position size
Above 40% High-volatility regime Crisis or earnings-driven; avoid momentum chasing
Above 80% Extreme (rare except in crashes) Short-vol strategies dominate; directional trading very risky

HV vs. Implied Volatility — The Options Edge

The most powerful use of HV is comparison against Implied Volatility (IV):

HV(20) vs. IV — Options Pricing Divergence

When IV > HV significantly (IV premium > 5–10 points): Options are priced more expensively than realized volatility justifies. Selling premium (covered calls, cash-secured puts, iron condors) is statistically favorable.

When IV < HV: Options are priced below realized volatility. Buying options for directional bets offers better statistical value — the market is underpricing risk.

💡 TIP
A professional rule of thumb: when IV > HV(20) by more than 1.3× (30% premium), options sellers have a statistical edge. When IV < HV(20) × 0.8, options buyers have a statistical edge. These thresholds are not guarantees — they shift the probability of a profitable premium collection.
⚠️ WARNING
HV is backward-looking by definition. An asset can have HV(20) = 15% (calm recent past) and then gap 20% on an earnings surprise — the HV told you nothing about the future. IV is a market consensus forecast of future volatility. When IV is elevated before an event (earnings, Fed meeting), it is often pricing in a real risk that HV doesn't capture.

Section 3: Pass vs. Live — Real-Time Reliability

None — HV uses closed bars only
Repaint Risk
20-bar calculation means you are always measuring the past 20 days
Lag
HV updates once per day (for daily HV) at bar close
Confirmation Timing
Volatility regime identification; HV vs. IV options edge calculation; stop sizing context
Best Use
Using HV as a standalone trading signal — it is a measurement tool, not a signal generator
Avoid

HV does not repaint. Once a bar closes and its log return is computed, it joins the historical record and never changes. Because HV is a daily metric (standard), it updates once per trading day at market close.


Section 4: Practical Use Cases

Setup: HV(20) on daily chart as a context filter — check once per day before session Signal: HV(20) > 30% → widen intraday stops; HV(20) < 15% → tighten stops Entry: HV does not generate entries — use for stop and size context only Key rule: High HV day → reduce position size by 30–50%; stops need to be wider and fewer trades

Real example: AAPL before Q3 2023 earnings (July 2023): HV(20) was 14.8%. IV (from at-the-money weekly options) was 38.0% — a 2.6× premium. Selling a strangle (short call + short put) one week before earnings captured the IV crush post-earnings. The stock moved 1.2% post-announcement while the options had priced in a 4.5% move. Premium sellers collected approximately 80% of max profit.


Section 5: Pseudo Code

INPUT: close[], period=20, annual_factor=252

PROCESS:
  Step 1: Calculate daily log returns starting from bar 1 (not bar 0)
            log_returns[i] = ln(close[i] / close[i-1])
            # Bar 0 has no previous close — log_returns[0] = NaN

  Step 2: For each bar i starting from index period (need period log returns):
            window = log_returns[i-period+1 : i+1]
            mean_r = sum(window) / period
            variance = sum((r - mean_r)^2 for r in window) / period
            # Note: use N (not N-1) for population std; some platforms use N-1
            daily_vol = sqrt(variance)
            hv[i] = daily_vol * sqrt(annual_factor) * 100

OUTPUT: hv[] — annualized historical volatility as percentage
EDGE CASES:
  - Fewer than period+1 bars (need one extra for first return): return all NaN
  - Close of 0: ln(0) is undefined — handle as NaN; flag data error
  - Identical consecutive closes: log return = 0, contributes zero variance (valid)
  - Gap trading days (weekends skipped): log returns are calculated on consecutive available closes — gaps compress weekend/holiday moves into Friday→Monday returns (standard practice)

Section 6: Parameters & Optimization

Standard HV Periods

Period Name Primary Use
10 Very short-term Captures recent 2-week volatility spike; react fast
20 Short-term (most common) Standard monthly HV; best comparison baseline against IV
30 Medium-term 6-week view; less noise than HV(20)
60 Medium-long term 3-month view; regime identification
252 1-year realized vol Annual volatility baseline; used in options pricing models

Period Impact

Change Effect When to Use
Shorter period (10) Captures current volatility spike; noisy Earnings/events — need to see current panic level
Default (20) Balanced signal; matches monthly options pricing Standard regime identification and IV comparison
Longer period (60+) Smooths out events; reveals structural vol regime Position-level context; long-term vol analysis
Should I use N or N-1 in the denominator for variance?

Financial convention uses N (population standard deviation) for HV, not N-1 (sample). Most charting platforms and Bloomberg use N. Using N-1 slightly increases the HV value, which is more conservative (slightly higher estimate). For options pricing model comparisons, ensure you match the convention your platform uses — mixing N and N-1 creates a small but consistent discrepancy.

What annualization factor should I use for crypto?

Crypto markets trade 365 days per year, 24/7. Use annual_factor = 365 for crypto HV. Using 252 (equities) on crypto will understate annualized volatility by approximately 20% (sqrt(365/252) ≈ 1.20). When comparing crypto HV against crypto IV on options platforms (Deribit, LedgerX), ensure both use 365 — the platform should document its convention.


Section 7: Synergies & Conflicts

Works Well WithAvoid Combining With
Implied VolatilityThe natural counterpart — HV is realized vol, IV is expected vol. The gap between them is the options pricing edge. Track HV(20) and current ATM IV together
ATRATR is the daily raw volatility; HV is the annualized statistical version. They tend to move together but HV gives context for regime; ATR gives actionable stop sizes
Bollinger Band WidthBand Width measures short-term volatility expansion/contraction; HV measures the same thing over a longer window. Both contracting together = strong squeeze signal
Donchian ChannelsDC finds breakout direction; HV identifies volatility regime. Low HV before a DC breakout = pre-compression setup (high quality)
RSI / MACDThese are momentum indicators — conceptually unrelated to volatility measurement. Using them together creates category mixing (momentum vs. risk) without clear confluence logic
Simple Range (High-Low)Simple range ignores gaps; log returns capture overnight gaps. HV is strictly superior for volatility measurement — do not substitute High-Low average

Section 8: Common Mistakes

Mistake Root Cause Solution
Using simple returns instead of log returns Log returns are less intuitive but mathematically correct for compounding Always use ln(Closei / Close{i-1}) — most platforms default to this
Comparing HV to IV without matching periods HV(10) vs. IV(30-day) creates apples-to-oranges comparison Match HV period to the options expiration you are comparing: 30-day IV → HV(20) or HV(30)
Using wrong annualization factor Applying 252 to crypto (should be 365) Check asset class: equities=252, crypto=365, some forex=260
Treating HV as a signal generator HV shows what happened, not what will happen Use HV as a regime filter and IV comparison tool only — pair with a breakout or momentum signal for entries
Ignoring HV during calm periods Low HV seems uninteresting Low HV is when the premium-selling setup is being built — the subsequent IV spike is the opportunity

Section 9: Cheat Sheet

ℹ️ INFO
**Historical Volatility (HV)**

USE WHEN: Comparing against IV to find options premium edge; identifying volatility regime (high/low/normal); calibrating stop sizes and position sizes to current risk environment
AVOID WHEN: Expecting directional buy/sell signals — HV is a measurement tool, not a signal

ENTRY SIGNAL: Not a standalone entry signal. Use HV regime context with breakout or momentum indicators
EXIT SIGNAL: Not applicable — HV calibrates risk management; does not time exits directly

PARAMETERS: HV(20) for IV comparison; HV(10) for current spike detection; HV(60) for regime identification. Annual factor: 252 equities, 365 crypto
CONFLUENCE: IV rank/percentile (options premium edge) + ATR (stop sizing) + Bollinger Squeeze (compression setup)

RISK: HV is backward-looking — cannot predict future vol spikes from earnings, geopolitics, or macro events
BEST TIMEFRAME: Daily chart closes for all HV calculations — intraday HV requires different methodology (realized vol using intraday bars)