nautechsystems/nautilus_trader · error

No raw symbol found for {instrument_id}

Error message

No raw symbol found for {instrument_id}

What it means

To map a record to a Nautilus symbol, the decoded Nautilus instrument ID (numeric/dynamic symbol like the raw DBN instrument_id) is looked up in the metadata's symbol map for the record's date. If the raw symbol for that instrument ID does not exist in the symbology map for that day, this error is thrown — the symbology metadata does not cover the instrument at that timestamp.

Source

Thrown at crates/adapters/databento/src/symbology.rs:150

    } else if let Some(msg) = record.get::<dbn::Cmbp1Msg>() {
        (msg.hd.instrument_id, msg.ts_recv)
    } else if let Some(msg) = record.get::<dbn::CbboMsg>() {
        (msg.hd.instrument_id, msg.ts_recv)
    } else if let Some(msg) = record.get::<dbn::TbboMsg>() {
        (msg.hd.instrument_id, msg.ts_recv)
    } else {
        anyhow::bail!("DBN message type is not currently supported")
    };

    let duration = time::Duration::nanoseconds(nanoseconds as i64);
    let datetime = time::OffsetDateTime::UNIX_EPOCH
        .checked_add(duration)
        .ok_or_else(|| anyhow::anyhow!("Timestamp overflow for record"))?;
    let date = datetime.date();
    let symbol_map = metadata.symbol_map_for_date(date)?;
    let raw_symbol = symbol_map
        .get(instrument_id)
        .ok_or_else(|| anyhow::anyhow!("No raw symbol found for {instrument_id}"))?;

    let symbol = Symbol::from_str_unchecked(raw_symbol);

    Ok(InstrumentId::new(symbol, venue))
}

#[must_use]
pub fn infer_symbology_type(symbol: &str) -> SType {
    if symbol.ends_with(".FUT") || symbol.ends_with(".OPT") {
        return SType::Parent;
    }

    let parts: Vec<&str> = symbol.split('.').collect();
    if parts.len() == 3 && parts[2].chars().all(|c| c.is_ascii_digit()) {
        return SType::Continuous;
    }

    if symbol.chars().all(|c| c.is_ascii_digit()) {

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Re-request metadata with a start/end range that fully covers the data's timestamps (same range as the get_range call), then retry.
  2. Re-download data and metadata together so their date ranges match.
  3. Refresh any cached MetadataCache — don't reuse one across sessions or date ranges.
  4. If the instrument legitimately has no symbology entry for that date, filter those records out before mapping.

Example fix

// before
let data = client.get_range(dataset, symbols, "glbx-0.1", start, end).await?;
let meta = client.get_range(dataset, "", "glbx-0.1", end - 1.day, end).await?; // too narrow

// after
let data = client.get_range(dataset, symbols, "glbx-0.1", start, end).await?;
let meta = client.get_range(dataset, "", "glbx-0.1", start, end).await?; // matches data range
Defensive patterns

Strategy: validation

Validate before calling

// Rust
let date = offset_datetime_from_nanos(record.ts_event()).date();
anyhow::ensure!(
    metadata.covers_date(date),
    "symbol map missing for {date}; widen metadata date range"
);

Try / catch

let id = match decode_nautilus_instrument_id(record, metadata, &pub_map, &sym_map) {
    Ok(id) => id,
    Err(e) if e.to_string().starts_with("No raw symbol found") => {
        log::warn!("no symbology for record on {date}; skipping");
        return Ok(None);
    }
    Err(e) => return Err(e.into()),
};

Prevention

When it happens

Trigger: Decoding records whose timestamp date lies outside the range covered by the metadata's symbol maps (metadata requested for a shorter date range than the data), or instruments absent from the dataset's symbology (e.g. instrument listed/delisted outside the metadata window, universe filtering, or stale/cached metadata from an earlier request).

Common situations: Requesting data and metadata with mismatched start/end dates; reusing a cached MetadataCache across days; GLBX.MDP3 data containing instruments that rolled in after the metadata snapshot; reading an old data file with newly fetched metadata.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/8f33ebb482daf975. Report an issue: GitHub.