options — Option Pricing

Analytical and Monte Carlo option pricing with full Greeks.

Option selection by cluster:

Key Functions

blackScholes(S, K, T, r, sigma, optType='call', q=0.0)

European Black-Scholes with cost of carry. Returns {price, delta, gamma, vega, theta, rho}.

binomial(S, K, T, r, sigma, n=100, optType='call', style='european', q=0.0)

Binomial tree for European or American options.

trinomial(S, K, T, r, sigma, n=100, optType='call', style='european', q=0.0)

Trinomial tree — more stable than binomial for barrier options.

asian(S, K, T, r, sigma, nSims=10000, optType='call', avgType='geometric', q=0.0)

Asian option. avgType='geometric' has closed form; 'arithmetic' uses Monte Carlo.

binary(S, K, T, r, sigma, optType='call', q=0.0)

Cash-or-nothing binary option. Core pricing tool for parametric insurance triggers (Cluster Y).

spread(S1, S2, K, T, r, sigma1, sigma2, rho)

Two-asset spread option using Kirk’s approximation. For basis spread options between local and benchmark.

barrier(S, K, H, T, r, sigma, barrierType, rebate=0.0, optType='call', q=0.0)

Barrier option. barrierType: 'up-and-out', 'up-and-in', 'down-and-out', 'down-and-in'. Use for Cluster F (quota barrier: price explodes if quota is cut) or Cluster X (capacity ceiling options).

simulate(S, K, T, r, sigma, nSims=10000, optType='call', q=0.0, seed=None)

Plain Monte Carlo option pricing.

impliedVol(price, S, K, T, r, optType='call', q=0.0)

Implied volatility by bisection. Required for vol surface construction.

buildForwardCurve(spotPrice, rates, tenors, dividendYields=None)

Forward curve from spot price, rates, and dividend/convenience yields.

bootstrapCurve(futuresPrices, tenors, spotPrice, r)

Bootstrap convenience yields from a strip of futures prices.

import sipQuant as sq
import numpy as np

# Black-Scholes cap on hay delivery price
bs = sq.options.blackScholes(
    S=187.50, K=200.0, T=0.50,
    r=0.046, sigma=0.18,
    optType='call', q=0.028,
)
print(f"Cap price: ${bs['price']:.2f}  Delta: {bs['delta']:.4f}")

# Binary option for drought-triggered delivery (Cluster Y)
binary_opt = sq.options.binary(
    S=187.50, K=220.0, T=0.25,
    r=0.046, sigma=0.18,
    optType='call',
)
print(f"Binary price (trigger probability): {binary_opt['price']:.4f}")

# Down-and-out barrier for quota protection (Cluster F)
barrier_opt = sq.options.barrier(
    S=95.0, K=90.0, H=70.0,
    T=0.50, r=0.046, sigma=0.30,
    barrierType='down-and-out',
    optType='call',
)
print(f"Barrier option price: ${barrier_opt['price']:.4f}")

# Spread option for basis arb (Cluster A)
spread_opt = sq.options.spread(
    S1=187.50,  # Alberta hay
    S2=182.00,  # Saskatchewan hay
    K=0.0,      # zero-strike spread option
    T=0.25, r=0.046,
    sigma1=0.18, sigma2=0.20,
    rho=0.75,   # high correlation between regions
)
print(f"Spread option price: ${spread_opt['price']:.4f}")