← Back to Home
Riding the Trend Volatility-Scaled Time-Series Momentum

Riding the Trend Volatility-Scaled Time-Series Momentum

Trend following, or Time-Series Momentum (TSMOM), is one of the most enduring and studied strategies in financial markets. The concept is simple: buy assets that have been going up and sell (or short) assets that have been going down. While historically profitable, traditional TSMOM strategies can exhibit fluctuating risk levels, leading to a bumpy ride for investors. Enter Volatility Scaling – a sophisticated refinement designed to navigate these turbulent waters by aiming for a more consistent risk profile.

This article delves into the world of Volatility-Scaled Time-Series Momentum, explaining its mechanics, rationale, and why it has become a cornerstone of many quantitative investment approaches.

The Allure of Time-Series Momentum

At its heart, Time-Series Momentum operates on the principle of inertia in price movements. The typical signal is generated by looking at an asset’s total return over a specified past period, commonly 12 months.

The Challenge: The Unpredictable Nature of Risk

A classic TSMOM strategy that allocates a fixed amount of capital (or takes a fixed position size, like +1 or -1 unit) to an asset based on its trend signal faces a significant challenge: the actual risk taken is not constant. It ebbs and flows with the underlying asset’s own volatility.

Imagine an asset suddenly enters a period of high turbulence. A fixed position size now represents a much larger risk exposure. Conversely, during calm market phases, the same fixed position might represent an underutilization of the strategy’s risk budget, potentially leaving profits on the table. This fluctuating risk can lead to an unpredictable equity curve and larger-than-desired drawdowns.

The Solution: Volatility Scaling – Targeting Constant Risk

Volatility scaling addresses this challenge head-on by dynamically adjusting the size of the position in inverse proportion to the asset’s recently observed volatility. The goal is to maintain a more consistent level of risk contribution from the strategy over time.

Here’s how it works:

  1. Measure Realized Volatility: First, the strategy estimates the asset’s recent historical volatility. This is typically done by calculating the standard deviation of its daily returns over a lookback period (e.g., the past 60 trading days, or approximately three months) and then annualizing this figure.

  2. Set a Target Volatility: The manager decides on a target_volatility level. This is a crucial parameter representing the desired annualized risk level for the position or the overall strategy (e.g., 10%, 15%, or even higher for more volatile assets like cryptocurrencies, perhaps 40-60%).

  3. Calculate the Scaling Factor: The position size is then scaled using the formula: Scaling Factor = Target Volatility / Asset's Realized Volatility

  4. Determine Final Position Size: The basic momentum signal (e.g., +1 for long, -1 for short) is then multiplied by this scaling factor: Position Size = Momentum Signal * Scaling Factor

The effect is intuitive:

By doing this, the strategy attempts to ensure that the expected risk of the position (Position Size * Asset's Realized Volatility) remains close to the Target Volatility.

How It Works: Step-by-Step

Implementing a Volatility-Scaled TSMOM strategy typically involves the following logical steps, often performed daily. For those familiar with Python and pandas, here’s how some of these core calculations might look:

  1. Obtain Asset Data & Calculate Daily Returns: Gather historical price data and compute daily percentage changes.

  2. Generate Momentum Signal: Based on information available up to the previous day (e.g., using the past 12 months’ return ending yesterday), determine the momentum signal.

    # Assuming 'df' is a pandas DataFrame with a 'Close' price column
    # and 'momentum_window' (e.g., 252) is defined.
    
    # Calculate price 12 months (momentum_window days) and 1 day ago
    price_t_minus_1 = df['Close'].shift(1)
    price_t_minus_1_minus_12m = df['Close'].shift(momentum_window + 1)
    
    # Calculate 12-month lookback return ending yesterday
    df['Momentum_Lookback_Return'] = (price_t_minus_1 / price_t_minus_1_minus_12m) - 1
    
    # Generate the signal (+1 for positive return, -1 for negative)
    df['Momentum_Signal'] = np.sign(df['Momentum_Lookback_Return'])
    df['Momentum_Signal'] = df['Momentum_Signal'].fillna(0) # Handle initial NaNs
  3. Estimate Realized Volatility: Calculate the annualized standard deviation of daily returns over a recent past window (e.g., the last 60 days, using data up to yesterday).

    # Assuming 'df' has 'Daily_Return', and 'volatility_window' (e.g., 60)
    # and 'annualization_factor' (e.g., 252) are defined.
    
    # Calculate daily volatility based on returns up to yesterday
    daily_returns_shifted = df['Daily_Return'].shift(1)
    df['Realized_Vol_Daily'] = daily_returns_shifted.rolling(window=volatility_window).std()
    
    # Annualize the daily volatility
    df['Realized_Vol_Annualized'] = df['Realized_Vol_Daily'] * np.sqrt(annualization_factor)
  4. Determine Volatility Scaling Factor & Final Position: Adjust realized volatility to prevent division by near-zero, calculate the scaling factor, apply leverage caps, and compute the final target position.

    # Assuming 'df' has 'Momentum_Signal', 'Realized_Vol_Annualized'.
    # Also, 'target_annual_vol', 'min_vol_for_scaling', and 'max_leverage' are defined.
    
    # Adjust realized volatility (floor it at min_vol_for_scaling)
    df['Vol_For_Scaling'] = np.maximum(df['Realized_Vol_Annualized'], min_vol_for_scaling)
    
    # Calculate the raw scaling factor
    df['Scaling_Factor'] = target_annual_vol / df['Vol_For_Scaling']
    
    # Cap the leverage
    df['Scaling_Factor_Capped'] = df['Scaling_Factor'].clip(lower=0, upper=max_leverage)
    
    # Determine final target position
    df['Target_Position'] = df['Momentum_Signal'] * df['Scaling_Factor_Capped']
  5. Calculate Strategy Returns: The daily return of the strategy is this target position multiplied by the asset’s actual daily return for the current day.

Why Scale by Volatility? The Benefits

Adopting volatility scaling within a TSMOM framework offers several compelling advantages:

Key Parameters and Important Considerations

While powerful, the effectiveness of a Volatility-Scaled TSMOM strategy hinges on several well-chosen parameters and an awareness of practicalities:

Visualizing the Impact

When analyzing such a strategy, plots can be very revealing. One would typically observe:

Pasted image 20250522223841.png

Conclusion: A More Refined Approach to Trend Following

Volatility-Scaled Time-Series Momentum represents a significant evolution from basic trend-following rules. By explicitly incorporating the prevailing risk environment into its position sizing decisions, it strives for a more stable and predictable risk journey. While it doesn’t guarantee higher absolute returns in all market conditions, its focus on risk management can lead to improved risk-adjusted performance and potentially a smoother ride for investors. As with any quantitative strategy, meticulous research, robust backtesting, and a clear understanding of all its moving parts are paramount to successful implementation.