Skip to main content

Python library for pricing coin-settled crypto options

Project description

Crypto Black-Scholes

Version 0.5.0 — Python library for pricing coin-settled cryptocurrency options with Black-76 and Black-Scholes-style models, Greeks, portfolio aggregation, Deribit-oriented helpers, historical volatility estimators, GEX/vol-regime analytics, and an implied-volatility surface foundation.

See CHANGELOG.md for release notes and breaking changes.

Features

  • Pricing — Black-76 (forward / coin premium), enhanced Black-Scholes with USD vs coin-denominated premium
  • Greeks — Delta (USD vs coin premium), gamma, theta, vega, rho; second-order Greeks (speed, charm, vanna, vomma) via finite differences in GreeksCalculator
  • Portfolio — Multi-position Greeks, risk metrics, gamma exposure profile
  • Data — Deribit REST helpers (timeouts on HTTP calls)
  • IV — Implied vol from market price (Brent’s method), intrinsic and bounds checks
  • Vectorized chain pricingprice_options_vectorized for many strikes / expiries at once
  • Breakeven — USD and coin-settled breakeven helpers
  • Historical volatility — Close-to-close, Parkinson, Rogers-Satchell, Yang-Zhang estimators
  • GEX analytics — Net gamma exposure by strike, cumulative GEX, gamma flip point
  • Volatility regimes — Term-structure and skew regime classifier with simple signal synthesis
  • Volatility surface foundation — Fit/interpolate IV over strike and maturity

Model overview

  1. Black-76 (module-level price_option) — Forward F, undiscounted coin premium; suited to Deribit-style quoting.
  2. BlackScholesModel — Spot-based Merton BS; is_coin_based=True for premium as fraction of spot; exposes delta_usd (hedge delta) and delta_coin (premium sensitivity to spot).
  3. Portfolio — Aggregations use USD delta per position for total_delta and dollar exposures.

Installation

pip install -U crypto-bs

Import as:

import crypto_bs

Requires Python ≥3.10, numpy, scipy, pandas, requests (see pyproject.toml).

Upgrading from 0.1.x

  • Replace result.delta with result.delta_usd (hedging / notional delta) and/or result.delta_coin (academic / premium-in-coin sensitivity).
  • Dicts from price_coin_based_option / validate_deribit_pricing: use delta_usd / delta_coin instead of delta.
  • get_btc_volatility() remains unimplemented in data_fetch; use crypto_bs.historical_vol functions for realized volatility from OHLC data.
  • Optional: add pytest to your environment for the test suite (pip install pytest).

Quick start

from crypto_bs import price_option, delta, gamma, price_options_vectorized
import numpy as np

# Black-76 coin premium
price = price_option(F=110000, K=105000, T=1/365, sigma=0.6, option_type='call')
print(f"Premium (coin): {price:.6f}")

d = delta(110000, 105000, 1/365, 0.6, 'call')
g = gamma(110000, 105000, 1/365, 0.6)

# Whole chain in one call
K = np.array([100000.0, 105000.0, 110000.0])
T = np.full(3, 1 / 365)
sig = np.full(3, 0.6)
types = np.array(["call", "call", "put"])
premiums = price_options_vectorized(110000, K, T, sig, types)

Breakeven

from crypto_bs import breakeven_price, breakeven_price_coin_based

be_usd = breakeven_price(105000, 500, 'call')
be_coin = breakeven_price_coin_based(105000, price, 'call')

Advanced usage

Coin-based BlackScholesModel

from crypto_bs import BlackScholesModel, OptionParameters, OptionType

bs_model = BlackScholesModel()
params = OptionParameters(
    spot_price=110000,
    strike_price=105000,
    time_to_maturity=1/365,
    volatility=0.6,
    option_type=OptionType.CALL,
    is_coin_based=True,
)

result = bs_model.calculate_option_price(params)
print(f"Coin premium: {result.coin_based_price:.6f}")
print(f"USD equivalent: ${result.usd_price:.2f}")
print(f"Delta USD (hedge): {result.delta_usd:.6f}")
print(f"Delta coin premium: {result.delta_coin:.9f}")

Portfolio risk

from crypto_bs import analyze_portfolio_risk

portfolio = [
    {
        "quantity": 10,
        "spot_price": 110000,
        "strike_price": 105000,
        "time_to_maturity": 1/365,
        "volatility": 0.6,
        "option_type": "call",
        "underlying": "BTC",
        "is_coin_based": True,
    }
]

risk = analyze_portfolio_risk(portfolio)
print("Portfolio delta (USD):", risk["portfolio_summary"]["total_delta"])
print("Gamma exposure:", risk["risk_metrics"]["gamma_exposure"])

Deribit helpers

from crypto_bs import get_btc_forward_price, get_option_data, validate_deribit_pricing

F = get_btc_forward_price()
option_data = get_option_data("BTC-3SEP25-105000-C")

validation = validate_deribit_pricing(
    deribit_price_btc=option_data["mark_price"],
    spot=F,
    strike=105000,
    time_to_maturity=1/365,
    option_type="call",
)
print("IV:", validation["implied_volatility"])
print("Delta USD:", validation["delta_usd"])

Requests use a 10-second timeout; failures surface as requests exceptions or ValueError from the API helpers.

Historical volatility

import pandas as pd
from crypto_bs import close_to_close_hv, parkinson_hv, yang_zhang_hv

# Example OHLC arrays as pandas Series
close = pd.Series([100, 102, 101, 104, 103, 106, 108])
high = close * 1.01
low = close * 0.99
open_ = close.shift(1).fillna(close.iloc[0])

hv_cc = close_to_close_hv(close, window=5)
hv_parkinson = parkinson_hv(high, low, window=5)
hv_yz = yang_zhang_hv(open_, high, low, close, window=5)

GEX and volatility analytics

import pandas as pd
from crypto_bs import compute_gex, gex_summary, VolatilityAnalytics

chain = pd.DataFrame({
    "strike": [90000, 100000, 110000, 90000, 100000, 110000],
    "time_to_maturity": [30/365] * 6,
    "volatility": [0.7] * 6,
    "option_type": ["call", "call", "call", "put", "put", "put"],
    "open_interest": [1200, 1800, 900, 1400, 2000, 1300],
})
gex_df = compute_gex(chain, spot=100000)
print(gex_summary(gex_df, spot=100000))

term = pd.Series([0.85, 0.72, 0.65], index=[7/365, 30/365, 90/365])
skew = pd.Series([0.04, 0.035, 0.03], index=[7/365, 30/365, 90/365])
va = VolatilityAnalytics(atm_term_structure=term, skew_by_maturity=skew)
print(va.ts_regime(), va.skew_regime(), va.trading_signal())

Volatility surface

import pandas as pd
from crypto_bs import VolatilitySurface

chain = pd.DataFrame({
    "strike": [90000, 100000, 110000, 90000, 100000, 110000],
    "time_to_maturity": [30/365, 30/365, 30/365, 90/365, 90/365, 90/365],
    "implied_volatility": [0.74, 0.70, 0.73, 0.66, 0.62, 0.65],
})
surface = VolatilitySurface()
surface.fit(chain)
print(surface.get_iv(105000, 60/365))
print(surface.get_term_structure())

API reference (summary)

Symbol Role
price_option, black_76_call, black_76_put Scalar Black-76 coin premium
price_options_vectorized Vectorized chain pricing
delta, gamma, vega, theta, rho Black-76 Greeks on forward F; rho(..., risk_free_rate=0)
breakeven_price, breakeven_price_coin_based Breakeven spot levels
BlackScholesModel, OptionParameters, OptionPricing Full pricing + Greeks; OptionPricing.delta_usd / delta_coin
calculate_implied_volatility IV search; default max vol 20.0; validates vs intrinsic
GreeksCalculator, calculate_option_greeks, analyze_portfolio_risk Profiles and portfolio
get_btc_forward_price, get_option_data, get_available_instruments, get_btc_price Market data
get_btc_volatility Not implemented — raises NotImplementedError
close_to_close_hv, parkinson_hv, rogers_satchell_hv, yang_zhang_hv, vol_premium Historical volatility analytics
compute_gex, find_gamma_flip, gex_summary Gamma exposure analytics
VolatilityAnalytics Term structure/skew regimes and trading signal
VolatilitySurface IV surface fit/interpolation and sanity checks

Full signatures and defaults are in the source docstrings.

Validation (example)

Using real Deribit-style numbers, model vs mark can be on the order of ~1% in BTC premium depending on mark, forward, and IV; use validate_deribit_pricing and live get_option_data for your own checks.

Testing

# From repo root (recommended)
pytest tests/ -v

# With conda
conda activate crypto-option
cd /path/to/crypto_bs_project
PYTHONPATH=. pytest tests/ -v

# Wrapper script
python run_tests.py

The suite includes 36 tests (pricing, Greeks, IV, historical vol, GEX, regime analytics, surface interpolation, and parity/data checks). Install pytest if it is not already in the environment.

License and links


Built for cryptocurrency options workflows that need coin-settled premiums, explicit hedge delta vs coin-premium delta, and portfolio Greeks.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crypto_bs-0.5.0.tar.gz (33.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

crypto_bs-0.5.0-py3-none-any.whl (27.0 kB view details)

Uploaded Python 3

File details

Details for the file crypto_bs-0.5.0.tar.gz.

File metadata

  • Download URL: crypto_bs-0.5.0.tar.gz
  • Upload date:
  • Size: 33.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for crypto_bs-0.5.0.tar.gz
Algorithm Hash digest
SHA256 fba5e6dd5a402ee901be77fa23500bd407f78dfe8b285b6d4e4a26e3ae6482be
MD5 b38562bf093f01ffca445eb50416f859
BLAKE2b-256 8dcb4c7e5f533ca5c27f7786e12c77289438bcbcfc8563181d3d23a127bf9d7c

See more details on using hashes here.

File details

Details for the file crypto_bs-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: crypto_bs-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 27.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for crypto_bs-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6006d11379ea1261e9e2dd99114516377ea53eee4834ec5ef5645424b8d19a1f
MD5 987ddbc838d338d17a2f29d5f1782826
BLAKE2b-256 00eeb7e43562761ef71e8e378c8a02e6cc6303a83536db63609afa6c4f84e540

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page