Available symbols

Discover available symbols and their configuration through the Python SDK.

HTTP endpoints on this page

  • GET/data/calibrated-data

Parameters and response shapes for each are in the API reference.

client.data.calibrated_data() lists the instruments that are already calibrated, and therefore simulatable, with their available dates, trading parameters and volume statistics. This is the list to drive a symbol picker from, and the place to find a valid cal_date before calling simulation.run(). For raw days that are not yet calibrated, see Available data.

Methods

  • data.calibrated_dataCalibrated instruments with their dates, trading parameters and volume statistics.any

Only calibrated days

The endpoint filters on pipeline state server-side, so there is no status or stage for you to check: if a date is in the response, you can simulate it. Both fields are reported for provenance and always read complete / model_calibration.

Filtering and paging

Called with no arguments it returns the whole catalog, which is large. Every filter narrows it server-side, and they combine with AND: symbol is an exact ticker; q is a case-insensitive substring over the ticker and company name ("angl" finds ANGLO AMERICAN); exchange and provider use the same spellings as simulation.run(); date keeps only symbols calibrated on that day and narrows each symbol's available_dates to it. A malformed date matches nothing (total 0) rather than raising.

Paging is by instrument, not by row, so a limit never cuts one instrument's dates in half. total is the match count before paging, so offset + len(symbols) < total means more pages remain.

What an instrument carries

Each entry in symbols is one instrument with every calibrated date for it. company_name is None for some providers, so fall back to the ticker. tick_size is the minimum price increment and lot_size the minimum order size; an execution algorithm's order_size is in lots, so multiply by lot_size to reason in shares. Each available_dates record has number_of_msgs, volume_traded and reference_price, and the two averages are means over exactly the dates shown.

json
{
  "total": 1,
  "limit": null,
  "offset": 0,
  "symbols": [
    {
      "symbol": "700.HK",
      "company_name": null,
      "provider": "omd",
      "exchange": "hkex_securities",
      "instrument_type": "equity",
      "currency": "HKD",
      "tick_size": 0.5,
      "lot_size": 100,
      "available_dates": [
        {
          "date": "2025-09-02",
          "status": "complete",
          "stage": "model_calibration",
          "number_of_msgs": 252812,
          "volume_traded": 21861323.0,
          "reference_price": 605.0
        }
      ],
      "avg_number_of_msgs": 252812.0,
      "avg_volume_traded": 21861323.0
    }
  ]
}

The same ticker can appear more than once, sourced from different providers or exchange protocols, and those entries carry different dates and different tick sizes. Tencent is 700.HK under omd but 700 under bmll. A row is identified by (symbol, provider, exchange), not by symbol alone; use that triple as the key if you cache the catalog.

Examples

python
catalog = client.data.calibrated_data(limit=5)
print(catalog["total"], "calibrated instruments")

for sym in catalog["symbols"]:
    label = sym["company_name"] or sym["symbol"]
    dates = [d["date"] for d in sym["available_dates"]]
    print(f"{sym['symbol']} ({label}) on {sym['provider']}: {len(dates)} dates")

The newest calibrated date for one instrument is always safe to pass to run():

python
rows = client.data.calibrated_data(symbol="700.HK", provider="omd")["symbols"]
dates = [d["date"] for row in rows for d in row["available_dates"]]
print("Latest ready date:", max(dates) if dates else None)

# Which symbols are ready on a particular date?
ready = client.data.calibrated_data(date="2025-09-02")["symbols"]
print([s["symbol"] for s in ready])

Next, run a simulation on one of these days: see the run and load recipe.