Every quantitative trading shop eventually builds their own backtesting engine. It's a rite of passage - you start with someone else's framework, hit a wall when you need something custom, and end up writing your own. We followed that path. What we didn't expect was that our internal tool would become something worth sharing.
In July of last year, we started building what would become our primary research infrastructure. The goal was simple: a Python backtesting engine that handled the realities of multi-asset portfolio simulation without the ceremony of enterprise platforms or the limitations of academic libraries. Seven months later, we're making it public.
Why Another Backtester?
The Python ecosystem has no shortage of backtesting frameworks. Backtrader, Zipline, VectorBT, QuantConnect - each has strengths. But when you're running serious research, you need specific capabilities that don't always align with what's available off the shelf.
We needed Monte Carlo simulation with block-bootstrap resampling to preserve win/loss sequence patterns. We needed walk-forward analysis across rolling time windows to catch overfitting before it reached production. We needed parameter sensitivity sweeps that could show us when a strategy depended too heavily on exact settings. We needed regime heatmaps to understand how performance shifted across different VIX environments.
Most importantly, we needed all of this to work with multiple data sources - Norgate for survivorship-bias-free US equities, Yahoo Finance for quick prototyping, Massive API for futures, and CSV imports for proprietary datasets - without requiring API keys or subscriptions for basic use.
What Makes July Different
Monte Carlo with Block Bootstrap
Traditional Monte Carlo shuffles trade outcomes randomly, which destroys autocorrelation structure. If your strategy has streaky win/loss patterns, random shuffling will underestimate tail risk. Block bootstrap solves this by sampling trades in sequences, preserving the clustering behavior of real performance.
July runs Monte Carlo by default on every backtest. You get a distribution of outcomes, not just a single equity curve. This makes it trivial to answer questions like: "What's the 5th percentile return over the test period?" or "How often does this strategy experience a 20% drawdown?"
Walk-Forward Analysis
Overfitting is the silent killer of quantitative strategies. A backtest that looks phenomenal in-sample often collapses out-of-sample because the parameters were tuned to historical noise, not signal.
Walk-forward analysis splits your data into training and testing windows, optimizes parameters on the training set, tests them on the hold-out set, and rolls forward through time. If performance degrades significantly out-of-sample, you know the strategy won't generalize. July automates this entire process and visualizes the degradation across periods.
Parameter Sensitivity Sweeps
A robust strategy should have a flat region around its optimal parameters. If changing an EMA period from 50 to 51 tanks your Sharpe ratio, you don't have an edge - you have a curve-fitted accident.
July's sensitivity sweep runs a grid search across parameter ranges and plots performance as a heatmap. You can visually identify whether your strategy has a stable region or a single lucky peak surrounded by cliffs.
Regime Heatmaps
Different market conditions favor different strategies. A momentum strategy that works in low-volatility trending markets may bleed capital during high-VIX whipsaw periods.
July bins your backtest results by VIX regime and shows performance across each bucket. You can see at a glance whether your strategy works everywhere or only in specific conditions - and whether those conditions are common enough to justify the strategy's use.
ML-Ready Trade Export
Modern quantitative research often involves feeding backtest features into machine learning models. July exports every trade with entry/exit timestamps, holding periods, P&L, market conditions at entry, and custom strategy-specific features you define.
This makes it trivial to build downstream models that predict trade outcomes, optimize position sizing dynamically, or filter trades based on learned patterns.
Getting Started
The repository is live at github.com/zachisit/july-backtester. Installation is straightforward:
pip install july-backtester
The documentation walks through a full example: loading data from Yahoo Finance (no API key required), defining a simple moving average crossover strategy, running a backtest with Monte Carlo enabled, and generating all the standard reports - equity curve, drawdown chart, trade log, and performance metrics.
For users with Norgate or Massive API subscriptions, the data adapters are plug-and-play. For custom data, the CSV import handles OHLCV format with automatic column mapping.
Why Open Source This?
We could have kept this internal. Most trading firms guard their infrastructure like nuclear launch codes. But backtesting engines aren't a source of edge - the strategies you run on them are.
By open-sourcing July, we gain more than we lose. We get external contributions that improve the engine for everyone. We establish a shared standard that makes it easier to reproduce research and validate findings. We reduce the friction for talented researchers who want to contribute to Light Water's work but don't want to rebuild infrastructure from scratch.
Most importantly, we believe transparency in research tooling builds trust. If someone wants to validate our published results, they can use the exact same backtesting engine we used, with the same cost models, the same data handling, and the same statistical tests. Reproducibility is a feature, not a liability.
What's Next
July is actively maintained. We're using it daily for internal research, which means bugs get found and fixed quickly. The roadmap includes options backtesting support, intraday data handling for higher-frequency strategies, and tighter integration with ML pipelines for automated feature engineering.
Community contributions are welcome. Star the repo, fork it, open a PR. If you build something useful on top of July, we'd love to see it. The more people use this tool, the better it becomes for everyone.
Quantitative trading has too many barriers to entry already. July is our attempt to lower one of them.
Leave a comment - join the conversation
Share your thoughts, questions, or insights on this article. We'd love to hear your perspective.
Comment on LinkedIn