30 releases (18 breaking)

0.19.0 Jan 21, 2025
0.17.0 Dec 18, 2024
0.16.0 Nov 12, 2024
0.12.0 Jul 30, 2024
0.5.0 Nov 23, 2023

#6 in Finance

Download history 2786/week @ 2024-10-22 1778/week @ 2024-10-29 2039/week @ 2024-11-05 841/week @ 2024-11-12 177/week @ 2024-11-19 241/week @ 2024-11-26 239/week @ 2024-12-03 673/week @ 2024-12-10 578/week @ 2024-12-17 422/week @ 2024-12-24 672/week @ 2024-12-31 791/week @ 2025-01-07 518/week @ 2025-01-14 600/week @ 2025-01-21 315/week @ 2025-01-28 291/week @ 2025-02-04

1,804 downloads per month
Used in midas-client

Apache-2.0

160KB
3K SLoC

databento-rs

build Documentation license Current Crates.io Version Slack

The official Rust client library for Databento. The clients support fast and safe streaming of both real-time and historical market data through similar interfaces.

Installation

To add the crate to an existing project, run the following command:

cargo add databento

Usage

Live

Real-time and intraday replay is provided through the Live clients. Here is a simple program that fetches the next ES mini futures trade:

use std::error::Error;

use databento::{
    dbn::{Dataset, PitSymbolMap, SType, Schema, TradeMsg},
    live::Subscription,
    LiveClient,
};

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let mut client = LiveClient::builder()
        .key_from_env()?
        .dataset(Dataset::GlbxMdp3)
        .build()
        .await?;
    client
        .subscribe(
            &Subscription::builder()
                .symbols("ES.FUT")
                .schema(Schema::Trades)
                .stype_in(SType::Parent)
                .build(),
        )
        .await
        .unwrap();
    client.start().await?;

    let mut symbol_map = PitSymbolMap::new();
    // Get the next trade
    while let Some(rec) = client.next_record().await? {
        if let Some(trade) = rec.get::<TradeMsg>() {
            let symbol = &symbol_map[trade];
            println!("Received trade for {symbol}: {trade:?}");
            break;
        }
        symbol_map.on_record(rec)?;
    }
    Ok(())
}

To run this program, set the DATABENTO_API_KEY environment variable with an API key and run cargo run --example historical

Historical

Here is a simple program that fetches 10 minutes worth of historical trades for the entire CME Globex market:

use std::error::Error;

use databento::{
    dbn::{Schema, TradeMsg},
    historical::timeseries::GetRangeParams,
    HistoricalClient, Symbols,
};
use time::macros::{date, datetime};

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let mut client = HistoricalClient::builder().key_from_env()?.build()?;
    let mut decoder = client
        .timeseries()
        .get_range(
            &GetRangeParams::builder()
                .dataset("GLBX.MDP3")
                .date_time_range((
                    datetime!(2022-06-10 14:30 UTC),
                    datetime!(2022-06-10 14:40 UTC),
                ))
                .symbols(Symbols::All)
                .schema(Schema::Trades)
                .build(),
        )
        .await?;
    let symbol_map = decoder
        .metadata()
        .symbol_map_for_date(date!(2022 - 06 - 10))?;
    while let Some(trade) = decoder.decode_record::<TradeMsg>().await? {
        let symbol = &symbol_map[trade];
        println!("Received trade for {symbol}: {trade:?}");
    }
    Ok(())
}

To run this program, set the DATABENTO_API_KEY environment variable with an API key and run cargo bin --example live.

Documentation

You can find more detailed examples and the full API documentation on the Databento docs site.

License

Distributed under the Apache 2.0 License.

Dependencies

~9–22MB
~295K SLoC