Project

option_lab

0.0
The project is in a healthy, maintained state
A lightweight Ruby library designed to provide quick evaluation of option strategies.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 13.0
~> 3.12
~> 1.50

Runtime

~> 0.8.0
~> 0.1.7
~> 0.9.2
~> 0.0.5
 Project Readme

OptionLab

OptionLab is a lightweight Ruby library designed to provide quick evaluation of options trading strategies. It aims to be a direct port of the popular Python library - OptionLab

docs page coming soon Documentation

Features

  • Calculate profit/loss profiles for options strategies
  • Estimate probability of profit using Black-Scholes or custom models
  • Calculate option Greeks (Delta, Gamma, Theta, Vega, Rho)
  • Generate profit/loss diagrams
  • Support for complex multi-leg strategies
  • Handle stock positions and previously closed trades
  • Support for different dividend yield and interest rate scenarios
  • Business day calculations across different countries

Installation

Add this line to your application's Gemfile:

gem 'option_lab'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install option_lab

Requirements

OptionLab requires:

  • Ruby 3.3.0 or higher
  • numo-narray gem for numerical computations
  • distribution gem for statistical calculations

Basic Usage

The evaluation of a strategy is done by calling the run_strategy method provided by the library. This method receives the input data as a Ruby hash or an Inputs object.

Here's an example of evaluating a naked call strategy:

require 'option_lab'

# Define the strategy
input_data = {
  stock_price: 164.04,
  start_date: Date.new(2023, 11, 22),
  target_date: Date.new(2023, 12, 17),
  volatility: 0.272,
  interest_rate: 0.0002,
  min_stock: 120,
  max_stock: 200,
  strategy: [
    {
      type: "call",
      strike: 175.0,
      premium: 1.15,
      n: 100,
      action: "sell"
    }
  ]
}

# Run the strategy calculation
outputs = OptionLab.run_strategy(input_data)

# Export P/L data to CSV
OptionLab.pl_to_csv(outputs, filename: "covered_call_pl.csv")

Analyzing Results

The Outputs object returned by run_strategy contains a wealth of information:

# Key probability metrics
probability_of_profit = outputs.probability_of_profit
profit_ranges = outputs.profit_ranges
expected_profit = outputs.expected_profit
expected_loss = outputs.expected_loss

# Strategy costs
strategy_cost = outputs.strategy_cost
per_leg_cost = outputs.per_leg_cost

# Returns
min_return = outputs.minimum_return_in_the_domain
max_return = outputs.maximum_return_in_the_domain

# Option Greeks
delta = outputs.delta
gamma = outputs.gamma
theta = outputs.theta
vega = outputs.vega
rho = outputs.rho

# Print all metrics
puts outputs

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

The gem is available as open source under the terms of the MIT License.

Plot the profit/loss diagram

OptionLab.plot_pl(outputs)


## Common Strategies

OptionLab supports all standard options strategies, including:

- Covered calls
- Naked puts
- Bull/bear spreads
- Straddles/strangles
- Iron condors
- Butterflies
- Calendar spreads
- And more...

## Advanced Usage

The library also allows for more advanced use cases, such as:

```ruby
# Create a custom distribution model
bs_inputs = OptionLab::Models::BlackScholesModelInputs.new(
  stock_price: 168.99,
  volatility: 0.483,
  interest_rate: 0.045,
  years_to_target_date: 24.0 / 365
)

# Generate price array with 10,000 samples
prices = OptionLab.create_price_array(bs_inputs, n: 10_000, seed: 42)

# Run a strategy with the custom price array
input_data = {
  stock_price: 168.99,
  volatility: 0.483,
  interest_rate: 0.045,
  min_stock: 120,
  max_stock: 200,
  model: "array",
  array: prices,
  strategy: [
    { type: "stock", n: 100, action: "buy" },
    {
      type: "call",
      strike: 185.0,
      premium: 4.1,
      n: 100,
      action: "sell"
    }
  ]
}

outputs = OptionLab.run_strategy(input_data)