Long-only inverse-volatility, same clean universe

The comparison portfolio for trend-following on assets whose price data can be trusted: own all of them, all the time.

Conclusion: Control

A benchmark, not a candidate. Held continuously it returned 5.8% a year at 12.3% volatility, with a worst fall of 61.9% over 658 months. Strategies are measured against this.

Figure 1 · Growth of $1

1971–2026 · net of 15bp round-trip costs
What one dollar became, after costs: $24.54 by 2026. Shown against S&P 500, rebased to the same starting dollar.
Return for risk
0.47
range 0.19 to 0.76
Ann. return
5.8%
volatility 12.3%
Max drawdown
61.9%
over 658 months
Beats the search
8.2%
chance, after correction

Method

Hypothesis

CONTROL: long-only inverse-vol, same clean universe

Rule

UNIVERSE = equity indices and FX only
function positions(bar):
# no signal, no timing: always fully invested
for symbol in UNIVERSE:
w[symbol] = 1 / vol_36m(symbol, bar.prev) # equal risk
return w
# ── execution ────────────────────────────────────────────────────────
COST_PER_TRADE = 15 bps of the notional that changes hands
function on_bar(bar, book):
if not bar.is_month_end:
return # decisions are made monthly only
target = positions(bar) # the rule above
target = scale_to_gross(target, 1.0)
rebalance(book, target, bar)
function scale_to_gross(w, limit):
gross = sum(abs(w)) # total capital at work
if gross == 0:
return w # flat is a valid target
return w * limit / gross # leverage fixed, never implicit
function rebalance(book, target, bar):
for symbol in union(book.symbols, target.symbols):
delta = target[symbol] - book.weight(symbol)
if delta > 0:
buy(symbol, delta, fill = next_bar.close)
else if delta < 0:
sell(symbol, -delta, fill = next_bar.close)
book.charge(COST_PER_TRADE * abs(delta))
# Orders are filled at the next month's close, never the one the decision
# was made on. There is no stop_loss(), take_profit(), limit order or
# position cap: a holding changes only when positions() returns a
# different target at the next month end.

Evaluation

Table 1 · Performance

1971-09 – 2026-06 · 658 months, 658 invested
MeasureValue
Annualised return5.8%
Annualised volatility12.3%
Return for risk taken0.47
95% range0.19 to 0.76
t-statistic3.51
Maximum drawdown61.9%
Hit rate60.2%
Annual turnover0.21×
Return skew(0.86)
Return kurtosis9.64
The range is measured by resampling the history in blocks, so runs of good and bad months stay intact.

Table 2 · Robustness

DiagnosticValueReads asBadOkayYayHmm
Design half (pre-2015)0.47return for risk≤ 00 – 0.40≥ 0.40
Holdout half (2015+)0.82return for risk≤ 00 – 0.40≥ 0.40
Top-5-month share of profit19.1%how much rode on a few months — lower is better≥ 40%25 – 40%< 25%
Top-2-year share of profit16.9%concentration
Distinct trading episodes1how many independent runs this really is< 5050 – 100≥ 100
Chance the edge is real99.9%non-normality corrected
Chance it beats the whole search8.2%chance of beating the whole search by luck
bad/ok boundary is the pre-registered criterion · ok/good is a margin above it, not a criterion · blank where none was registered
The last row asks whether the result would stand out from the hundred-odd ideas tried here, rather than being judged alone.

Table 3 · Net return by calendar year

after costs
+35%-35%
YearNet return
19712.9%
197214.5%
1973(19.1%)
1974(35.3%)
197527.4%
197617.5%
1977(12.2%)
19781.1%
197911.6%
198022.9%
1981(10.2%)
198213.8%
198315.9%
19841.4%
198523.4%
198613.7%
19872.0%
198811.7%
198924.1%
1990(6.8%)
199123.4%
19924.4%
19936.8%
1994(5.1%)
199520.0%
199618.2%
19971.0%
19985.0%
199926.7%
2000(6.0%)
2001(1.6%)
2002(16.9%)
200323.2%
200415.0%
20057.3%
200611.0%
20074.8%
2008(14.0%)
200910.4%
20103.1%
20111.4%
20128.1%
20135.6%
20144.3%
20154.1%
20161.6%
20177.7%
20181.0%
20197.8%
20204.0%
20212.7%
2022(0.8%)
20233.6%
20245.6%
20254.4%
20262.1%

Table 4 · Concentration detail

MeasureValue
Best years1975:+27%, 1999:+27%, 1989:+24%
Worst year1974:-35%

Reference

Instruments

last price and one-month change, live from Yahoo Finance
SymbolNotes
^GSPCS&P 500 — market index, in USD.
^N225Nikkei 225 — market index, in JPY.
^AXJOS&P/ASX 200 — market index, in AUD.
^BVSPIBOVESPA — market index, in BRL.
^NSEINIFTY 50 — market index, in INR.
^KLSEFTSE Bursa Malaysia KLCI — market index, in MYR.
^NZ50S&P/NZX 50 Gross — market index, in NZD.
AUD/USDAUD/USD — spot exchange rate.
NZD/USDNZD/USD — spot exchange rate.
AUD/NZDAUD/NZD — spot exchange rate.
AUD/JPYAUD/JPY — spot exchange rate.
USD/BRLUSD/BRL — spot exchange rate.
USD/INRUSD/INR — spot exchange rate.
USD/ZARUSD/ZAR — spot exchange rate.

Sample

1971-09 – 2026-06 · 658 months

Sources

NOAA Physical Sciences Laboratory. Climate indices. ONI, Niño 3.4, MEI v2, DMI, PDO, AMO, TNA, QBO, solar flux. psl.noaa.gov/data/climateindices/list
Queensland Department of Agriculture and Fisheries. Southern Oscillation Index. The Long Paddock. Monthly, 1876–. www.longpaddock.qld.gov.au/soi/soi-data-files
Yahoo Finance. Historical market prices. Adjusted close, month-end. Retrieved with yfinance. finance.yahoo.com

Revision history

RevStageStatusChange
01DraftDirection and criteria fixed before the experiment ran
02TestedControlBenchmark, not scored against the criteria
algorithmic-trading-anthology-july-2026-c5-rp-clean | d/rksci