/Sign in

Data

The market data on the platform, uploading your own bars, and connecting your own database.

Contents

Market data on the platform

Backtests use "exchange bars" by default, in three markets:

Binance USDT-margined perpetuals

Long and short, with leverage; funding is settled

Binance spot

Long only, no leverage, no funding

US stocks

A cash account: long only, no leverage; a margin account when the request shorts (or trades a short leg, as pairs do): long and short, gross exposure (longs plus shorts) at most 2× the equity with cash never below zero (no borrowing for longs), shorts pay a 0.25% a-year borrow fee. Whole shares either way, no funding; US equity data, on the New York Stock Exchange calendar

Binance bars come in 1-minute, 5-minute, 15-minute, 1-hour, 4-hour and daily sizes; US bars in 5-minute, 15-minute, 1-hour and daily sizes, with no 4-hour bars. The fields are open, high, low, close, volume and turnover, plus funding rates for perpetuals. The first time a stretch of prices is used it may take a little longer.

US market data:

  • Symbols are US tickers such as AAPL or BRK.B; a strategy takes at most 20. The platform's pools us_top100 / us_top500 (ranked monthly by the last 30 sessions' dollar volume, common stocks only) can stand in for a symbol list.
  • Bars exist only inside the trading session: one daily bar per session, stamped with the session's date; hourly bars on the UTC hour, 7 on a regular session and 4 on an early close. Weekends and holidays have no bars and count as no gap.
  • Prices are split-adjusted (the raw prices are kept); dividends are paid as cash on the ex-date to the shares held, before tax, and a short pays the gross amount in lieu; a dividend declared in another currency is converted to US dollars at the ECB reference rate on the ex-date. The benchmark is SPY, with its dividends reinvested.
  • The margin account reads the same daily bars: whether a name may be shorted (real price ≥ $5, 30 sessions traded, 30-session average dollar volume ≥ $34.5M) is judged on its own daily bars through the previous close; before July 2024 there is no market-wide volume (the daily bars carry one exchange's), so those sessions are not checked on the dollar volume — only the real price ≥ $5 and the 30 sessions traded are, and the result flags it.
  • A stock that only changed its ticker (SQ → XYZ on 2025-01-21, BK → BNY) keeps one history under the new ticker, in the pools and in its daily bars. A request that names the old ticker runs on the new one and says so in the assumptions.
  • Daily bars are topped up every morning to the last closed session, which is the latest end a backtest can have. The platform holds daily bars for the whole market from July 2024 and longer daily and minute histories (from 2018) for a set of large stocks; a backtest that reaches a symbol or a month not loaded yet is refused with the symbols and months named.

Upload your own bars

Upload a CSV or Parquet file under "Data → My data":

  • Required columns: time, open, high, low, close, volume; column names are not case-sensitive and common spellings (such as ts / timestamp, o / open, vol) are recognized. The time is each bar's open time.
  • With several symbols, include a symbol column; without one, enter the symbol in the form.
  • Encoding: UTF-8. In Excel, export as "CSV UTF-8".
  • Bar size: a crypto file takes 1h, 4h or 1d; a US file takes 1m, 5m, 15m, 1h or 1d, and no 4h.
  • Time zone: a place; it applies only to timestamps without a time zone. "New York" follows daylight saving — pick it for a US file; the other places are fixed offsets without daylight saving.
  • Market: perpetual, spot or US stocks, perpetual by default. Choosing US stocks moves the time zone to New York (a zone you already chose stays). A US file is checked for gaps on the trading calendar; the platform adjusts none of the file's splits and trades the prices as they are.

A minimal file with BTCUSDT daily bars looks roughly like this (the numbers are only for illustration):

2025-01-01 00:00:00

open: 93500.0

high: 95000.0

low: 92800.0

close: 94600.0

volume: 152300.5

2025-01-02 00:00:00

open: 94600.0

high: 97800.0

low: 94200.0

close: 96900.0

volume: 201145.2

2025-01-03 00:00:00

open: 96900.0

high: 98900.0

low: 96000.0

close: 98100.0

volume: 178820.9

The data page: choose a file, fill in the symbol, time zone and market, then upload

After upload the platform validates the file: whether prices make sense, whether bars are continuous, whether every symbol has the same bar size. What can be fixed is fixed and noted (incomplete bars dropped, missing volume set to 0, duplicate timestamps keep the later bar, and so on); otherwise validation fails with the reason.

If validation fails on the platform's side, click "Retry"; if the file itself is at fault, fix it and upload again.

Uploading the same file with the same symbols and time zone again gives you the existing dataset (unless the earlier one failed validation), even if only the market changed.

Connect your own database

If your data lives in your own Postgres database, you can connect it directly instead of exporting files. Under "Data → Your own databases", enter the connection string (DSN); the platform connects with the read-only account you give it:

  • First create a read-only role in the database; the page has example SQL.
  • TLS is required, and only hosts reachable from the public internet are supported.
  • If the database has an IP allowlist, allow the platform addresses listed on the page.
  • You can open only some tables (allowlist / blocklist).
Data → "Your own databases": make the read-only role with the SQL on the page, fill in a label and the DSN, then "Connect and test"

Once connected, there are two ways to use it:

  • Ask in a conversation: say "in my database…" or "the <label> database…" and the Agent answers with read-only queries. The Agent sees part of the rows returned; how that part is handled is in the privacy policy. The run record keeps only the query, the row count and table and column names, never the data returned.
  • Import a table as data: turn a table into a dataset, either as backtest data (bars) or as a feature table for strategies to read. An import is a snapshot and the platform does not connect again; for new data, click "refresh" to make a new snapshot, and the old one stays. Imported bars are always treated as perpetual.

You need "databases" on the "Includes" line of Settings → Points, see Tiers and points.

Use your own data in a backtest

A validated bar dataset can go into a backtest in three ways:

  • Choose it under "Your data" in a data source menu. The menu is under the conversation's input box, on the board's "Params" and "Code" tabs, and on the strategy page.
  • Name it in a message, such as "use the data I uploaded, “X”…".
  • Click "Start a conversation on this data" on the dataset in "Data".
The data source menu under the conversation input: your datasets are in the "Your data" group; once one is chosen, backtests use it

A conversation remembers the data source it last used.

The dataset's bar size and market must match the strategy's, and it must include every symbol the strategy uses, or the backtest is refused. A conversation on a US dataset needs the market set to US stocks; opened from "Start a conversation with this data" on the Data page, the market is already the dataset's.

Backtests on your own data include no funding.