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.