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.
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.
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.
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:
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.
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%).
Calculate the Scaling Factor: The position size
is then scaled using the formula:
Scaling Factor = Target Volatility / Asset's Realized Volatility
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
.
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:
Obtain Asset Data & Calculate Daily Returns: Gather historical price data and compute daily percentage changes.
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
= df['Close'].shift(1)
price_t_minus_1 = df['Close'].shift(momentum_window + 1)
price_t_minus_1_minus_12m
# Calculate 12-month lookback return ending yesterday
'Momentum_Lookback_Return'] = (price_t_minus_1 / price_t_minus_1_minus_12m) - 1
df[
# Generate the signal (+1 for positive return, -1 for negative)
'Momentum_Signal'] = np.sign(df['Momentum_Lookback_Return'])
df['Momentum_Signal'] = df['Momentum_Signal'].fillna(0) # Handle initial NaNs df[
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
= df['Daily_Return'].shift(1)
daily_returns_shifted 'Realized_Vol_Daily'] = daily_returns_shifted.rolling(window=volatility_window).std()
df[
# Annualize the daily volatility
'Realized_Vol_Annualized'] = df['Realized_Vol_Daily'] * np.sqrt(annualization_factor) df[
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)
'Vol_For_Scaling'] = np.maximum(df['Realized_Vol_Annualized'], min_vol_for_scaling)
df[
# Calculate the raw scaling factor
'Scaling_Factor'] = target_annual_vol / df['Vol_For_Scaling']
df[
# Cap the leverage
'Scaling_Factor_Capped'] = df['Scaling_Factor'].clip(lower=0, upper=max_leverage)
df[
# Determine final target position
'Target_Position'] = df['Momentum_Signal'] * df['Scaling_Factor_Capped'] df[
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.
Adopting volatility scaling within a TSMOM framework offers several compelling advantages:
While powerful, the effectiveness of a Volatility-Scaled TSMOM strategy hinges on several well-chosen parameters and an awareness of practicalities:
When analyzing such a strategy, plots can be very revealing. One would typically observe:
Target Position
(or leverage)
dynamically changing – shrinking when realized volatility spikes and
expanding when it subsides.Target Volatility
level.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.