docs/concepts/instruments/crypto_futures_spread.md
CryptoFuturesSpread represents an exchange-defined spread strategy over crypto
futures. The venue publishes the strategy as a single instrument with its own symbol,
strategy type, precision, increments, and expiration.
Examples include listed crypto futures calendar spreads.
| Field | Rust type | Python type | Required/default | Notes |
|---|---|---|---|---|
instrument_id | InstrumentId | InstrumentId | Required | Stored as id in Rust. |
raw_symbol | Symbol | Symbol | Required | Native venue symbol. |
underlying | Currency | Currency | Required | Crypto asset the strategy tracks. |
quote_currency | Currency | Currency | Required | Currency used to quote the price. |
settlement_currency | Currency | Currency | Required | Currency used to settle PnL and fees. |
is_inverse | bool | bool | Required | True when sizing/costing is inverse. |
strategy_type | Ustr | str | Required | Venue strategy type, such as calendar. |
activation_ns | UnixNanos | int | Required | Strategy activation timestamp. |
expiration_ns | UnixNanos | int | Required | Strategy expiration timestamp. |
price_precision | u8 | int | Required | Decimal places allowed for prices. |
size_precision | u8 | int | Required | Decimal places allowed for order sizes. |
price_increment | Price | Price | Required | Smallest valid price step. |
size_increment | Quantity | Quantity | Required | Smallest valid size step. |
multiplier | Quantity | Quantity | 1 | Strategy multiplier. |
lot_size | Quantity | Quantity | 1 | Rounded lot or board size. |
max_quantity | Option<Quantity> | Quantity | None | None | Maximum order quantity. |
min_quantity | Option<Quantity> | Quantity | None | None | Minimum order quantity. |
max_notional | Option<Money> | Money | None | None | Maximum order notional value. |
min_notional | Option<Money> | Money | None | None | Minimum order notional value. |
max_price | Option<Price> | Price | None | None | Maximum valid quote or order price. |
min_price | Option<Price> | Price | None | None | Minimum valid quote or order price. |
margin_init | Option<Decimal> | Decimal | None | 0 | Initial margin rate. |
margin_maint | Option<Decimal> | Decimal | None | 0 | Maintenance margin rate. |
maker_fee | Option<Decimal> | Decimal | None | 0 | Maker fee rate. Negative values rebate. |
taker_fee | Option<Decimal> | Decimal | None | 0 | Taker fee rate. Negative values rebate. |
tick_scheme_name | N/A | str | None | None | Registered variable tick scheme name. |
info | Option<Params> | dict | None | None | Adapter metadata. |
ts_event | UnixNanos | int | Required | Event timestamp in nanoseconds. |
ts_init | UnixNanos | int | Required | Initialization timestamp in nanoseconds. |
Note: Python constructors use instrument_id; Rust stores the same value as id.
CryptoFuturesSpread has asset class Cryptocurrency and instrument class
FuturesSpread.info when the adapter provides them.use chrono::{TimeZone, Utc};
use nautilus_core::UnixNanos;
use nautilus_model::{
identifiers::{InstrumentId, Symbol},
instruments::CryptoFuturesSpread,
types::{Currency, Price, Quantity},
};
use rust_decimal_macros::dec;
use ustr::Ustr;
let activation = Utc.with_ymd_and_hms(2026, 5, 12, 0, 0, 0).unwrap();
let expiration = Utc.with_ymd_and_hms(2026, 5, 19, 8, 0, 0).unwrap();
let btc_spread = CryptoFuturesSpread::new(
InstrumentId::from("BTC-FS-19MAY26_PERP.DERIBIT"),
Symbol::from("BTC-FS-19MAY26_PERP"),
Currency::from("BTC"),
Currency::from("USD"),
Currency::from("BTC"),
false,
Ustr::from("FS"),
UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64),
UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64),
1,
0,
Price::from("0.5"),
Quantity::from("1"),
Some(Quantity::from("10")),
Some(Quantity::from("1")),
None,
Some(Quantity::from("1")),
None,
None,
None,
None,
None,
None,
Some(dec!(0.0003)),
Some(dec!(0.0003)),
None,
UnixNanos::default(),
UnixNanos::default(),
);
from decimal import Decimal
import pandas as pd
from nautilus_trader.model.currencies import BTC
from nautilus_trader.model.currencies import USD
from nautilus_trader.model.identifiers import InstrumentId
from nautilus_trader.model.identifiers import Symbol
from nautilus_trader.model.instruments import CryptoFuturesSpread
from nautilus_trader.model.objects import Price
from nautilus_trader.model.objects import Quantity
btc_spread = CryptoFuturesSpread(
instrument_id=InstrumentId.from_str("BTC-FS-19MAY26_PERP.DERIBIT"),
raw_symbol=Symbol("BTC-FS-19MAY26_PERP"),
underlying=BTC,
quote_currency=USD,
settlement_currency=BTC,
is_inverse=False,
strategy_type="FS",
activation_ns=pd.Timestamp("2026-05-12T00:00:00", tz="UTC").value,
expiration_ns=pd.Timestamp("2026-05-19T08:00:00", tz="UTC").value,
price_precision=1,
size_precision=0,
price_increment=Price.from_str("0.5"),
size_increment=Quantity.from_int(1),
multiplier=Quantity.from_int(10),
lot_size=Quantity.from_int(1),
min_quantity=Quantity.from_int(1),
maker_fee=Decimal("0.0003"),
taker_fee=Decimal("0.0003"),
ts_event=0,
ts_init=0,
)
Representative adapters that create or consume CryptoFuturesSpread instruments include: