← About me & projectsNotes
What the projects taught me
Short write-ups on the lessons behind the numbers. Thank you for reading.
November 2026
Three training episodes, one lesson about selling options
I saved my options agent at three points in its training and ran each version on the same five unseen years of SPY, from October 2021 to November 2026. The three versions behaved like three different traders.
The first mostly bought puts and sold calls, and lost 44% of its $100k account. The second split between buying calls and selling puts and finished +42%. The final version sold a put on every one of its 168 trades, won 79% of them and finished +59%, with a Sharpe ratio of 0.74 against SPY’s 0.76.
What did it learn? Options on SPY were usually priced for more volatility than actually arrived: implied volatility beat what followed on about 85% of days. Selling puts collects that difference, which researchers call the variance risk premium. The catch is that the premium is payment for crash risk. You can see it in the equity curve: steady gains, then sharp losses in falling markets such as September 2022 and the final weeks of the test.
The lesson I take from it is that training changed the strategy itself, not just its score, and that a high win rate tells you very little until you look at the size of the losses. You can watch every trade on the trading desk.
November 2026
Keeping the future out of the past
The quickest way to build a brilliant backtest is to let tomorrow’s information leak into today’s decision. It is also the most common mistake in quantitative research, so I guard against it in three small places in my shared library.
Lag every weight. In my portfolio backtest, weights computed from today’s prices are shifted one day before they earn a return: weights = target_weights.shift(1). Without that one line, the strategy trades on prices it could not yet have seen.
Split by date, not by row. With hundreds of stocks, a random train/test split puts the same day in both sets. My chronological_split cuts the data at a date, so every test day comes after every training day.
Purge overlapping targets. When a model predicts 21-day volatility, a training row from 10 days before the test period has a target that reaches into it. My walk-forward refits drop those rows, so the answer never sneaks into training.
None of these is clever. Together they are why I trust my results enough to report the ones that lost to buy-and-hold.
November 2026
Why I report the results that lost
Several of my projects did not beat their benchmark. My regression strategies grew $1 to $3.27 against $3.45 for simply holding every stock equally. My stock-trading agent earned $301 per share against $308 for buy-and-hold. My risk-parity portfolio had similar drawdowns to an equal-weight mix but grew less.
I show these results on purpose. Markets are hard to beat, and a portfolio of projects where everything wins usually means the testing was too generous. What I can show instead is a careful process: data kept out of sample, costs charged where they belong, and a clear account of what each result does and does not prove.
Each negative result also pointed somewhere useful. The regression work showed that momentum alone barely predicts daily direction. The stock agent showed that with only buy and sell in a rising market, the best policy is close to holding. Those findings shaped the options agent, which trades a real source of return, and my current research on detecting regime change before drawdowns begin.