qloxide 0.2.0

Financial instrument modeling, trade management, and pricing
Documentation

qloxide

A Rust library for financial instrument modeling, trade management, and pricing. Targeting energy, refined products, and commodities — but designed generally.

Status: early development / incomplete. The core type system is in place but pricing, risk, and trade management layers are not yet implemented. The API will change.

What's here

Layers 0–5 of a planned 8-layer architecture:

Layer Contents Status
0 — Foundation Error, Date, Timestamp, Zoned (jiff newtypes) Done
1 — Date Logic Calendar, DateRule, DayCount (5 conventions), Compounding (6 conventions) Done
2 — Reference Data Currency, CreditEntity, RateIndex Done
3 — Cash Flows CashFlow, CashFlowSchedule, Frequency Done
4 — Curves DiscountCurve (parameterized by DayCount, linear interpolation) Done
5 — Instruments FinancialInstrument trait with 7 types: Equity, Future, EuropeanOption, Bond, Swap, FxForward, Basket Done
6 — Forward Curves Commodity forward term structure Not started
7 — Pricing & Risk Valuation, Greeks, scenarios Not started

Design choices

  • Trait-based instruments with typetag — add new instrument types without touching existing code. Arc<dyn FinancialInstrument> serializes to/from JSON automatically.
  • Currency is reference data, not an instrument — cleaner separation for trade management.
  • Cash flows are first-class — every instrument ultimately produces cash flows.
  • Three time typesDate (calendar), Timestamp (UTC instant), Zoned (datetime + timezone) — because energy settlement needs all three.
  • Parameterized day counts — curves aren't hardcoded to Act/365.

Example

use std::sync::Arc;
use qloxide::dates::Date;
use qloxide::dates::daycount::DayCount;
use qloxide::dates::rules::DateRule;
use qloxide::instruments::*;
use qloxide::reference_data::Currency;

let usd = Arc::new(Currency::new("USD", DateRule::Null, DayCount::Act360));

let future = Future::new(
    "ICE-BRN-Jun25", "Brent", usd,
    Settlement::new("ICE", "SETTLE", "19:30", "Europe/London", DateRule::Null),
    Date::new(2025, 6, 14), 1000.0, 0.01,
);

// Serialize to JSON
let json = serde_json::to_string_pretty(
    &(Arc::new(future) as Arc<dyn FinancialInstrument>)
).unwrap();

// Deserialize back
let inst: Arc<dyn FinancialInstrument> = serde_json::from_str(&json).unwrap();
assert_eq!(inst.id(), "ICE-BRN-Jun25");

License

MIT