Volatility Indicators

Historical Volatility: Past Price Variability | AlfaTactix

📖 6 min read

📝 1,115 words

🏷️ Volatility Indicators

In this page: what Historical Volatility is, how it works, when to use it, a practical example with code, and a bonus tip.

Use Historical Volatility in a real strategy—no code required

Create a free account to save your progress and build strategies with this indicator and 80+ others in minutes. Backtest, then export to MQL5.


Historical Volatility on a price chart: illustration of the indicator and how it is used in technical analysis
Historical Volatility – chart illustration

Historical Volatility Indicator Explanation

The Historical Volatility (HV) is a volatility indicator that measures the volatility of an asset's returns over a specified historical period by calculating the standard deviation of price returns. Developed as a fundamental concept in quantitative finance and options pricing, Historical Volatility quantifies how much an asset's price has fluctuated in the past, providing a measure of expected future volatility based on historical patterns. Higher Historical Volatility values indicate greater price fluctuation (higher risk), while lower values indicate more stable prices (lower risk). Historical Volatility is commonly used for risk assessment, options pricing, and volatility forecasting.

How Historical Volatility Works: Historical Volatility is calculated by first computing the logarithmic returns of the asset over a specified period (typically 20-30 periods for daily data), then calculating the standard deviation of these returns, and annualizing the result. The formula is: Return = ln(Close[t] / Close[t-1]), Variance = Σ(Return - Mean Return)² / (n-1), Standard Deviation = √Variance, and Historical Volatility = Standard Deviation × √(252) for daily data, where 252 is the number of trading days in a year. The annualization factor adjusts the volatility to an annualized percentage. This statistical measure provides a numerical representation of price volatility: higher values indicate higher historical volatility, while lower values indicate lower historical volatility.

When to Use Historical Volatility:

  • Risk Assessment: Historical Volatility is highly effective at assessing the risk level of an asset based on its past price movements. Higher HV indicates higher risk and potential for larger price swings, while lower HV indicates lower risk and more stable prices.
  • Options Pricing and Trading: Historical Volatility is crucial for options pricing models (e.g., Black-Scholes), as it helps estimate the expected volatility of the underlying asset. Traders compare Historical Volatility to Implied Volatility to identify mispriced options.
  • Volatility Forecasting: Historical Volatility can be used to forecast future volatility, as assets often exhibit mean-reverting volatility patterns. High HV periods often revert to average levels, while low HV periods often expand.

Advantages:

  • Provides a clear, objective measure of historical price volatility through statistical analysis, making it easy to compare volatility across different assets and timeframes. The annualized format ensures comparability.
  • Works effectively across multiple timeframes and asset classes, including stocks, forex, commodities, and cryptocurrencies. The statistical nature makes it universally applicable.
  • Helps identify volatility patterns and anticipate future volatility changes, as historical volatility often exhibits mean-reverting behavior. The annualized measurement improves reliability.

Limitations:

  • Historical Volatility is backward-looking and may not accurately reflect future volatility, especially during market regime changes or unexpected events. Past performance does not guarantee future results.
  • The indicator may lag behind rapid volatility changes, as it relies on historical price data. The calculation uses standard deviation of returns, which can delay response to sudden volatility spikes.
  • Historical Volatility alone does not provide specific entry or exit signals, only historical volatility measurement. Traders should use it in combination with other indicators for comprehensive analysis.

In summary, Historical Volatility is a valuable volatility indicator that provides annualized measurement of historical price volatility, making it ideal for risk assessment, options pricing, and volatility forecasting based on past price patterns. For comprehensive understanding, refer to quantitative finance literature on volatility measurement, Investopedia's Historical Volatility guide, and academic research on volatility forecasting in financial markets published in journals such as the Journal of Financial Markets and Quantitative Finance journals.

Practical Example: Using the Historical Volatility Indicator in a Trading Strategy

The Historical Volatility (HV) is a volatility indicator used to measure historical price volatility through annualized standard deviation of returns. In a trading strategy, the Historical Volatility indicator helps traders assess risk levels and adjust position sizes based on historical volatility patterns.

Scenario: You're creating a volatility-based position sizing strategy for Apple stock (AAPL) on a daily chart. You want to adjust position sizes based on Historical Volatility: smaller positions during high volatility periods and larger positions during low volatility periods.

Strategy Logic:

  • Calculate the Historical Volatility(20) using 20-period logarithmic returns, then annualize the standard deviation. Historical Volatility measures annualized volatility, with higher values indicating higher risk and lower values indicating lower risk.
  • Position sizing: When Historical Volatility is above a threshold (e.g., 30%), reduce position size to 50% of normal size. When Historical Volatility is below a threshold (e.g., 15%), use normal position size.
  • Risk management: Set stop-loss at 2× Historical Volatility / √(252) below entry price for long positions, adjusting dynamically to volatility levels.

Backtrader Example:

import backtrader as bt
import numpy as np

class HistoricalVolatilityPositionSizingStrategy(bt.Strategy):
    params = dict(
        hv_period=20,
        high_volatility_threshold=30.0,  # Annualized %
        low_volatility_threshold=15.0,   # Annualized %
        trading_days_per_year=252
    )
    
    def __init__(self):
        # Calculate logarithmic returns
        returns = bt.ind.LogReturn(self.data.close, period=1)
        # Calculate standard deviation of returns
        std_returns = bt.ind.StdDev(returns, period=self.p.hv_period)
        # Annualize: multiply by sqrt(trading days per year)
        annualization_factor = np.sqrt(self.p.trading_days_per_year)
        self.historical_volatility = std_returns * annualization_factor * 100  # Convert to percentage
        
    def next(self):
        if not self.position:
            # Calculate position size based on Historical Volatility
            if self.historical_volatility[0] > self.p.high_volatility_threshold:
                # High volatility: smaller position (50% of normal)
                size = self.broker.getcash() * 0.01  # 1% of cash
            elif self.historical_volatility[0] < self.p.low_volatility_threshold:
                # Low volatility: normal position
                size = self.broker.getcash() * 0.02  # 2% of cash
            else:
                # Medium volatility: reduced position (75% of normal)
                size = self.broker.getcash() * 0.015  # 1.5% of cash
            
            if self._entry_signal():
                self.buy(size=size)
        else:
            # Dynamic stop-loss based on Historical Volatility
            daily_volatility = self.historical_volatility[0] / np.sqrt(self.p.trading_days_per_year)
            stop_distance = daily_volatility * 2.0  # 2 standard deviations
            if self.position.size > 0:  # Long position
                stop_price = self.data.close[0] - (stop_distance / 100) * self.data.close[0]
            else:  # Short position
                stop_price = self.data.close[0] + (stop_distance / 100) * self.data.close[0]
            
            if self._stop_triggered(stop_price):
                self.close()
    
    def _entry_signal(self):
        # Add entry logic
        return False
    
    def _stop_triggered(self, stop_price):
        # Add stop logic
        return False

# Usage
cerebro = bt.Cerebro()
cerebro.addstrategy(HistoricalVolatilityPositionSizingStrategy)

Expected Outcome: By using the Historical Volatility indicator, your strategy adjusts position sizes and stop-loss levels based on historical volatility patterns, helping you manage risk more effectively by reducing exposure during high volatility periods and maximizing exposure during low volatility periods. This approach leads to better risk management, improved position sizing, and enhanced stability across different volatility regimes.

💡 Bonus Tip

Consider using Historical Volatility in combination with Implied Volatility (for options) or other volatility indicators like ATR for confirmation. When Historical Volatility is significantly different from Implied Volatility, it may indicate mispricing opportunities in options markets. When Historical Volatility is low and begins to rise, it often precedes significant price movements. This technique, documented in quantitative finance literature, can significantly improve the effectiveness of volatility-based trading strategies.

Using the Historical Volatility indicator ensures your strategy adapts to historical volatility patterns, improving risk management based on annualized volatility measurement.

Use Historical Volatility in a real strategy—no code required

Create a free account to save your progress and build strategies with this indicator and 80+ others in minutes. Backtest, then export to MQL5.

Try Strategy Builder

Use this indicator in Strategy Builder — free

Create free account