Skip to main content
The open-source engine runs on the data you give it. History depth, delay and coverage are those of your source, not of the engine.

Data sources

Yahoo’s history has survivorship bias: delisted stocks aren’t there. A strategy that looks good on today’s survivors may not have been tradeable at the time.

Bundles

Bars are ingested into a named bundle, stored as Delta Lake tables under ~/.ziplime/data, and keyed by the sid of each instrument in the asset database. That is why instruments come first:
  • -f, --frequency sets the bar interval of the bundle: 1m, 5m, 15m, 30m, 1h, 1d, and others.
  • --merge adds to an existing bundle instead of replacing it.
  • --forward-fill (on by default) fills sessions an instrument didn’t trade with its previous close.
  • A ticker that isn’t unique must be written TICKER@MIC.
Each ingest creates a new bundle version; ziplime run --bundle-version picks one, and ziplime clean removes old ones.

Timeframes

A run’s emission rate — how often handle_data is called — can be anything from one minute to one day: 1 minute, 5, 15, an hour, a day.
  • A minute bundle can feed a slower run: in the Python API, load_bundle(..., frequency=..., aggregations=[...]) aggregates bars to the requested frequency (see examples/run_simulation_daily_yahoo_finance.py).
  • Intraday vendor bars are placed on the simulation clock so no bar leaks into the one before it.
  • time_rules in schedule_function work at any intraday rate.
  • data.history(frequency=...) reads a window at a different interval from the emission rate.

Point in time

Datasets that describe the past with a delay — filings, fundamentals, disclosures — are windowed by the date a row became public, not by the period it describes. A strategy on bar t sees only what was published by t.
The engine is not intended for strategies whose outcome depends on sub-second timing, such as high-frequency trading or latency arbitrage. See Limitations.