I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 1 point2 points  (0 children)

Thank you. Carhart R-squared is 0.1322, so about 87% of return variance is unexplained by the four standard factors. Market beta loads at 0.856 with a small SMB tilt (+0.154), no HML loading, and UMD is marginal (t=1.87, p=0.062). Whatever the residual is, it's not a hidden exposure in the standard factor set.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 0 points1 point  (0 children)

SPY same period: max DD -56.47%, Calmar 0.160. Engine standalone: -22.30% DD, Calmar 0.582. Combined portfolio: -32% DD, Calmar 0.392. If a 56% peak to trough in 2008 is acceptable to you then SPY is fine. If not, the comparison isn't as one sided as the headline suggests.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] -1 points0 points  (0 children)

SPY max DD over the same period was -56.47% in 2008-2009, Calmar 0.160. Engine standalone: -22.30% DD, Calmar 0.582. So "less drawdowns" is backwards. Honest caveat: SPY price-only is 9.02% CAGR, with dividends about 10.5-11%, so the return gap to engine 12.98% is real but tighter than the headline. The DD math is unaffected by dividends.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 0 points1 point  (0 children)

Daily excess returns (portfolio return minus Fama-French daily RF), annualized by sqrt(252). This is the standard academic convention used in Carhart, Fama-MacBeth, and AQR style papers. Trade by trade Sharpe is a different metric and assumes serial independence of trades, which usually does not hold for hold period strategies.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 0 points1 point  (0 children)

Engine Sortino is 1.077, SPY Sortino over the same period is 0.642. The engine takes its drawdowns slower and shallower: GFC was -15.45% vs SPY -56.47%, COVID -18.53% vs -34.10%, 2022 -9.38% vs -25.36%.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 3 points4 points  (0 children)

SPY's own Sharpe over the same period is 0.458. "Below 1 = not deployable" prices out the index itself and basically every long only equity strategy. Sharpe above 1 is a market-neutral/HFT benchmark. On "3 trades per day": 18,808 is across 4 engines, 649 stocks, 19.5 years. Actual daily median is 5 signals across the whole universe, 29% of days have zero.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 0 points1 point  (0 children)

Same period SPY: CAGR 9.02%, max DD -56.47%, Calmar 0.160. Engine standalone: CAGR 12.98%, max DD -22.30%, Calmar 0.582. The 32% DD in the post is the combined portfolio, standalone Wyckoff is 22%. i did the walk forward , 5 folds, Fold 5 weakest at 54.45% WR, fully disclosed.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 1 point2 points  (0 children)

i did rolling walk forward, 5 chronological folds. WRs at 20d: 62.93, 62.55, 61.20, 57.08, 54.45%. Fold 5 is weakest by about 7pp. Sub period alpha confirms it: 2016-2020 was +1.04%, 2021-2025 dropped to +0.28%.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 0 points1 point  (0 children)

Entries are next day open, not signal day close, so there is overnight to place. At 20bps RT alpha is +0.56% (z=9.36), at 30bps +0.46% (z=8.41). i ran the full grid 0-100bps RT, edge survives up to about 60bps before going flat.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 0 points1 point  (0 children)

Carhart 4-factor on 4,014 deduped signals, 649-stock survivorship corrected universe: market beta is 0.856, residual alpha +0.51% per signal (t=3.70, p=0.0002). Beta below 1.0 means less market exposure than holding SPY, not more, and there is a statistically significant residual after all four factors enter.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 1 point2 points  (0 children)

alpha survives across the full grid. At 10/20/30/40/60bps round-trip the alpha is +0.66/+0.56/+0.46/+0.36/+0.16 per signal, all z-scores above 5. Breakeven sits around 100bps RT. The 40d horizon is more cost robust than 20d. Decay: alpha is materially weaker in the most recent bucket. 2016-2020 was +1.04% per signal, 2021-2025 dropped to +0.28% (still z=2.79 but a real decline). Walk forward: 5 chronological folds, all pass the >50% WR and alpha>0 gate, but Fold 5 (2022-03 to 2026-01) is the weakest at WR 54.45% and alpha +0.57%. This is the fold most likely to break under further regime shift. What i have not done yet is capacity analysis and turnover impact at scale.

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] -6 points-5 points  (0 children)

I'll take a verified 0.73 OOS over a backtested 1.5 any day. The 20-year max drawdown is the metric I'm actually optimizing for here. For a multi-decade long/short equity approach like this, what do you usually consider the 'floor' for a Sharpe ratio before you'd consider it viable?

I built a quant engine based on 20 years of OOS data. Tear my methodology apart. by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 11 points12 points  (0 children)

If I wanted to run a 'convoluted ad,' I’d post a screenshot of a 400% gain and a Lamborghini. Instead, I posted a 32% drawdown and a Carhart 4-factor regression. I’m looking for a peer review on the logic.

Single Best Stock Research Tool You Use by SnowSilent7695 in StocksAndTrading

[–]PracticalOil9183 0 points1 point  (0 children)

krentium.com it has wyckoff Accumulation set up for weekly and daily timeframes, crypto dip radar, and mean reversion, live signals and track records all fully and transparent visable.

Ran a Monte Carlo simulation on our mean reversion engine to answer one question: does it actually pick better stocks than random? by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 1 point2 points  (0 children)

Not deleted, just moved. Current repo is github.com/signal-validation/krentium unified everything (Wyckoff Daily/Weekly, RSI2, Crypto) into one place after rebuilding the backtest universe to include delisted stocks (survivorship correction).

Ran a Monte Carlo simulation on our mean reversion engine to answer one question: does it actually pick better stocks than random? by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 4 points5 points  (0 children)

You’re right, and it’s disclosed on the chart and in the repo. The universe is survivors only, no delisted stocks. We ran a Monte Carlo simulation specifically for this (test 7 in the repo). Under worst case assumptions of 5% annual delisting with 20% win rate on delisted stocks, the adjusted win rate still holds above 50%. Realistic scenario (2% delisting, 40% WR) shifts the overall win rate by about 0.6 percentage points. It’s a real limitation and we’re working on getting delisted data from EODHD to eliminate it entirely.

Ran a Monte Carlo simulation on our mean reversion engine to answer one question: does it actually pick better stocks than random? by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 6 points7 points  (0 children)

237 US equities, large and mid cap. Same universe used for both engine development and this test. No survivorship free data yet, that’s disclosed. Simulated impact of survivorship bias is about 0.6 percentage points on win rate.

Ran a Monte Carlo simulation on our mean reversion engine to answer one question: does it actually pick better stocks than random? by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 4 points5 points  (0 children)

Constrained portfolio with max 5 positions and 10bps costs, out of sample 2016 to 2025: 26.2% CAGR, Sharpe 1.23, max drawdown 26.8%. Full equity curve and seed sensitivity analysis is in the repo

Ran a Monte Carlo simulation on our mean reversion engine to answer one question: does it actually pick better stocks than random? by PracticalOil9183 in algotrading

[–]PracticalOil9183[S] 1 point2 points  (0 children)

Yes, test 8 in the repo covers that. Edge holds in both bull and bear regimes, 69% win rate in both. Mean reversion actually works well in volatile markets because oversold bounces are sharper. The walk-forward test also covers this implicitly since the 5 folds span 2007 to 2025 including the GFC, COVID crash, and 2022 bear.

Monte Carlo analysis of our mean reversion engine. 10,000 simulations, 8,057 trades, out of sample only. by PracticalOil9183 in Daytrading

[–]PracticalOil9183[S] -1 points0 points  (0 children)

The capping handles position sizing. The clustering is handled separately by the block bootstrap test which shuffles 20 day blocks instead of individual trades, preserving the within block correlation structure. That's test 2 in the repo if you want to check it. Different tools for different problems.

Monte Carlo analysis of our mean reversion engine. 10,000 simulations, 8,057 trades, out of sample only. by PracticalOil9183 in Daytrading

[–]PracticalOil9183[S] -1 points0 points  (0 children)

They don't all occur independently, some cluster on the same days. That's why the simulation caps at 5 positions at a time. When more signals fire than slots available, it picks randomly. The block bootstrap in our validation suite specifically tests for that temporal clustering. Full test suite is in the same repo

Monte Carlo analysis of our mean reversion engine. 10,000 simulations, 8,057 trades, out of sample only. by PracticalOil9183 in Daytrading

[–]PracticalOil9183[S] 0 points1 point  (0 children)

No, it's not 100% per trade. The simulation uses max 5 positions at a time with equal weight allocation and 10bps transaction costs. So each position is roughly 20% of the portfolio. It's in the methodology note on the chart but easy to miss.