Quantitative trading systems
Three systems built to understand stochastic processes properly. The interesting part was never the returns — it was what each one revealed about its own assumptions.
Mean reversion under an Ornstein–Uhlenbeck model
A pairs trading engine that models the spread between two cointegrated instruments as an OU process, fits the mean-reversion rate and long-run level, and sizes entries against the fitted half-life rather than a fixed threshold.
What it teaches is how fragile cointegration is. Pairs that test as cointegrated over one window frequently aren't over the next, and a strategy that doesn't re-test continuously is holding a position based on a relationship that has already dissolved. Most of the engineering went into making that re-testing cheap enough to run constantly.
It was later refactored from a working script into a proper object model — separate concerns for data ingestion, parameter estimation, signal generation, and execution simulation. That refactor is the reason it can be extended without breaking, and it's the part I'd point at rather than any backtest figure.
Volatility surface construction
A builder that takes option chains, inverts Black–Scholes for implied volatility across strikes and expiries, and assembles the surface. Straightforward in principle and full of practical traps: illiquid strikes produce nonsense implied vols, bid-ask midpoints mislead near the wings, and naive interpolation generates surfaces that permit arbitrage.
Handling those cases honestly — discarding rather than smoothing over them — is most of the work.
Agent-based bubble formation
A market simulation populated by agents with heterogeneous strategies — fundamental valuation, trend following, noise — to watch price detach from fundamentals without anyone in the model intending it.
The result that stays with me is how small the trend-following population has to be before the dynamic appears. Bubbles don't require irrationality in the model; they require a feedback loop and enough participants inside it.
What I'd do differently
All three were validated on historical data with no transaction costs, no slippage, and no market impact. That's acceptable for studying the dynamics and useless for estimating whether anything would have worked. I'd build the cost model first now — it changes which strategies look viable more than any parameter choice does.