my backtest said ₹25L → ₹2.7Cr. an honest audit said otherwise. full autopsy inside
some of you might've seen my build-to-kill post from a few days back. in the 4 days since, the system got "finished". multi sleeve, everything wired, and the final backtest spat out: ₹25L becomes ~2.7Cr median over 15 years, worst drawdown −31%. i'm not gonna lie, i stared at that number for a while and started mentally spending money.
problem is it's family capital. my dad's money, one shot, no refill. so before touching anything i decided to spend a day being the meanest reviewer my system could face. not "double checking". actively trying to prove my own work is garbage. wrote down everything that died, posting it here because honestly some of these hurt and i'd rather you find them in your systems before your first bad week does.
my hedge could not physically exist. the tail protection was shorting a basket of ~41 stock futures, and at my capital that whole basket got about ₹4-5L of notional. one stock futures lot is ₹5-15L. so the backtest had been "holding" a hedge for years that my account literally cannot hold even one leg of. every drawdown number i was proud of assumed protection that doesn't exist at my size. i genuinely sat there for a minute after this one.
found a 2.4x sizing mismatch between my model and my live code. the projections sized the options sleeve as a fraction of capital. the execution code sized it as a margin budget. two different conventions, both looked reasonable, nobody ever compared them. reconciling constant by constant showed live would've run 2.4x the short-vol risk that every single tail number assumed. no error message. every report looked normal. this would've only announced itself in a crash, at 2.4x the size i "planned" for.
one of my sleeves is literally illegal. currency futures leg, decent sharpe, backtested clean. turns out RBI barred retail from exchange traded currency derivatives without underlying exposure back in 2024. no data feed tells you this. your parquet files don't care what the rulebook says. felt like an idiot googling it after weeks of "research".
look-ahead was hiding in my liquidity filter of all places. i filtered tradeable stocks by fill rate computed over the full history, which means the filter knew in 2015 which names would still be liquid in 2024. that alone was +1.6pp/yr of completely fake alpha. everyone checks their signals for look-ahead. nobody checks the boring plumbing. it's always in the plumbing.
my crash kill-switch was validated on a proxy that flattered it 2x. tested on an index proxy: cuts max dd from −25%, looked great. rebuilt on the actual portfolio daily: real drawdown is −44% and the kill-switch cuts way less of it, at double the cost. if you validated something on a proxy you validated nothing.
and the part that actually humbled me, the errors ran the other way too. my slippage haircut, which i thought was the responsible conservative choice, turned out ~15x too harsh once i actually measured effective spreads from 23M rows of 1-min options data instead of assuming. and my tax model charged flat 30% on f&o... at my actual income slab the real rate is basically 0 (87A rebate, if you trade f&o small and don't know this, go look it up today). so i wasn't being conservative. i just didn't know, in both directions.
where it landed: honest numbers are roughly half the wealth and nearly double the drawdown of the pretty version. then measurement gave some back legitimately. it now runs at lower leverage than the optimizer wanted, on paper only, and it has to earn its way to real money.
the thing i actually kept from all this is a stupid boring document where every input is tagged: measured / estimated / assumed / no-way-to-know, with how much the answer moves if it's wrong. before the audit i had ~40 inputs and could honestly account for maybe 15. the scary column isn't what's wrong. it's what's unmeasured.
running count since i started: ~50 ideas tested, ~45 dead. the survivors are boring and staying that way.
happy to go deep on any of these in comments. can also paste the audit checklist i now run on everything if anyone wants it, fair warning it's deeply unpleasant to use on your own work. pretty sure that's the point.