Dual Momentum Backtest: Does the Absolute-Momentum Gate Reduce Drawdown?
If we keep the same relative-momentum rotation rule, what changes when we add an absolute-momentum gate? Does drawdown improve, and what does the protection cost?
Over 2011–2026, adding a “positive 12-month momentum” absolute gate to a monthly top-1 relative-momentum rotation (SPY / IWM / EFA) did not reduce drawdown: the maximum drawdown got slightly worse (−33.4% → −35.7%) while compound growth nearly halved (9.0% → 4.6% a year). The gate spent about 12% of the window in cash, dodged part of 2022, but systematically exited after declines and re-entered after recoveries — missing the 2019, 2020 and 2023 rebounds. As implemented, this gate fails.
- Strategy family
- Momentum rotation + absolute gate / cash
- Universe
- SPY, IWM, EFA
- Data window
- 2011-01-03 → 2026-05-01 (evaluation window; 2010-01-04 → 2010-12-31 is the momentum warm-up)
- Data cutoff
- 2026-05-01
- Methodology
- c2i-research-1.2 (strategy engine: canonical Strategy DSL — CrossSectionalRank/TopN/EqualWeight, RateOfChange 252, monthly_first_session)
- Last reviewed
- 2026-08-10
Short answer
Adding an absolute-momentum gate — hold the relative-momentum winner only while its own 12-month return is positive, otherwise cash — to a monthly top-1 rotation over SPY/IWM/EFA did NOT reduce drawdown over the 2011–2026 evaluation window. The maximum drawdown went from −33.4% to −35.7%, while compound growth fell from 9.0% to 4.6% a year and a $100,000 stake ended at $374,833 vs $199,889. The gate spent about 12% of the window in cash and clearly helped only in 2022 (−13.3% vs −15.7%). Everywhere else the protection cost more than it saved: the 12-month lookback exits late and re-enters late, so the rotation systematically missed the 2019, 2020 and 2023 recoveries.
Why this question matters
“Dual momentum” is one of the most searched strategy families on the web. The pitch is intuitive: momentum rotation picks the strongest asset, and an absolute-momentum gate (only hold it if it is also rising) is supposed to protect against bear markets. Before trusting that intuition it should be tested as a controlled experiment: same universe, same lookback, same rebalance, same costs, one changed variable — with the failure periods, cash exposure and missed recoveries shown, not just the CAGR.
This is deliberately a “Dual Momentum-style controlled implementation”, not an exact reproduction of Gary Antonacci’s published strategy. The live Strategy DSL supports top-N 12-month relative momentum with a positive-momentum eligibility gate and a cash fallback, which is the closest faithful setup. The difference matters: the published results describe exactly this implementation, on exactly this window.
Hypothesis
An absolute-momentum gate should cut the worst drawdowns of a momentum rotation by moving to cash when the selected asset’s own 12-month momentum turns negative. The open question is the price: how much return, time-in-cash and missed-recovery cost the protection carries, and whether the gate exits and re-enters at systematically bad times.
Baseline and changed variable
| Baseline | Absolute-gate variant | |
|---|---|---|
| Universe | SPY · IWM · EFA | SPY · IWM · EFA |
| Momentum lookback | 252 sessions (12 months) | 252 sessions (12 months) |
| Selection | Top-1 relative-momentum winner | Top-1 relative-momentum winner |
| Rebalance | Monthly (first trading session) | Monthly (first trading session) |
| Changed variable | — | Gate: winner must have momentum > 0, else cash |
| Fallback | — (never triggers) | Cash (empty selection ⇒ all-zero weights) |
| Costs | $0 commission | $0 commission |
| Warm-up window | 2010-01-04 → 2010-12-31 | 2010-01-04 → 2010-12-31 |
| Evaluation window | 2011-01-03 → 2026-05-01 | 2011-01-03 → 2026-05-01 |
| Data cutoff | 2026-05-01 | 2026-05-01 |
Both sides are the same canonical Strategy DSL graph — indicators, cadence, ranking, TopN(n=1), equal-weight target vector, RebalancingCapitalStrategy with 100% gross exposure — except for one node: the eligibility series that filters symbols before ranking. The baseline uses an always-true condition (close price > 0); the variant uses the winner’s 12-month momentum > 0. When the gate fails, no symbol is eligible, TopN selects nothing and the equal-weight vector is all zeros, so the portfolio holds cash until the next monthly decision.
Warm-up is explicit: a 252-session momentum lookback needs ~1 year of data, and the shared price source serves US daily data from 2010-01-01. Both runs were all-cash through 2010 (momentum not yet computable). Every reported metric, table and chart covers only the evaluation window starting 2011-01-03, with NAV normalized to 1 at that point.
Exact rules
- Universe: SPY (SPDR S&P 500), IWM (iShares Russell 2000), EFA (iShares MSCI EAFE), daily adjusted closes.
- Momentum: RateOfChange over 252 trading sessions on the close (12-month percentage change), evaluated per symbol.
- Baseline: rank the three assets by 12-month momentum (descending); hold the top-1 winner; rebalance on the first trading session of each calendar month.
- Variant: identical, plus an eligibility gate — a symbol is eligible only while its own 12-month momentum is strictly above 0. If the winner fails the gate, no symbol is eligible and the portfolio moves to cash at the next monthly decision; it re-enters only when some asset’s momentum turns positive.
- Trades execute at the next session after the monthly decision (documented engine behavior — decisions use the prior session’s close).
- Long-only, unlevered. Cash earns 0% in the engine. No leverage, no derivatives, no shorting.
- No slippage or commissions in the engine runs; fee sensitivity is discussed in Limitations.
- Both runs start 2010-01-01 (warm-up). Metrics are reported for the evaluation window 2011-01-03 → 2026-05-01 only.
Results and evidence
The metric grid, comparison table, annual returns and charts below are rendered directly from the study’s evidence file (real Agent Lab runs, evaluation window only). Annual returns show the pattern: the gate’s impact is concentrated in 2011 (−24.4% vs −12.7%), 2012 (+7.8% vs +15.1%), 2019 (+10.9% vs +25.7%), 2020 (−5.2% vs +18.2%), 2022 (−13.3% vs −15.7%) and 2023 (+8.8% vs +19.0%). In 2013, 2014, 2017, 2018, 2021 and 2024–2026 the winner’s momentum never turned negative, so the gate never triggered and the two portfolios are nearly identical.
| Metric | Relative momentum only | Momentum + absolute gate |
|---|---|---|
| CAGR | +9.0% | +4.6% |
| Maximum drawdown | -33.4% | -35.7% |
| Annualized volatility | +18.6% | +17.2% |
| Sharpe ratio | 0.46 | 0.26 |
| Calmar | 0.27 | 0.13 |
| Final value of $100,000 | $374,833 | $199,889 |
| Total trades | 85 | 83 |
| Trades per year | 5.6 | 5.4 |
| Dollar turnover (% of avg. AUM / yr) | +264.9% | +261.8% |
| Average cash (% of portfolio) | +1.1% | +11.7% |
| Year | Relative momentum only | Momentum + absolute gate | Difference |
|---|---|---|---|
| 2011 | -12.7% | -24.4% | -11.6 |
| 2012 | +15.1% | +7.8% | -7.3 |
| 2013 | +23.3% | +23.3% | -0.0 |
| 2014 | +5.2% | +5.2% | +0.0 |
| 2015 | -3.4% | -1.6% | +1.8 |
| 2016 | +8.3% | +5.0% | -3.3 |
| 2017 | +12.5% | +12.5% | +0.0 |
| 2018 | -8.2% | -8.3% | -0.0 |
| 2019 | +25.7% | +10.9% | -14.7 |
| 2020 | +18.2% | -5.2% | -23.4 |
| 2021 | +16.1% | +16.1% | -0.0 |
| 2022 | -15.7% | -13.3% | +2.3 |
| 2023 | +19.0% | +8.8% | -10.2 |
| 2024 | +17.5% | +17.5% | +0.0 |
| 2025 | +14.4% | +14.4% | -0.0 |
| 2026 (YTD) | +14.5% | +14.5% | -0.0 |
Where the strategy failed
- 2011: the gate delayed the SPY re-entry to 2011-11-03, a month after the October 4 market low; 2011 ended −24.4% vs baseline −12.7%.
- 2012: a June 2012 cash month plus the 2011 damage produced +7.8% vs +15.1%; the variant’s deepest drawdown episode (2011-05-02 → 2015-02-12, −35.7%) lasted nearly four years.
- 2019: exited SPY 2019-01-03 at $221.93 (momentum −7.4%), whipped back in via IWM then SPY by April, and missed the January–April recovery: +10.9% vs +25.7%.
- 2023: after re-entering in April, relative-momentum ranking flip-flopped between EFA and SPY four times (Apr→Jul→Aug→Dec), each round-trip adding friction: +8.8% vs +19.0%.
- Cash drag: the gate held the portfolio in cash ~12% of the window on average — 59% in 2022, 26% in 2023, 25% in 2016, ~17% in 2019 and 2020. Cash earns 0% in this engine.
- The gate never reduced the maximum drawdown: both variants’ worst episode is deeper than the baseline’s worst (COVID, −33.4%, recovered by August 2020).
| Variant | Start | Trough | End | Depth |
|---|---|---|---|---|
| Relative momentum only | 2020-02-21 | 2020-03-23 | 2020-08-05 | −33.4% |
| Relative momentum only | 2011-05-02 | 2011-10-04 | 2013-04-09 | −30.0% |
| Momentum + absolute gate | 2011-05-02 | 2011-10-04 | 2015-02-12 | −35.7% |
| Momentum + absolute gate | 2018-09-05 | 2020-03-23 | 2021-02-05 | −35.4% |
Limitations and counter-evidence
Counter-evidence — the gate did provide some real protection. It cut the 2022 calendar-year loss from −15.7% to −13.3%, trimmed 2015 (−1.6% vs −3.4%), and lowered annualized volatility from 18.6% to 17.2%. The 2022 avoidance is genuine: the gate exited SPY in June 2022 and stayed out for most of the bear market. The problem is that over the full window the avoided losses are smaller than the missed recoveries: a 2.3pp worse maximum drawdown and a 4.4pp worse annual return.
- Data constraint: the shared price source serves US daily data from 2010-01-01, so the 252-session momentum warm-up consumes 2010 and the evaluation window starts 2011-01-03. A longer history (including 2008) could change relative performance; this study cannot observe it.
- Single evaluation window: 2011–2026 contains the 2020 COVID crash and the 2022 bear but no 2008-style collapse. Relative performance is window-dependent.
- This tests one gate design: 12-month lookback, strict > 0 threshold, monthly execution, cash fallback. It is not a test of 6-month lookbacks, T-bill fallbacks, 1- and 3-month momentum blends, or daily execution — all of which are related research.
- “Dual Momentum-style controlled implementation”: the DSL semantics (top-1 12-month relative momentum + positive-momentum gate → cash) are a faithful simplification, not an exact reproduction of the published strategy’s US-vs-EAFE selection and T-bill-relative absolute test.
- Cash earns 0% in the engine. A T-bill fallback would add a small return and change the comparison modestly.
- $0 commission assumption. Turnover is high on both sides (~265% of AUM per year) because the monthly rotation churns whenever ranking flips; real fees and spreads would hit both variants hard, roughly equally.
- Dividends are reinvested in the backtest (adjusted prices). SPY (1993), IWM (2000) and EFA (2001) predate the window, so there is no ETF inception bias here.
- Backtest ≠ proof. Validation means executable, not trustworthy. Nothing here is investment advice.
Verdict
Reproducibility & assumptions
The rules, evidence and failure analysis above are the reader-facing research. This section preserves the audit trail needed to reproduce the experiment without making engine implementation details part of the main argument.
c2i-research-1.2
Adjusted daily OHLC via investOHLCProxy through MyInvestPilot Agent Lab (same canonical price path as the runs; US daily data served from 2010-01-01; data cutoff 2026-05-01).
- Warm-up: both runs start 2010-01-01; 2010-01-04 → 2010-12-31 is the 252-session momentum warm-up (both runs all-cash in 2010) and is excluded from all reported metrics.
- Evaluation window: 2011-01-03 to 2026-05-01 (3855 trading days), identical for both variants; NAV normalized to 1 at window start.
- Monthly rebalancing on the first trading session of each month; decisions use the prior session’s close; trades execute at the next session.
- Baseline eligibility is always true (close > 0); the variant eligibility is 12-month momentum > 0 — the single changed variable.
- Long-only, unlevered; cash earns 0%; $0 commission, no slippage in the engine runs.
- The exact run configs below are copied from the evidence file (_provenance.baseline_config / variant_config) — what was actually run.
Advanced: exact engine configurations
These JSON configs are preserved for auditability and Agent re-runs. Most readers do not need them to understand the study.
{
"name": "Study #2 baseline: relative momentum rotation (SPY/IWM/EFA, 12M, monthly)",
"description": "Chat2Invest Study #2 (#68) baseline: hold the relative-momentum winner. Warm-up 2010 (252d momentum), evaluation from 2011-01-03.",
"symbols": [
{
"symbol": "SPY"
},
{
"symbol": "IWM"
},
{
"symbol": "EFA"
}
],
"start_date": "2010-01-01",
"end_date": "2026-05-01",
"currency": "USD",
"market": "US",
"commission": 0,
"strategy_definition": {
"trade_strategy": {
"indicators": [
{
"id": "momentum",
"type": "RateOfChange",
"params": {
"periods": 252,
"column": "Close"
}
},
{
"id": "zero",
"type": "Constant",
"params": {
"value": 0
}
}
],
"signals": [
{
"id": "always_eligible",
"type": "GreaterThan",
"inputs": [
{
"column": "Close"
},
{
"ref": "zero"
}
],
"params": {}
},
{
"id": "cadence",
"type": "RebalanceCadence",
"inputs": [],
"params": {
"frequency": "monthly_first_session",
"bootstrap_on_first_session": true
}
},
{
"id": "rank",
"type": "CrossSectionalRank",
"inputs": [
{
"ref": "momentum"
},
{
"ref": "always_eligible"
},
{
"ref": "cadence"
}
],
"params": {
"direction": "descending"
}
},
{
"id": "selected",
"type": "TopN",
"inputs": [
{
"ref": "rank"
},
{
"ref": "cadence"
}
],
"params": {
"n": 1
}
},
{
"id": "not_selected",
"type": "Not",
"inputs": [
{
"ref": "selected"
}
],
"params": {}
},
{
"id": "weight",
"type": "EqualWeight",
"inputs": [
{
"ref": "selected"
},
{
"ref": "cadence"
}
],
"params": {
"rebalance_policy": "membership_change"
}
}
],
"outputs": {
"buy_signal": "selected",
"sell_signal": "not_selected",
"target_weight": "weight",
"indicators": [
{
"id": "momentum",
"output_name": "cross_sectional_feature"
},
{
"id": "always_eligible",
"output_name": "cross_sectional_eligible"
}
]
}
},
"capital_strategy": {
"name": "RebalancingCapitalStrategy",
"params": {
"initial_capital": 100000,
"gross_exposure": 1
}
}
}
}{
"name": "Study #2 variant: relative momentum + absolute momentum gate (cash fallback)",
"description": "Chat2Invest Study #2 (#68) variant: same rotation, but the top-1 risky asset must have positive 12-month momentum; otherwise hold cash.",
"symbols": [
{
"symbol": "SPY"
},
{
"symbol": "IWM"
},
{
"symbol": "EFA"
}
],
"start_date": "2010-01-01",
"end_date": "2026-05-01",
"currency": "USD",
"market": "US",
"commission": 0,
"strategy_definition": {
"trade_strategy": {
"indicators": [
{
"id": "momentum",
"type": "RateOfChange",
"params": {
"periods": 252,
"column": "Close"
}
},
{
"id": "zero",
"type": "Constant",
"params": {
"value": 0
}
}
],
"signals": [
{
"id": "eligible",
"type": "GreaterThan",
"inputs": [
{
"ref": "momentum"
},
{
"ref": "zero"
}
],
"params": {}
},
{
"id": "cadence",
"type": "RebalanceCadence",
"inputs": [],
"params": {
"frequency": "monthly_first_session",
"bootstrap_on_first_session": true
}
},
{
"id": "rank",
"type": "CrossSectionalRank",
"inputs": [
{
"ref": "momentum"
},
{
"ref": "eligible"
},
{
"ref": "cadence"
}
],
"params": {
"direction": "descending"
}
},
{
"id": "selected",
"type": "TopN",
"inputs": [
{
"ref": "rank"
},
{
"ref": "cadence"
}
],
"params": {
"n": 1
}
},
{
"id": "not_selected",
"type": "Not",
"inputs": [
{
"ref": "selected"
}
],
"params": {}
},
{
"id": "weight",
"type": "EqualWeight",
"inputs": [
{
"ref": "selected"
},
{
"ref": "cadence"
}
],
"params": {
"rebalance_policy": "membership_change"
}
}
],
"outputs": {
"buy_signal": "selected",
"sell_signal": "not_selected",
"target_weight": "weight",
"indicators": [
{
"id": "momentum",
"output_name": "cross_sectional_feature"
},
{
"id": "eligible",
"output_name": "cross_sectional_eligible"
}
]
}
},
"capital_strategy": {
"name": "RebalancingCapitalStrategy",
"params": {
"initial_capital": 100000,
"gross_exposure": 1
}
}
}
}I want to test a variation
Custom experiments are not open yet. If you understand this study and want to change one thing, choosing below helps us decide what to build next.