OptionStratLib

repository·main·Indexed 42 days ago

https://github.com/joaquinbejar/optionstratlib

A comprehensive Rust library for options trading and strategy development. Version 0.21.1 provides tools for pricing (Black-Scholes, Binomial, Monte Carlo), Greeks calculation, and volatility modeling. It supports 25+ strategies including Spreads, Butterflies, and Iron Condors, and includes a backtesting engine and visualization capabilities via plotly.rs for payoff diagrams and 3D volatility surfaces.

Tokens
23.9K
Snippets
55
Records
72
Agent score
51%

What's inside OptionStratLib

  1. Overview of OptionStratLib features

    main

    OptionStratLib is a comprehensive Rust library for options trading and strategy development. It provides a modular, type-safe toolkit for modeling, analyzing, and visualizing options strategies across multiple asset classes.

    Key capabilities include:

    • Pricing Models: Black-Scholes, Binomial Trees, Monte Carlo, Telegraph Process, and support for 14 exotic option types.
    • Greeks: Full suite including Delta, Gamma, Theta, Vega, Rho, Vanna, Vomma, Veta, Charm, and Color.
    • Volatility: Implied volatility (Newton-Raphson), surface construction, and historical estimation.
    • Strategy Support: 25+ strategies including Spreads, Butterflies, Iron Condors, Volatility plays, and Income strategies (e.g., Covered Calls).
    • Risk Management: Break-even analysis, P&L calculations, and delta neutrality analysis.
    • Simulation & Backtesting: Monte Carlo simulations and a comprehensive backtesting engine.
    • Visualization: Payoff diagrams, Greeks, and 3D volatility surfaces (via plotly.rs).
  2. How OptionStratLib handles numeric precision and errors

    main

    OptionStratLib uses a strict, type-safe approach to financial arithmetic to prevent silent errors like overflows or non-finite values.

    Decimal Arithmetic

    All monetary-path calculations use rust_decimal. To prevent silent wraparound, the library routes through specific kernels in model::decimal:

    • d_add, d_sub, d_mul, d_div, d_sum, d_sum_iter.
    • Arithmetic errors surface as DecimalError::Overflow { operation, lhs, rhs }.

    Non-Finite Guards

    To prevent f64 issues (like NaN or Inf) from corrupting calculations, boundaries between f64 and Decimal are wrapped with finite_decimal(..). This surfaces domain-specific errors instead of defaulting to zero:

    • PricingError::NonFinite { context, value }
    • GreeksError::NonFinite
    • VolatilityError::NonFinite
    • SimulationError::NonFinite

    Type-Safe Constraints

    • Positive: Monetary values, strikes, and volatilities use a Positive newtype. Inverted strikes or out-of-range values return a StrategyError rather than panicking.
    • NonZeroUsize: Simulation steps (e.g., in monte_carlo_option_pricing) require std::num::NonZeroUsize. Use the nz!(N) macro for literal call sites.
  3. Calculate option prices using various models

    main

    The library supports multiple pricing models depending on the option type and style:

    • black_scholes: Used for European options.
    • black_76: Used for forward-priced options.
    • garman_kohlhagen: Used for FX / Currency options.
    • barone_adesi_whaley: Used for American options.
    • binomial_model: Used for American and Bermuda options.
    • monte_carlo: Used for path-dependent options (e.g., Asian, Lookback, Barrier).

    Standard options are categorized into European, American, and Bermuda. Path-dependent options include Asian, Lookback, and Barrier. Multi-asset options include Rainbow and Spread. Special payoffs include Binary, Power, Quanto, and Compound.

    flowchart TB
        subgraph Standard["Standard Options"]
            EU[European]
            AM[American]
            BE[Bermuda]
        end
    
    subgraph PathDependent["Path-Dependent"]
            AS[Asian]
            LB[Lookback]
            BA[Barrier]
            CL[Cliquet]
        end
    
    subgraph MultiAsset["Multi-Asset"]
            RB[Rainbow]
            SP[Spread]
            EX[Exchange]
        end
    
    subgraph Special["Special Payoffs"]
            BI[Binary]
            PW[Power]
            QU[Quanto]
            CO[Compound]
            CH[Chooser]
        end
    
    subgraph Forward["Forward-Priced"]
            FUT[Future]
            FWD[Forward]
        end
    
    subgraph FX["FX / Currency"]
            FX_S[FX Spot]
        end
    BS[black_scholes] --> EU
        BS --> PathDependent
        BS --> MultiAsset
        BS --> Special
        B76[black_76] --> Forward
        GK[garman_kohlhagen] --> FX
        BAW[barone_adesi_whaley] --> AM
        BIN[binomial_model] --> AM
        BIN --> BE
        MC[monte_carlo] --> PathDependent
  4. Understand the core modules of OptionStratLib

    main

    The library is organized into several functional modules:

    model/ (Core Data Structures)

    Handles the fundamental types for trading:

    • option.rs: Option structures with pricing and Greeks.
    • position.rs: Position management and P&L tracking.
    • leg/: Multi-instrument support including SpotPosition, PerpetualPosition (crypto), and FuturePosition.
    • positive.rs: Type-safe Positive numbers for strikes and volatilities.

    pricing/ (Pricing Engines)

    • Standard Models: black_scholes_model.rs, binomial_model.rs, monte_carlo.rs.
    • Specialized Models: black_76.rs (futures), garman_kohlhagen.rs (FX), telegraph.rs (jump-diffusion).
    • Exotic Options: Dedicated modules for Asian, Barrier, Binary, Lookback, Compound, Chooser, Cliquet, Rainbow, Spread, Quanto, Exchange, and Power options.

    strategies/ (Trading Implementations)

    Provides ready-to-use strategy implementations and analysis tools:

    • Implementations: Single legs, Spreads (Bull/Bear), Butterflies, Iron Condors/Butterflies, Straddles/Strangles, and Protection (Collars/Protective Puts).
    • Analysis: probabilities/ for outcome analysis and delta_neutral/ for adjustment tools.

    volatility/ (Volatility Modeling)

    • utils.rs: Implied volatility via Newton-Raphson.
    • traits.rs: Interfaces for volatility models and surface construction.
  5. Analyze trading strategies using the Strategable trait system

    main

    The library uses a highly modular trait system to provide consistent capabilities across different types of trading strategies. If you are building custom strategies, implementing these traits allows them to integrate with the library's analysis and visualization tools.

    Key traits include:

    • Strategable: The master trait that combines all other capabilities.
    • BasicAble: Provides access to underlying price, symbol, expiration, and title.
    • Positionable: Allows managing positions via get_positions(), add_position(), and modify_position().
    • Strategies: Provides financial totals like get_net_premium_received(), get_max_profit(), get_max_loss(), and get_total_cost().
    • BreakEvenable: Enables calculation of break-even points via get_break_even_points().
    • Profit: Provides P&L calculation at specific price points via get_point_at_price() and calculate_profit_at().
    • Greeks: Provides risk sensitivities like delta(), gamma(), theta(), and vega().
    • DeltaNeutrality: Provides get_delta() and suggest_delta_adjustments() for hedging.
    • Graph: Enables visualization via to_plot() and file exports like write_html(), write_png(), etc.
    classDiagram
        class Strategable {
            <<trait>>
            Master trait combining all capabilities
        }
    
    class BasicAble {
            <<trait>>
            +get_underlying_price()
            +get_underlying_symbol()
            +get_expiration()
            +get_title()
        }
    
    class Positionable {
            <<trait>>
            +get_positions()
            +add_position()
            +modify_position()
        }
    
    class Strategies {
            <<trait>>
            +get_net_premium_received()
            +get_max_profit()
            +get_max_loss()
            +get_total_cost()
        }
    
    class BreakEvenable {
            <<trait>>
            +get_break_even_points()
            +calculate_break_even()
        }
    
    class Profit {
            <<trait>>
            +get_point_at_price()
            +calculate_profit_at()
        }
    
    class Greeks {
            <<trait>>
            +delta()
            +gamma()
            +theta()
            +vega()
        }
    
    class DeltaNeutrality {
            <<trait>>
            +get_delta()
            +suggest_delta_adjustments()
        }
    
    class Graph {
            <<trait>>
            +to_plot()
            +write_html()
            +write_png()
        }
    
    Strategable --|> BasicAble
    Strategable --|> Positionable
    Strategable --|> Strategies
    Strategable --|> BreakEvenable
    Strategable --|> Profit
    Strategable --|> Greeks
    Strategable --|> DeltaNeutrality
    Strategable --|> Graph
  6. Core Data Structures: Options, Positions, and Legs

    main

    OptionStratLib uses a hierarchical model to represent financial instruments and holdings:

    • Options: The fundamental unit representing an option contract. It includes properties like option_type (e.g., European, American), side (Long/Short), strike_price, expiration_date, implied_volatility, and underlying_price. It implements Greeks and Graph traits.
    • Position: Represents a holding that contains an Options object. It tracks position_cost, entry_date, and fees to calculate net_cost(), unrealized_pnl(), and pnl_at_expiration().
    • Leg: An enumeration used to compose complex strategies. A Leg can be an Option(Position), a Spot(SpotPosition), a Future(FuturePosition), or a Perpetual(PerpetualPosition). This allows for strategies like Covered Calls that combine spot and option legs.
    • SpotPosition: Represents a non-derivative holding (like a stock). It tracks symbol, quantity, cost_basis, and side, providing methods like market_value() and break_even_price().
    classDiagram
    class Options {
    +option_type: OptionType
    +side: Side
    +underlying_symbol: String
    +strike_price: Positive
    +expiration_date: ExpirationDate
    +implied_volatility: Positive
    +quantity: Positive
    +underlying_price: Positive
    +risk_free_rate: Decimal
    +option_style: OptionStyle
    +dividend_yield: Positive
    +exotic_params: Option~ExoticParams~
    +calculate_price_black_scholes()
    +calculate_price_binomial()
    +time_to_expiration()
    +is_long()
    +is_short()
    +validate()
    +to_plot()
    +calculate_implied_volatility()
    +delta()
    +gamma()
    +theta()
    +vega()
    +rho()
    +vanna()
    +vomma()
    +veta()
    +charm()
    +color()
    }
    
    class Position {
    +option: Options
    +position_cost: Positive
    +entry_date: DateTime<Utc>
    +open_fee: Positive
    +close_fee: Positive
    +net_cost()
    +net_premium_received()
    +unrealized_pnl()
    +pnl_at_expiration()
    +validate()
    }
    
    class Leg {
    <<enumeration>>
    Option(Position)
    Spot(SpotPosition)
    Future(FuturePosition)
    Perpetual(PerpetualPosition)
    +is_option()
    +is_spot()
    +is_linear()
    +delta()
    +pnl_at_price()
    }
    
    class SpotPosition {
    +symbol: String
    +quantity: Positive
    +cost_basis: Positive
    +side: Side
    +date: DateTime<Utc>
    +open_fee: Positive
    +close_fee: Positive
    +pnl_at_price()
    +delta()
    +market_value()
    +break_even_price()
    }
    
    class ExpirationDate {
    +Days(Positive)
    +Date(NaiveDate)
    +get_years()
    +get_date()
    +get_date_string()
    +from_string()
    }
    
    class Positive {
    +value: Decimal
    +ZERO: Positive
    +ONE: Positive
    +format_fixed_places()
    +round_to_nice_number()
    +is_positive()
    }
    
    class OptionStyle {
    <<enumeration>>
    Call
    Put
    }
    
    class OptionType {
    <<enumeration>>
    European
    American
    Bermuda
    Asian
    Barrier
    Binary
    Lookback
    Compound
    Chooser
    Cliquet
    Rainbow
    Spread
    Quanto
    Exchange
    Power
    }
    
    class Side {
    <<enumeration>>
    Long
    Short
    }
    
    Options --|> Greeks : implements
    Options --|> Graph : implements
    Position o-- Options : contains
    Leg o-- Position : Option variant
    Leg o-- SpotVariant : Spot variant
    SpotPosition *-- Side : has
    SpotPosition *-- Positive : uses
    Options *-- OptionStyle : has
    Options *-- OptionType : has
    Options *-- Side : has
    Options *-- ExpirationDate : has
    Options *-- Positive : uses
  7. Configure simulation granularity in demo binaries

    main

    Simulation-heavy demos (such as *_strategy_simulation, position_simulator, strategy_simulator, and random_walk_chain) are configured with a demo-friendly hourly grid to ensure cargo run completes quickly in debug mode.

    To achieve a finer sample or higher precision, you must manually increase the n_steps or n_simulations parameters within the specific binary source code.

  8. Enable observability for public functions

    main

    OptionStratLib uses the tracing crate to provide observability for its public hot paths. To see structured spans and logs, the consumer application must install a subscriber (e.g., tracing_subscriber).

    Instrumented public functions include:

    • pricing::black_scholes(strike, style, side)
    • pricing::monte_carlo_option_pricing(steps, simulations, strike, style, side)
    • pricing::price_binomial(strike, asset, steps, style, side)
    • volatility::implied_volatility(market_price, strike, max_iterations)
    • Optimizable::get_best_ratio/area(side, criteria)
  9. Set up the development environment for OptionStratLib

    main

    To set up a local development environment for contributing to OptionStratLib, clone the repository and build/test the project using cargo with all features enabled.

    Note: The project uses the Rust 2024 edition.

    git clone https://github.com/joaquinbejar/OptionStratLib.git
    cd OptionStratLib
    cargo build --all-features
    cargo test --all-features
  10. Run tests and benchmarks

    main

    Running Tests

    • All tests: cargo test --all-features
    • Specific modules:
      • cargo test strategies::bull_call_spread
      • cargo test pricing::black_scholes
      • cargo test volatility::utils
    • With output: cargo test -- --nocapture

    Benchmarking

    Run performance benchmarks using:

    cargo bench

    Coverage

    Generate a test coverage report using tarpaulin:

    cargo tarpaulin --all-features --out Html
  11. Install OptionStratLib

    main

    Prerequisites

    • Rust 1.85 or higher (Rust 2024 edition)
    • Cargo package manager

    Installation via Cargo.toml

    Add the following to your Cargo.toml dependencies:

    [dependencies]
    optionstratlib = "0.21.1"

    Alternatively, use the cargo CLI:

    cargo add optionstratlib

    Optional Features

    Enable enhanced functionality by specifying features in your Cargo.toml:

    [dependencies]
    optionstratlib = { version = "0.21.1", features = ["plotly"] }
    • plotly: Enables interactive visualization using plotly.rs.
    • static_export: Enables PNG / SVG export via plotly_static (requires an async runtime).
    • async: Enables asynchronous I/O operations for OptionChain and OHLCV data (uses tokio, reqwest, and futures).
  12. Code quality requirements for OptionStratLib

    main

    When contributing to the library, ensure the following standards are met:

    • All code must pass cargo clippy without warnings.
    • Code must be formatted using cargo fmt.
    • New functionality must include corresponding tests.
    • API changes must be accompanied by updated documentation.