Portfolio lab: pre-registered specification
Written 2026-10-01, before any results. Parameters come from the literature or from common practice and are not tuned on Indian data. Any change must be logged here with the date and the reason.
Assets (total return, in rupees; see compute/assets.py)
- Equity: Nifty 500 TRI (bad prints repaired against the price index).
- Bonds: NSE 5-year benchmark G-sec index.
- Gold: domestic INR gold, including import duty.
- Cash: accrued 91-day T-bill yield.
- Common start: the first month-end when all four exist (2001-09). Results run to the latest common date.
Portfolios
All of these use annual rebalancing at the first session of each calendar year, unless stated otherwise. Weights are equity / G-sec / gold / cash.
| Code | Portfolio | Weights or rule | Rebalance |
|---|---|---|---|
equity | All equity | 100 / 0 / 0 / 0 | none (buy and hold) |
sixty_forty | 60/40 | 60 / 40 / 0 / 0 | annual |
sixty_twenty_twenty | 60/20/20 | 60 / 20 / 20 / 0 | annual |
permanent | Permanent portfolio (Browne) | 25 / 25 / 25 / 25 | annual |
equal_three | Equal weight, three assets | 33.3 / 33.3 / 33.3 / 0 | annual |
risk_parity | Inverse-volatility weights over equity, G-sec and gold, using 252-session realised volatility | computed at each month-end | monthly |
gtaa3 | Faber-style tactical: one third each to equity, G-sec and gold; a sleeve whose month-end level is below its 10-month average goes to cash | monthly | |
dual_momentum | Antonacci-style: hold whichever of equity or gold has the higher 12-month return, if it beats cash over 12 months; otherwise hold G-sec | monthly | |
sixty_forty_trend | 60/40, with the equity sleeve in cash when Nifty 500 is below its 10-month average | monthly |
Timing: decisions use month-end (or year-end) closes, and trades happen at the next session’s close.
Costs: 0.10% of value traded each way. Running costs are equity 0.15%, G-sec 0.20%, gold 0.50% and cash 0.20% a year.
Taxes: after-tax results use compute/aftertax.py, with lots tracked per asset, every rebalancing sale taxed, and everything sold at the end. Pre-tax results are also reported.
Reported metrics
- CAGR, volatility, Sharpe (over cash), Sortino, maximum drawdown and its date, Calmar, worst calendar year, turnover a year, and after-tax CAGR.
- Periods: full sample, each half, and 2012 onward.
- Rolling 5-year and 10-year CAGR distributions (minimum, median, maximum) and the share of rolling 5-year windows that beat 60/40.
- A deflated Sharpe ratio across the 9 portfolios (9 trials).
Known limits
- About 25 years of data, so few independent equity cycles.
- No international equity: MSCI and global index levels can’t be republished. A domestic-only lab overstates home bias compared with what a global allocator would see.
- The G-sec series is a 5-year benchmark, not a broad bond index.
Results log
2026-10-01: first run (2002-10-01 to 2026-09-25, rules as specified)
The common start is the first session after every portfolio has its first decision. Risk parity needs 252 sessions of volatility, which sets the start.
| Portfolio | CAGR % | After-tax CAGR % | Sharpe | Max drawdown % | Turnover a year | 5y windows beating 60/40 |
|---|---|---|---|---|---|---|
| All equity | 17.3 | 16.9 | 0.58 | −63.8 | 0.04 | 71% |
| 60/40 | 14.7 | 14.0 | 0.67 | −36.1 | 0.15 | n/a |
| 60/20/20 | 16.4 | 15.6 | 0.79 | −35.7 | 0.16 | 76% |
| Permanent | 12.7 | 11.8 | 0.89 | −14.6 | 0.15 | 24% |
| Equal three | 14.7 | 13.7 | 0.89 | −18.8 | 0.16 | 50% |
| Risk parity | 10.4 | 8.8 | 0.88 | −7.2 | 0.40 | 16% |
| GTAA (3 assets) | 11.7 | 9.4 | 0.68 | −18.0 | 3.09 | 19% |
| Dual momentum | 17.6 | 14.8 | 0.63 | −44.7 | 3.76 | 42% |
| 60/40 with trend | 11.9 | 10.3 | 0.55 | −20.9 | 2.39 | 23% |
- Gold earned its place. Moving 20 points from G-secs to gold (60/20/20) raised both return and Sharpe over 60/40, and beat it in 76% of rolling 5-year windows. This is one sample, and Indian gold had a strong rupee tailwind over it.
- The best Sharpe came from the simple static mixes (permanent, equal three), at much lower drawdowns than equity.
- The tactical portfolios paid for their trading in tax. Dual momentum had the highest pre-tax CAGR but lost 2.8 points to tax. GTAA and 60/40-with-trend lost about 1.6 points each, and none beat the static mix of the same assets after tax.
- The deflated Sharpe ratio is close to 1 for every portfolio, so it does not separate them. All nine are long-only mixes of assets with positive premia, and the test asks only whether Sharpe is above zero. The comparison that matters is between portfolios, and 24 years is too short to call those differences significant.