NautilusTrader
ConceptsInstruments

Futures Spread

FuturesSpread represents an exchange-defined futures strategy with more than one leg, such as a calendar spread or inter-commodity spread. The venue defines the strategy, symbol, tick size, and expiry.

Examples include listed futures calendar spreads and exchange-supported spread markets.

Fields

<Tabs items={["Rust", "Python"]}>

FieldTypeRequired/defaultNotes
instrument_idInstrumentIdRequiredStored as id in Rust.
raw_symbolSymbolRequiredNative venue symbol.
asset_classAssetClassRequiredAsset class of the underlying strategy.
exchangeOption<Ustr>NoneExchange MIC or venue code when known.
underlyingUstrRequiredUnderlying product or product family.
strategy_typeUstrRequiredVenue strategy type, such as calendar.
activation_nsUnixNanosRequiredStrategy activation timestamp.
expiration_nsUnixNanosRequiredStrategy expiration timestamp.
currencyCurrencyRequiredQuote and settlement currency.
price_precisionu8RequiredDecimal places allowed for prices.
price_incrementPriceRequiredSmallest valid price step.
size_precisionu80Futures spreads trade in whole contracts.
size_incrementQuantity1Minimum contract size step.
multiplierQuantityRequiredStrategy multiplier.
lot_sizeQuantityRequiredRounded lot or contract lot size.
margin_initOption<Decimal>0Initial margin rate.
margin_maintOption<Decimal>0Maintenance margin rate.
maker_feeOption<Decimal>0Maker fee rate. Negative values rebate.
taker_feeOption<Decimal>0Taker fee rate. Negative values rebate.
max_quantityOption<Quantity>NoneMaximum order quantity.
min_quantityOption<Quantity>1Minimum order quantity.
max_priceOption<Price>NoneMaximum valid quote or order price.
min_priceOption<Price>NoneMinimum valid quote or order price.
tick_schemeOption<Ustr>NoneRegistered variable tick scheme name.
infoOption<Params>NoneAdapter metadata.
ts_eventUnixNanosRequiredEvent timestamp in nanoseconds.
ts_initUnixNanosRequiredInitialization timestamp in nanoseconds.
FieldTypeRequired/defaultNotes
instrument_idInstrumentIdRequired
raw_symbolSymbolRequiredNative venue symbol.
asset_classAssetClassRequiredAsset class of the underlying strategy.
exchangestr | NoneNoneExchange MIC or venue code when known.
underlyingstrRequiredUnderlying product or product family.
strategy_typestrRequiredVenue strategy type, such as calendar.
activation_nsintRequiredStrategy activation timestamp.
expiration_nsintRequiredStrategy expiration timestamp.
currencyCurrencyRequiredQuote and settlement currency.
price_precisionintRequiredDecimal places allowed for prices.
price_incrementPriceRequiredSmallest valid price step.
size_precisionint0Futures spreads trade in whole contracts.
size_incrementQuantity1Minimum contract size step.
multiplierQuantityRequiredStrategy multiplier.
lot_sizeQuantityRequiredRounded lot or contract lot size.
margin_initDecimal | None0Initial margin rate.
margin_maintDecimal | None0Maintenance margin rate.
maker_feeDecimal | None0Maker fee rate. Negative values rebate.
taker_feeDecimal | None0Taker fee rate. Negative values rebate.
max_quantityQuantity | NoneNoneMaximum order quantity.
min_quantityQuantity | None1Minimum order quantity.
max_pricePrice | NoneNoneMaximum valid quote or order price.
min_pricePrice | NoneNoneMinimum valid quote or order price.
tick_schemestr | NoneNoneRegistered variable tick scheme name.
infodict | NoneNoneAdapter metadata.
ts_eventintRequiredEvent timestamp in nanoseconds.
ts_initintRequiredInitialization timestamp in nanoseconds.

Note: Python constructors use instrument_id; Rust stores the same value as id.

Behavior

  • FuturesSpread has instrument class FuturesSpread.
  • The venue publishes the spread as a single tradable instrument.
  • It trades in whole contracts with size precision 0 and size increment 1.
  • Use leg data from the adapter metadata when a strategy needs venue-specific leg details.

Example

use chrono::{TimeZone, Utc};
use nautilus_core::UnixNanos;
use nautilus_model::{
    enums::AssetClass,
    identifiers::{InstrumentId, Symbol},
    instruments::FuturesSpread,
    types::{Currency, Price, Quantity},
};
use ustr::Ustr;

let activation = Utc.with_ymd_and_hms(2022, 6, 21, 13, 30, 0).unwrap();
let expiration = Utc.with_ymd_and_hms(2024, 6, 21, 13, 30, 0).unwrap();

let es_spread = FuturesSpread::builder()
    .instrument_id(InstrumentId::from("ESM4-ESU4.GLBX"))
    .raw_symbol(Symbol::from("ESM4-ESU4"))
    .asset_class(AssetClass::Index)
    .exchange(Ustr::from("XCME"))
    .underlying(Ustr::from("ES"))
    .strategy_type(Ustr::from("EQ"))
    .activation_ns(UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64))
    .expiration_ns(UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64))
    .currency(Currency::from("USD"))
    .price_precision(2)
    .price_increment(Price::from("0.01"))
    .multiplier(Quantity::from("1"))
    .lot_size(Quantity::from("1"))
    .ts_event(UnixNanos::default())
    .ts_init(UnixNanos::default())
    .build()
    .unwrap();

Adapters

Representative adapters that create or consume FuturesSpread instruments include:

On this page