I ran 250+ backtests trying to improve my SSO/QLD strategy. None of the improvements survived Monte Carlo.

#

**TL;DR:** A dead-simple rule — 60% SSO / 40% QLD when the S&P is 3% above its 200-day SMA, 0.5× S&P exposure when it's 3% below — did **16.2% CAGR over 27 years (1999–2026)** against 8.7% for SPY and 11.7% for always-on 2× leverage, with a −56% max drawdown versus always-on's −94%. I then spent five phases optimising it, found four configs that beat it, and every one of them fell apart out-of-sample. Shipping the original, unchanged.

# The strategy

SPX > SMA200 + 3% → 60% SSO / 40% QLD (2× leverage)
SPX < SMA200 − 3% → 50% SPY / 50% cash (0.5× exposure)
Inside the ±3% band → do nothing, hold current regime
Rebalance: quarterly + immediately on a regime switch. Signal at close, trade next close.

That's it. No crash guard, no vol filter, no RSI, no sector rotation. 28 regime switches in 27 years — about one a year, risk-on 72% of days.

# Results, 1999–2026

SSO and QLD only launched in 2006, so to cover the dot-com bust I synthesised both back to 1999 from SPY/QQQ total returns: daily-reset model, prospectus expense ratios (0.89% / 0.95%), 40bp financing spread over 3-month T-bills. **Zero parameters fitted to the real ETFs.** Over 2006–2026 the synthetic series tracks the real ones within 0.3pp of CAGR at 0.996 daily correlation.

27.4 years, $20k start + $500/month ($184,500 deposited):

Metric Strategy SPY Always-on 60/40 SSO/QLD
CAGR **16.16%** 8.65% 11.73%
Max drawdown −56.1% −55.2% **−94.0%**
Sharpe **0.58** 0.45 0.27
Calmar **0.29** 0.16 0.12
Ending value (DCA) **$5.27M** $1.23M $4.78M

Two things worth pulling out.

**The "always-on wins on dollars anyway" argument dies over a long enough window.** On 2006–2026 alone, always-on ends ahead ($3.11M vs $2.48M) because DCA contributions during the −84% hole bought in cheap — that's the standard rebuttal to any timing overlay. Extend back through the dot-com bust and it reverses: $4.78M vs $5.27M, and always-on got there via a **−94% drawdown**. Nobody holds through −94%.

**The window you start in changes everything.** Same rule, 2006–2026 only: **20.3% CAGR, −44.8% DD**. From 1999: 16.2% and −56%. If a leveraged strategy's track record starts after the dot-com bust, you don't know what it does in a lost decade. For what it's worth, in the 1999–2006 stretch alone the strategy did +3.9%/yr while always-on did −9.4% and SPY did +1.0%.

# Then I tried to improve it

All on 2006–2026, the window they were tuned on:

Config CAGR Max DD Verdict
Original ±3% 19.90% −45.0% baseline
Exit −3% / re-enter +1% / 21-day min-off 20.53% −42.4% More return AND less drawdown
SMA-150 with −4% exit **21.57%** −42.8% Best of 213 configs
100% SPY in bear markets instead of 50% 20.34% **−61.0%** Rejected — deeper hole than SPY itself
EMA instead of SMA median 12 whipsaws vs SMA's 7 Rejected — EMA loses on every axis

The middle two looked like free lunches. So before deploying, four tests.

# The four tests

**1. Out-of-sample history.** Test the dot-com bust, which no tuning had seen:

Config 1999–2006 CAGR Max DD
**Original ±3%** **+3.55%** −56.6%
−3%/+1%/21d \+0.79% −64.3%
SMA-150 −4% **−1.70%** −68.5%
Always-on 60/40 −9.75% −91.6%

The ranking inverted completely. The untouched original came out best; my top config lost money. A shorter MA with a wider exit whipsaws horribly in a long grinding bear — 11 switches vs the original's 6.

**2. Walk-forward.** Every 2 years, pick the best of 160 configs on trailing data only, apply blind to the next 2 years. Chained: **5.06× for the retuning process vs 5.58× for the fixed original rule.** Selection won 4 of 11 windows. Retuning has negative skill.

**3. Monte Carlo.** 1,000 stationary block bootstraps (mean block 40 days), signal recomputed on every path. My "improvements" beat the baseline on 55–57% of paths. That's a coin flip.

**4. Permutation.** 2,000 circular rotations of the regime sequence — same switch count, same time in market, wrong dates. The real signal beat 97% of rotations (p = 0.031). **So the 200-day filter itself is real. The tuning on top of it wasn't.**

# The one thing that did survive

Volatility targeting: scale the risk-on sleeve by `35% ÷ 60-day realized vol`, capped at 1.0. Over 1999–2026 it moves Calmar 0.29 → 0.34 and drawdown −56% → −45%, for 0.8pp of CAGR.

It passed the test that killed everything else. Average exposure is 0.96×, barely a de-lever, so I pinned exposure at a flat 0.96× as a control — same average, same rebalance schedule. That reproduced **none** of the benefit (Calmar 0.29, DD −54%). Rotating the exposure schedule to the wrong dates also killed it (0.26). So the gain is genuinely in *when* it de-levers, not in holding less. It won 74% of Monte Carlo paths, and every target from 20% to 60% beat the baseline — a plateau, not a lucky cell.

I still passed on it, because it only helps in slow grinding bears (dot-com −56%→−45%, 2022 −41%→−37%, and literally zero effect on COVID, 2018 Q4 or the GFC — realized vol spikes *after* price falls). I'm optimising for CAGR; if you're optimising for sleep, take it.

# Lessons

  1. **In-sample improvement is free. Out-of-sample improvement is nearly impossible.** 250+ configs, four winners, zero survivors.
  2. **Walk-forward is the cheapest honesty check that exists.** One number (5.06× vs 5.58×) invalidated my entire optimisation phase, including configs I never individually tested.
  3. **Always build a static control.** "Same average exposure, held constant" is what separated a real signal from a de-lever in disguise.
  4. **Trust plateaus, not peaks.** Prefer the parameter you could misestimate by 30% and still be fine.
  5. **Parameters don't transfer between your own strategies.** I ported a −13%/15-day crash guard from another live strategy of mine. Audit: it fires 51 times over 1999–2026, and the ±3% rule is *already* defensive on all 51. It never once forces an exit. It works over there because that strategy uses a slower EMA with a 30-day hold — copying a parameter without the mechanism it compensates for adds risk, not safety.
  6. **Drawdown budgets have cliffs, not slopes.** Risk-off exposure could go 0%→50% SPY essentially free, then cost 16 points of drawdown between 50% and 100%.
  7. **Check your moving average is warmed up.** I hit this twice. Slicing prices to a backtest window *then* computing a 200-day MA leaves the first 200 days undefined and silently parks the book in cash. It cost me 1.7pp of CAGR on the full-history run before I caught it by noticing two phases disagreed about the same number.

# Final config

signal = "^GSPC" # S&P 500 close
ma_kind = "sma" # NOT ema
ma_length = 200
exit_buffer = -3.0 # % below SMA → risk-off
entry_buffer = +3.0 # % above SMA → risk-on
risk_on = {"SSO": 60, "QLD": 40}
risk_off = {"SPY": 50, "CASH": 50}
rebalance = "quarter_end + on_switch"
execution_lag = 1 # T+1
# explicitly NOT included: crash guard, recovery rally, vol target,
# min-hold, asymmetric re-entry. All tested, all rejected.

**Risk number to actually plan around: −56%, not −45%.** The friendlier figure comes from a window with no slow bear in it before 2022.

Happy to answer questions on the synthetic LETF construction or the stress-test setup — that's the part worth copying if you're building something similar.

*Windows: 1999–2026 with synthetic SSO/QLD pre-2006, 2006–2026 on real ETFs | $20k + $500/mo DCA | Data: Yahoo Finance | T+1 execution, \~10bp of traded notional in costs* *Not financial advice. Leveraged ETFs can lose 90%+ in a severe bear market — always-on 60/40 SSO/QLD did exactly that in 2000–02.*

reddit.com
u/mongopark98 — 5 days ago
▲ 32 r/LETFs

I ran 250+ backtests trying to improve my SSO/QLD strategy. None of the improvements survived Monte Carlo.

TL;DR: A dead-simple rule — 60% SSO / 40% QLD when the S&P is 3% above its 200-day SMA, 0.5× S&P exposure when it's 3% below — did 16.2% CAGR over 27 years (1999–2026) against 8.7% for SPY and 11.7% for always-on 2× leverage, with a −56% max drawdown versus always-on's −94%. I then spent five phases optimising it, found four configs that beat it, and every one of them fell apart out-of-sample. Shipping the original, unchanged.

The strategy

SPX &gt; SMA200 + 3%  →  60% SSO / 40% QLD   (2× leverage)
SPX &lt; SMA200 − 3%  →  50% SPY / 50% cash  (0.5× exposure)
Inside the ±3% band → do nothing, hold current regime
Rebalance: quarterly + immediately on a regime switch. Signal at close, trade next close.

That's it. No crash guard, no vol filter, no RSI, no sector rotation. 28 regime switches in 27 years — about one a year, risk-on 72% of days.

Results, 1999–2026

SSO and QLD only launched in 2006, so to cover the dot-com bust I synthesised both back to 1999 from SPY/QQQ total returns: daily-reset model, prospectus expense ratios (0.89% / 0.95%), 40bp financing spread over 3-month T-bills. Zero parameters fitted to the real ETFs. Over 2006–2026 the synthetic series tracks the real ones within 0.3pp of CAGR at 0.996 daily correlation.

27.4 years, $20k start + $500/month ($184,500 deposited):

Metric Strategy SPY Always-on 60/40 SSO/QLD
CAGR 16.16% 8.65% 11.73%
Max drawdown −56.1% −55.2% −94.0%
Sharpe 0.58 0.45 0.27
Calmar 0.29 0.16 0.12
Ending value (DCA) $5.27M $1.23M $4.78M

Two things worth pulling out.

The "always-on wins on dollars anyway" argument dies over a long enough window. On 2006–2026 alone, always-on ends ahead ($3.11M vs $2.48M) because DCA contributions during the −84% hole bought in cheap — that's the standard rebuttal to any timing overlay. Extend back through the dot-com bust and it reverses: $4.78M vs $5.27M, and always-on got there via a −94% drawdown. Nobody holds through −94%.

The window you start in changes everything. Same rule, 2006–2026 only: 20.3% CAGR, −44.8% DD. From 1999: 16.2% and −56%. If a leveraged strategy's track record starts after the dot-com bust, you don't know what it does in a lost decade. For what it's worth, in the 1999–2006 stretch alone the strategy did +3.9%/yr while always-on did −9.4% and SPY did +1.0%.

Then I tried to improve it

All on 2006–2026, the window they were tuned on:

Config CAGR Max DD Verdict
Original ±3% 19.90% −45.0% baseline
Exit −3% / re-enter +1% / 21-day min-off 20.53% −42.4% More return AND less drawdown
SMA-150 with −4% exit 21.57% −42.8% Best of 213 configs
100% SPY in bear markets instead of 50% 20.34% −61.0% Rejected — deeper hole than SPY itself
EMA instead of SMA median 12 whipsaws vs SMA's 7 Rejected — EMA loses on every axis

The middle two looked like free lunches. So before deploying, four tests.

The four tests

1. Out-of-sample history. Test the dot-com bust, which no tuning had seen:

Config 1999–2006 CAGR Max DD
Original ±3% +3.55% −56.6%
−3%/+1%/21d +0.79% −64.3%
SMA-150 −4% −1.70% −68.5%
Always-on 60/40 −9.75% −91.6%

The ranking inverted completely. The untouched original came out best; my top config lost money. A shorter MA with a wider exit whipsaws horribly in a long grinding bear — 11 switches vs the original's 6.

2. Walk-forward. Every 2 years, pick the best of 160 configs on trailing data only, apply blind to the next 2 years. Chained: 5.06× for the retuning process vs 5.58× for the fixed original rule. Selection won 4 of 11 windows. Retuning has negative skill.

3. Monte Carlo. 1,000 stationary block bootstraps (mean block 40 days), signal recomputed on every path. My "improvements" beat the baseline on 55–57% of paths. That's a coin flip.

4. Permutation. 2,000 circular rotations of the regime sequence — same switch count, same time in market, wrong dates. The real signal beat 97% of rotations (p = 0.031). So the 200-day filter itself is real. The tuning on top of it wasn't.

The one thing that did survive

Volatility targeting: scale the risk-on sleeve by 35% ÷ 60-day realized vol, capped at 1.0. Over 1999–2026 it moves Calmar 0.29 → 0.34 and drawdown −56% → −45%, for 0.8pp of CAGR.

It passed the test that killed everything else. Average exposure is 0.96×, barely a de-lever, so I pinned exposure at a flat 0.96× as a control — same average, same rebalance schedule. That reproduced none of the benefit (Calmar 0.29, DD −54%). Rotating the exposure schedule to the wrong dates also killed it (0.26). So the gain is genuinely in when it de-levers, not in holding less. It won 74% of Monte Carlo paths, and every target from 20% to 60% beat the baseline — a plateau, not a lucky cell.

I still passed on it, because it only helps in slow grinding bears (dot-com −56%→−45%, 2022 −41%→−37%, and literally zero effect on COVID, 2018 Q4 or the GFC — realized vol spikes after price falls). I'm optimising for CAGR; if you're optimising for sleep, take it.

Lessons

  1. In-sample improvement is free. Out-of-sample improvement is nearly impossible. 250+ configs, four winners, zero survivors.
  2. Walk-forward is the cheapest honesty check that exists. One number (5.06× vs 5.58×) invalidated my entire optimisation phase, including configs I never individually tested.
  3. Always build a static control. "Same average exposure, held constant" is what separated a real signal from a de-lever in disguise.
  4. Trust plateaus, not peaks. Prefer the parameter you could misestimate by 30% and still be fine.
  5. Parameters don't transfer between your own strategies. I ported a −13%/15-day crash guard from another live strategy of mine. Audit: it fires 51 times over 1999–2026, and the ±3% rule is already defensive on all 51. It never once forces an exit. It works over there because that strategy uses a slower EMA with a 30-day hold — copying a parameter without the mechanism it compensates for adds risk, not safety.
  6. Drawdown budgets have cliffs, not slopes. Risk-off exposure could go 0%→50% SPY essentially free, then cost 16 points of drawdown between 50% and 100%.
  7. Check your moving average is warmed up. I hit this twice. Slicing prices to a backtest window then computing a 200-day MA leaves the first 200 days undefined and silently parks the book in cash. It cost me 1.7pp of CAGR on the full-history run before I caught it by noticing two phases disagreed about the same number.

Final config

signal          = "^GSPC"   # S&amp;P 500 close
ma_kind         = "sma"     # NOT ema
ma_length       = 200
exit_buffer     = -3.0      # % below SMA → risk-off
entry_buffer    = +3.0      # % above SMA → risk-on
risk_on         = {"SSO": 60, "QLD": 40}
risk_off        = {"SPY": 50, "CASH": 50}
rebalance       = "quarter_end + on_switch"
execution_lag   = 1         # T+1
# explicitly NOT included: crash guard, recovery rally, vol target,
# min-hold, asymmetric re-entry. All tested, all rejected.

Risk number to actually plan around: −56%, not −45%. The friendlier figure comes from a window with no slow bear in it before 2022.

Happy to answer questions on the synthetic LETF construction or the stress-test setup — that's the part worth copying if you're building something similar.

Windows: 1999–2026 with synthetic SSO/QLD pre-2006, 2006–2026 on real ETFs | $20k + $500/mo DCA | Data: Yahoo Finance | T+1 execution, ~10bp of traded notional in costs Not financial advice. Leveraged ETFs can lose 90%+ in a severe bear market — always-on 60/40 SSO/QLD did exactly that in 2000–02.

reddit.com
u/mongopark98 — 6 days ago
▲ 20 r/LETFs

I ran 54,000 backtests on a TQQQ/SOXL rotation strategy — here's the full methodology, results, and production config

TL;DR: A macro-regime-filtered leveraged rotation strategy holding TQQQ + SOXL in bull markets and 100% cash in bear markets backtests at +49.9% CAGR, −41.4% max drawdown, Calmar 1.20 over 13 years ($15k start, $1k/month DCA → $9.08M).

The regime signal is a single EMA on QQQ with asymmetric entry/exit buffers. Fully automated and live since October 2025.

What is this?

LRS Sentinel is a macro-regime-filtered leveraged rotation strategy. The core idea:

  • Hold TQQQ + SOXL (50/50) when the market is in a bull regime
  • Go 100% cash when the regime flips bear
  • Use QQQ's EMA-125 as the regime signal — not price crossovers, not RSI, just a smoothed trend with asymmetric entry/exit buffers

The regime machine has 4 layers:

1. CRASH GUARD    — if QQQ drops ≥ 8% over 15 days → immediate cash, no questions
2. MACRO BEAR     — if QQQ &lt; EMA-125 × 0.99 → move to cash
3. MACRO BULL     — if QQQ &gt; EMA-125 × 1.003 → re-enter (lower bar than initial entry)
4. RECOVERY       — if QQQ rallied ≥ 10% from its 15-day low while in cash → re-enter early

When bullish, sector filter (SMH EMA) determines whether it's TQQQ only or TQQQ+SOXL. A momentum boost dynamically tilts toward whichever ETF has led over 90 days (capped at 80% TQQQ / 60% SOXL).

Why QQQ as the regime anchor?

TQQQ is 3× Nasdaq-100. SOXL is 3× semiconductors. Both are fundamentally tech/semi exposure. When you're holding leveraged tech, you want your crash detector watching tech — not the broad S&P 500.

Using QQQ means the regime signal fires 1–3 days earlier in tech-led corrections — which matters enormously when you're holding 3× leverage.

The crash threshold is calibrated to QQQ's speed: QQQ moves ~1.3× faster than SPY, so the equivalent crash signal fires at −8% over 15 days (vs a typical −10–12% threshold you'd use on SPY).

Verified backtest results

13-year window (Jan 2013 — Dec 2025), $15,000 starting capital + $1,000/month DCA:

Metric Result
CAGR +49.88%
Max Drawdown −41.43%
Sharpe 1.111
Calmar 1.204
Ann. Volatility 44.9%
Net Return 5,241%
Final Portfolio Value $9,080,363
Bull days 2,935 (89.7%)
Bear (cash) days 334 (10.3%)

Results reproduced independently and matched sweep targets within ±0.5pp on all 4 key metrics.

The 54,000-combo sweep

With the anchor and universe fixed (QQQ macro + SMH sector, TQQQ + SOXL trades), ran a full overnight sweep to find the optimal signal parameters:

Dimension Values tested
EMA length 90, 110, 125, 150, 175
Crash threshold −6%, −7%, −8%, −9%, −10%, −11%, −12%
Sell buffer 1.0%, 1.5%, 2.0%, 2.5%, 3.5%
Hysteresis buffer 0.5%, 1.0%, 1.5%, 2.0%, 3.0%
TQQQ/SOXL split 50/50, 60/40, 70/30, 80/20
Momentum boost on / off
Spike-hold guard on / off

Rank formula: (Calmar × 0.55) + (Sharpe × 0.35) − (|MaxDD| × 0.10)

Top 5 configs from the sweep

Rank EMA Crash Sell buf Alloc Boost Calmar Sharpe MaxDD
1 125 −8% 1.0% 50/50 off 1.22 1.12 −40.1%
2 125 −8% 1.0% 50/50 on 1.20 1.11 −41.4%
3 125 −9% 1.0% 50/50 off 1.19 1.10 −41.8%
4 125 −8% 1.5% 50/50 off 1.18 1.10 −41.5%
5 110 −8% 1.0% 50/50 off 1.15 1.08 −43.2%

Rank-1 (boost=off) vs Rank-2 (boost=on): Calmar 1.22 vs 1.20, MaxDD 40.1% vs 41.4%. The difference is minimal. I retained the momentum boost because I'm running this long-term with a SOXL conviction thesis on the AI/semiconductor cycle. If you just want max Calmar, disable it.

Final production config

# Macro anchor (regime signal)
macro_anchor      = "QQQ"
sector_filter     = "SMH"
ema_length        = 125

# Entry / exit buffers
hysteresis_buffer = 1.0%   # first BULL entry: must be 1% above EMA
reentry_buffer    = 0.3%   # re-entry after BEAR: just 0.3% above EMA (faster)
sell_buffer       = 1.0%   # BEAR trigger: 1% below EMA

# Crash guard
crash_drop        = -8%    # 15-day QQQ return
crash_lookback    = 15     # days

# Recovery re-entry
recovery_rally    = 10%    # from 15-day rolling low → flip BULL early

# Allocation (when BULL + sector bullish)
tqqq_alloc        = 50%
soxl_alloc        = 50%
momentum_boost    = 10     # % added to 90-day leader, capped at 80/60

# Spike re-entry guard
spike_reentry     = True   # 1-day TQQQ ≥ 3% or SOXL ≥ 4% → BULL from BEAR
leveraged_exit_buffer = 1.0%  # require leveraged ETF weakness before exiting spike-hold

Key lessons from the sweep

1. Match your regime anchor to what you're actually holding. For leveraged Nasdaq/semi ETFs, QQQ is the natural regime signal. The crash threshold should also be calibrated to the anchor's volatility — QQQ moves ~1.3× faster than SPY, so a threshold of −8%/15d fires with equivalent sensitivity to a −10–12% SPY threshold.

2. The exit guard matters more than the entry. During testing, a spike re-entry guard was set with a 2.0% leveraged exit buffer that was mathematically valid but practically unreachable during fast corrections — the sell signal never fired. Dropped to 1.0% and it works correctly. Always verify your exit logic fires in a realistic sell-off scenario before going live.

3. Always backtest before deploying, then verify the backtest independently. Run the same config through the same engine twice on the same data. If the numbers don't match within ±0.5pp, your engine has non-determinism. This step catches silent bugs that show up as mysteriously good or bad results.

4. 50/50 beats 60/40 when conviction is equal. If you have strong views on both assets, equal weighting + momentum boost lets the system dynamically concentrate over time, rather than locking in concentration upfront through the base allocation.

5. Slow bear days hurt more than they help. Forcing an exit after N consecutive days below EMA introduces unnecessary BEAR signals in choppy sideways markets. Every config with slow_bear_days &gt; 0 ranked below configs with it disabled.

What I'm watching

The strategy is live. Current positions: TQQQ 50% + SOXL 50% (macro and sector both bullish as of last week).

Regime will flip cash if:

  • QQQ drops 8%+ over any 15-day window, OR
  • QQQ closes 1% below its EMA-125 on daily close

Happy to answer questions on methodology, the sweep setup, or the regime state machine. Code is in Python with yfinance data. The crash detection and recovery rally logic are the parts most worth stress-testing if you're building something similar.

Backtest window: 2013–2025 | Start: $15,000 + $1,000/mo DCA | Data: Yahoo Finance Not financial advice. Leveraged ETFs can and do lose 80%+ in severe bear markets.

reddit.com
u/mongopark98 — 3 months ago

Can’t imagine staying on this forever

I don’t know how others are coping or any insights, but I can’t imagine being on Mounjaro for ever. It has helped and keeps helping with weight loss, but I have realized it is messing with my mental health.
I also feel sick halve of the time. I have brain fogs and can’t remember simple things. I am a software engineer, with AI eating our lunch I have to be sharp and have enough energy to keep ahead but I just can’t, that fatigue is killing me🤕

reddit.com
u/mongopark98 — 3 months ago
▲ 33 r/options+1 crossposts

Counter intuitive LEAPS backtest results

Almost every articles I have read suggests roughly same thing for LEAPS.

- Take profit when options or underlying grows above certain % , say 50% or 100%
- Roll up and out when DTE < 150-180 days
- Roll down when DTE goes below certain threshold.

I have done multiple backtests and the first one which seems the most straightforward has given counter intuitive results. Taking profit and then rolling performed worse in all combinations. I have simulated with over 100 combinations. Consulting chatGPT and Claude confirmed this behaviour.

This is specifically for mega cap, solid tickers. Not sure about swing trades. I am talking specifically as a long term stock replacement. So why does every article suggest this approach.

reddit.com
u/mongopark98 — 3 months ago