The second notebook in my TiPortfolio series looks at volatility targeting. The idea is simple: instead of holding fixed weights, you scale your exposure up when markets are calm and scale down when things get choppy. Target a constant level of risk rather than constant dollar allocation.
Sounds like an improvement over the fixed-ratio approach. Let me show you what happened.
The Strategy
Weigh.BasedOnHV (historical volatility) scales an initial ratio so the portfolio's annualised volatility stays near a target. It uses a 1-month lookback to estimate recent vol.
- When realised vol < target → weights scale up (you take more risk when things are calm)
- When realised vol > target → weights scale down (cash buffer builds up during turbulence)
vol_target = ti.Portfolio(
"vol_target_15pct",
[
ti.Signal.Quarterly(),
ti.Select.All(),
ti.Weigh.BasedOnHV(
initial_ratio={"QQQ": 0.7, "BIL": 0.2, "GLD": 0.1},
target_hv=0.15,
lookback=pd.DateOffset(months=1),
),
ti.Action.Rebalance(),
],
TICKERS,
)
I used quarterly rebalancing here — fewer trades than monthly.
Results (2019–2024)
sharpe 0.498
calmar 0.446
sortino 0.604
max_drawdown -0.295
cagr 0.131
total_return 1.369
final_value 23693.268
total_fee 4.319
rebalance_count 28
Compared to the fixed 70/20/10 baseline:
vol_target_15pct fixed_70_20_10 qqq_only
sharpe 0.498 0.642 0.684
max_drawdown -0.295 -0.264 -0.351
cagr 0.131 0.144 0.192
final_value 23693.268 25588.316 34106.625
total_fee 4.319 0.939 0.233
This is honestly not great. The vol target strategy ended up with worse results on almost every metric — lower Sharpe, lower CAGR, worse drawdown, and 4.6x the fees.
What Went Wrong
A few things:
- The fee impact is real. The vol-targeting strategy traded $4.32 in fees vs $0.94 for the fixed ratio portfolio. With a $10,000 starting balance, that 4x fee drag adds up over 6 years.
- The 2020 crash happened too fast. Volatility targeting requires time to detect regime changes. In March 2020, the market fell so quickly that the strategy was still leveraged up when the crash hit, and could not de-risk fast enough.
- Quarterly rebalancing is too slow. The signal fires every quarter, but vol can spike daily. By the time it rebalances, the damage is done.
Sensitivity Analysis
I also tested a more conservative 10% vol target:
vol_target_15pct vol_target_10pct
sharpe 0.498 0.438
max_drawdown -0.295 -0.200
cagr 0.131 0.096
final_value 23693.268 18956.428
total_fee 4.319 2.678
Lower target vol → lower max drawdown (good) but lower CAGR and Sharpe (not good). The 10% target is basically saying "stay in cash a lot" — which reduces your upside more than it protects you.
My Take
The volatility targeting concept makes sense in theory, especially for larger portfolios where you can trade more frequently and the fee impact is smaller. For a small retail portfolio over 6 years, the transaction costs and execution lag killed the edge.
This strategy might work better with:
- Monthly or weekly rebalancing
- A larger portfolio where fee ratios are smaller
- A longer lookback window to reduce false signals
Next I look at regime switching using VIX, which tries to solve the "too slow to react" problem differently.
This Series
- Part 1: Fixed Ratio Rebalancing
- Part 2: Volatility Targeting ← you are here
- Part 3: VIX Regime Switching
- Part 4: Dollar-Neutral Pair Trade
- Part 5: Beta-Neutral Dynamic Strategy
- Part 6: Auto Investment Plan (DCA)