Volatility-managed equity

Hold less of the S&P 500 when the market has recently been turbulent, more when it has been calm. Over fifty-three years this cut the worst loss from three-quarters of the account to just over a third — while ending with roughly a quarter of the money.

Conclusion: Validated

Passed all six checks. Indicative performance of 5.4% a year is 2.5 points below the 7.9% returned by holding the same universe continuously, return for risk taken sits at 0.53 against the benchmark's 0.51, and the worst fall of 35.2% is 39.4 points below the benchmark's 74.6%.

Figure 1 · Growth of $1

1973–2026 · net of 15bp round-trip costs
What one dollar became, after costs: $17.48 by 2026. Shown against Control, S&P 500, rebased to the same starting dollar.
Return for risk
0.53
range 0.26 to 0.81
Ann. return
5.4%
volatility 10.1%
Max drawdown
35.2%
over 641 months
Beats the search
14.8%
chance, after correction

Method

Hypothesis

Scaling equity exposure inversely to recent realised variance improves risk-adjusted returns, because volatility is persistent while expected return is not.

Rule

UNIVERSE = [^GSPC]
RV_WINDOW = 21 sessions
MIN_HIST = 36 months
function positions(bar):
realised = stdev(daily_returns(^GSPC, RV_WINDOW, ending bar)) * sqrt(252)
target = median(realised, expanding, at least MIN_HIST)
exposure = clip(target^2 / realised^2, 0, 1)
return { ^GSPC: exposure, CASH: 1 - exposure }
# ── 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.

Analysis

Mechanism

Turbulence comes in runs. A wild month is usually followed by another wild month. Returns are not nearly so obliging — a good month tells you little about the next one. So risk is partly predictable while reward is not, and a rule that leans on that asymmetry has something real to work with.

There is one number to set, and it is chosen from history as the strategy goes, never with hindsight. The cash it holds earns nothing here, which real cash would not. Both choices make the test harder than reality.

Interpretation

The advantage in return-per-risk is 0.53 against 0.51. That gap is far smaller than the uncertainty around either number. It is not an edge and is not claimed as one.

The drawdown difference is the result: 35% against 75%. The strategy visibly sidesteps 2000–02 and 2008, then underperforms through the low-volatility bull market of the 2010s, finishing at 19.6× against buy-and-hold's 76.9×.

This is a way of controlling risk, not a way of finding profit. The fair comparison is not the index itself but the index held in smaller size to match the same risk — a comparison this test cannot make, because its cash earns nothing and real cash does not.

Evaluation

Table 1 · Performance

1973-02 – 2026-06 · 641 months, 641 invested
MeasureValue
Annualised return5.4%
Annualised volatility10.1%
Return for risk taken0.53
95% range0.26 to 0.81
t-statistic3.87
Maximum drawdown35.2%
Hit rate59.0%
Annual turnover3.86×
Return skew(0.21)
Return kurtosis4.57
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.49return for risk≤ 00 – 0.40≥ 0.40
Holdout half (2015+)0.67return for risk≤ 00 – 0.40≥ 0.40
Top-5-month share of profit18.2%how much rode on a few months — lower is better≥ 40%25 – 40%< 25%
Top-2-year share of profit18.4%concentration
Distinct trading episodes1how many independent runs this really is< 5050 – 100≥ 100
Chance the edge is real100.0%non-normality corrected
Chance it beats the whole search14.8%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 · Pre-registered criteria

measured against C7_BH_SPX
1PASS2PASS3PASS4PASS5PASS6PASS
CheckWhat it asksResult
1Reward large enough for the riskpass
2Confidence range clear of zeropass
3Profit not concentrated in a few monthspass
4Worked in both halves of the historypass
5Beat buying and holdingpass
6Stood out from the whole searchpass
These six checks were written down before the strategy was run.

Table 4 · Net return by calendar year

after costs
+29%-29%
YearNet return
1973(11.6%)
1974(13.6%)
19756.8%
197616.4%
1977(12.4%)
1978(1.2%)
19798.2%
198014.5%
1981(9.8%)
19826.7%
198310.9%
19840.8%
198523.4%
19862.8%
198712.9%
19884.7%
198920.9%
1990(8.0%)
199113.4%
19924.4%
19936.8%
1994(2.0%)
199529.4%
199616.2%
199711.4%
19988.5%
19997.8%
2000(9.3%)
2001(11.6%)
2002(12.3%)
200312.9%
20048.8%
20050.6%
200612.1%
2007(0.2%)
2008(14.9%)
20098.4%
20106.3%
2011(0.8%)
20129.6%
201322.8%
20149.1%
2015(6.3%)
20166.0%
201717.8%
2018(2.1%)
201914.1%
2020(4.7%)
202118.3%
2022(10.5%)
202315.1%
202418.4%
20257.1%
20263.6%

Table 5 · Concentration detail

MeasureValue
Best years1995:+29%, 1985:+23%, 2013:+23%
Worst year2008:-15%

Reference

Instruments

last price and one-month change, live from Yahoo Finance
SymbolNotes
^GSPCS&P 500 — market index, in USD.
CASHPathward Financial Inc. — listed on NasdaqGS, in USD.

Sample

1973-02 – 2026-06 · 641 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
02TestedValidatedCleared every criterion
algorithmic-trading-anthology-july-2026-volatility-managed-equity | d/rksci