Back to Nautilus Trader

Betting Instrument

docs/concepts/instruments/betting_instrument.md

1.230.012.7 KB
Original Source

Betting Instrument

BettingInstrument represents one selection in a sports or gaming market. It carries event, competition, market, and selection metadata so Nautilus can treat the selection as an instrument with prices, sizes, limits, margins, and fees.

Examples include Betfair match-odds selections and handicap market selections.

Fields

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

FieldTypeRequired/defaultNotes
instrument_idInstrumentIdRequiredStored as id in Rust.
raw_symbolSymbolRequiredNative or generated venue symbol.
event_type_idu64RequiredEvent type identifier.
event_type_nameUstrRequiredEvent type name, such as a sport.
competition_idu64RequiredCompetition identifier.
competition_nameUstrRequiredCompetition name.
event_idu64RequiredEvent identifier.
event_nameUstrRequiredEvent name.
event_country_codeUstrRequiredEvent country code.
event_open_dateUnixNanosRequiredEvent open time.
betting_typeUstrRequiredBetting type published by the venue.
market_idUstrRequiredMarket identifier.
market_nameUstrRequiredMarket name.
market_typeUstrRequiredMarket type, such as match odds.
market_start_timeUnixNanosRequiredMarket start time.
selection_idu64RequiredSelection or runner identifier.
selection_nameUstrRequiredSelection or runner name.
selection_handicapf64RequiredHandicap value for handicap markets.
currencyCurrencyRequiredQuote and settlement currency.
price_precisionu8RequiredDecimal places allowed for prices.
size_precisionu8RequiredDecimal places allowed for order sizes.
price_incrementPriceRequiredPrice step, often set by a tick scheme.
size_incrementQuantityRequiredMinimum size step.
max_quantityOption<Quantity>NoneMaximum order quantity.
min_quantityOption<Quantity>NoneMinimum order quantity.
max_notionalOption<Money>NoneMaximum order notional value.
min_notionalOption<Money>NoneMinimum order notional value.
max_priceOption<Price>NoneMaximum valid quote or order price.
min_priceOption<Price>NoneMinimum valid quote or order price.
margin_initOption<Decimal>1Initial margin rate.
margin_maintOption<Decimal>1Maintenance margin rate.
maker_feeOption<Decimal>0Maker fee rate. Negative values rebate.
taker_feeOption<Decimal>0Taker fee rate. Negative values rebate.
tick_schemeOption<Ustr>NoneRegistered variable tick scheme name.
infoOption<Params>NoneAdapter metadata.
ts_eventUnixNanosRequiredEvent timestamp in nanoseconds.
ts_initUnixNanosRequiredInitialization timestamp in nanoseconds.
</Tab> <Tab value="Python">
FieldTypeRequired/defaultNotes
instrument_idInstrumentIdRequired
raw_symbolSymbolRequiredNative or generated venue symbol.
event_type_idintRequiredEvent type identifier.
event_type_namestrRequiredEvent type name, such as a sport.
competition_idintRequiredCompetition identifier.
competition_namestrRequiredCompetition name.
event_idintRequiredEvent identifier.
event_namestrRequiredEvent name.
event_country_codestrRequiredEvent country code.
event_open_dateintRequiredEvent open time.
betting_typestrRequiredBetting type published by the venue.
market_idstrRequiredMarket identifier.
market_namestrRequiredMarket name.
market_typestrRequiredMarket type, such as match odds.
market_start_timeintRequiredMarket start time.
selection_idintRequiredSelection or runner identifier.
selection_namestrRequiredSelection or runner name.
selection_handicapfloatRequiredHandicap value for handicap markets.
currencyCurrencyRequiredQuote and settlement currency.
price_precisionintRequiredDecimal places allowed for prices.
size_precisionintRequiredDecimal places allowed for order sizes.
price_incrementPriceRequiredPrice step, often set by a tick scheme.
size_incrementQuantityRequiredMinimum size step.
max_quantityQuantity | NoneNoneMaximum order quantity.
min_quantityQuantity | NoneNoneMinimum order quantity.
max_notionalMoney | NoneNoneMaximum order notional value.
min_notionalMoney | NoneNoneMinimum order notional value.
max_pricePrice | NoneNoneMaximum valid quote or order price.
min_pricePrice | NoneNoneMinimum valid quote or order price.
margin_initDecimal | None1Initial margin rate.
margin_maintDecimal | None1Maintenance margin rate.
maker_feeDecimal | None0Maker fee rate. Negative values rebate.
taker_feeDecimal | None0Taker fee rate. Negative values rebate.
tick_schemestr | NoneNoneRegistered variable tick scheme name.
infodict | NoneNoneAdapter metadata.
ts_eventintRequiredEvent timestamp in nanoseconds.
ts_initintRequiredInitialization timestamp in nanoseconds.
</Tab> </Tabs>

Note: Python builds the instrument ID and raw symbol from the venue, market, selection, and handicap fields. Rust receives them as instrument_id and raw_symbol.

Behavior

  • BettingInstrument has asset class Alternative and instrument class SportsBetting.
  • Each selection or runner is modeled as its own instrument.
  • Betting instruments commonly use a registered tick scheme for valid odds steps.
  • Margin defaults to one because staking a bet typically reserves the full stake.

Example

rust
use chrono::{TimeZone, Utc};
use nautilus_core::UnixNanos;
use nautilus_model::{
    identifiers::{InstrumentId, Symbol},
    instruments::BettingInstrument,
    types::{Currency, Money, Price, Quantity},
};
use rust_decimal_macros::dec;
use ustr::Ustr;

let event_open = Utc.with_ymd_and_hms(2022, 2, 7, 23, 30, 0).unwrap();
let market_start = Utc.with_ymd_and_hms(2022, 2, 7, 23, 30, 0).unwrap();

let selection = BettingInstrument::builder()
    .instrument_id(InstrumentId::from("1-123456789.BETFAIR"))
    .raw_symbol(Symbol::from("1-123456789"))
    .event_type_id(6423)
    .event_type_name(Ustr::from("American Football"))
    .competition_id(12_282_733)
    .competition_name(Ustr::from("NFL"))
    .event_id(29_678_534)
    .event_name(Ustr::from("NFL"))
    .event_country_code(Ustr::from("GB"))
    .event_open_date(UnixNanos::from(event_open.timestamp_nanos_opt().unwrap() as u64))
    .betting_type(Ustr::from("ODDS"))
    .market_id(Ustr::from("1-123456789"))
    .market_name(Ustr::from("AFC Conference Winner"))
    .market_type(Ustr::from("SPECIAL"))
    .market_start_time(UnixNanos::from(market_start.timestamp_nanos_opt().unwrap() as u64))
    .selection_id(50214)
    .selection_name(Ustr::from("Kansas City Chiefs"))
    .selection_handicap(0.0)
    .currency(Currency::from("GBP"))
    .price_precision(2)
    .size_precision(2)
    .price_increment(Price::from("0.01"))
    .size_increment(Quantity::from("0.01"))
    .max_quantity(Quantity::from("1000"))
    .min_quantity(Quantity::from("1"))
    .max_notional(Money::from("10000 GBP"))
    .min_notional(Money::from("10 GBP"))
    .max_price(Price::from("100.00"))
    .min_price(Price::from("1.00"))
    .margin_init(dec!(1))
    .margin_maint(dec!(1))
    .maker_fee(dec!(0))
    .taker_fee(dec!(0))
    .ts_event(UnixNanos::default())
    .ts_init(UnixNanos::default())
    .build()
    .unwrap();
python
import pandas as pd

from nautilus_trader.model import BettingInstrument
from nautilus_trader.model import Currency
from nautilus_trader.model import InstrumentId
from nautilus_trader.model import Money
from nautilus_trader.model import Price
from nautilus_trader.model import Quantity
from nautilus_trader.model import Symbol
from nautilus_trader.model import Venue

GBP = Currency.from_str("GBP")

selection = BettingInstrument(
    instrument_id=InstrumentId(Symbol("1-123456789-50214"), Venue("BETFAIR")),
    raw_symbol=Symbol("1-123456789-50214"),
    event_type_id=6423,
    event_type_name="American Football",
    competition_id=12282733,
    competition_name="NFL",
    event_id=29678534,
    event_name="NFL",
    event_country_code="GB",
    event_open_date=pd.Timestamp("2022-02-07 23:30:00+00:00").value,
    betting_type="ODDS",
    market_id="1-123456789",
    market_name="AFC Conference Winner",
    market_type="SPECIAL",
    market_start_time=pd.Timestamp("2022-02-07 23:30:00+00:00").value,
    selection_id=50214,
    selection_name="Kansas City Chiefs",
    selection_handicap=0.0,
    currency=GBP,
    price_precision=2,
    size_precision=2,
    price_increment=Price.from_str("0.01"),
    size_increment=Quantity.from_str("0.01"),
    min_notional=Money(1, GBP),
    ts_event=0,
    ts_init=0,
)

Adapters

Representative adapters that create or consume BettingInstrument instruments include:

  • Accounting covers betting account behavior.
  • Data explains market data that references instruments.