Nearly every bad backtest we have audited traced back to the data layer. Bars silently trimmed at startup, a symbol that changed lot size mid-history, a holiday that produced a phantom candle, or a downloader re-fetching a year of data on every restart until the broker throttled it.
What we build
- Downloaders that respect broker rate limits and resume cleanly after failure
- A coverage ledger, so the system knows exactly which ranges it holds and fetches only the gap
- Tick, one-minute and daily storage with a consistent timestamp convention
- Expiry, strike and lot-size mapping for derivatives, versioned over time
- Quality checks: gap detection, duplicate bars, zero volume, impossible ranges, stale sequences — with alerts
The measurable outcome is usually blunt: a startup that took five minutes and a few hundred broker calls drops to one call per symbol and a few seconds.