09 — Portfolio Construction

Rebalancing Strategies#

MaintenanceStatistical1 min read
◆ The PatternMaintain target allocations through disciplined rebalancing

As prices move, actual weights drift from targets. Rebalancing is a contrarian mechanism — sell winners, buy losers — that harvests the diversification return. Two approaches: calendar (monthly, quarterly) and threshold (rebalance when drift exceeds a band).

Drifti = | wactual,i − wtarget,i |
Wider bands reduce transaction costs but increase tracking error. The optimal band depends on volatility, expected return differences, and trading costs.
// Interactive — rebalancing bands and drift over time
Band width %
Tax efficiency. Threshold-based rebalancing combined with tax-loss harvesting can add value after tax, but the size depends on the tax regime and market path.
Pattern bridge: Rebalancing sells what ran ahead and buys what fell behind — a standing bet that regression to the mean holds, and the disciplined opposite of herd behaviour.
Worked example

Ten years of simulated monthly returns on a 60/40 portfolio. A threshold rule — trade back to 60/40 only when stocks drift more than 5 points away — trades just 3 times. Left alone, the same portfolio ends at 45/55: in this run stocks lagged, and doing nothing would have quietly halved the gap between them and bonds. Drift can go either way; the point is that it is not a choice.

Where it misleads
  • Rebalancing controls risk; it does not reliably add return. When one asset trends for years, it sells the winner all the way up.
  • The “diversification return” from rebalancing is real but small, and depends on volatility and low correlation (Booth & Fama 1992).
  • Costs and taxes make tight bands expensive; most of the risk control comes from wide bands checked now and then (Jaconetti, Kinniry & Zilbering 2010).
In code
rng = np.random.default_rng(5)
r = np.column_stack([rng.normal(0.008, 0.045, 120), rng.normal(0.003, 0.012, 120)])   # ten years, monthly, simulated
target, band = np.array([0.6, 0.4]), 0.05
w, trades, drift = target.copy(), 0, target.copy()
for m in r:
    w = w * (1 + m); w /= w.sum()                          # weights drift with returns
    drift = drift * (1 + m); drift /= drift.sum()          # never rebalanced
    if abs(w[0] - target[0]) > band:                       # threshold rule: back to 60/40 when 5 points off
        w, trades = target.copy(), trades + 1
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet carries its own example numbers; the comments say which are made up or simulated.

Sources
  • D. G. Booth & E. F. Fama, “Diversification Returns and Asset Contributions”, Financial Analysts Journal 48(3), 1992
  • C. M. Jaconetti, F. M. Kinniry Jr. & Y. Zilbering, Best Practices for Portfolio Rebalancing, Vanguard research, 2010

Last reviewed October 2026 · How this site checks its content · Report a mistake

Linked from 1
← Previous
Factor Models
Open in the full reader, with the topic sidebar