From option-strategies
Generate an interactive options payoff curve chart with dynamic parameter controls. Use this skill whenever the user shares an options position screenshot, describes an options strategy, or asks to visualize how an options trade makes or loses money. Triggers include: any mention of butterfly, spread (vertical/calendar/diagonal/ratio), straddle, strangle, condor, covered call, protective put, iron condor, jade lizard, broken wing, or any multi-leg options structure. Also triggers when a user pastes strike prices, premiums, expiry dates, or says things like "show me the payoff", "draw the P&L curve", "what does this trade look like", or uploads a screenshot from a broker (IBKR, TastyTrade, Robinhood, ToS, Schwab). Always use this skill even if the user only provides partial info — extract what you can and use defaults for the rest.
How this skill is triggered — by the user, by Claude, or both
Slash command
/option-strategies:options-payoffThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generates a fully interactive HTML widget (via `visualize:show_widget`) showing:
Generates a fully interactive HTML widget (via visualize:show_widget) showing:
When the user provides a screenshot or text, extract:
| Field | Where to find it | Default if missing |
|---|---|---|
| Strategy type | Title bar / leg description | "custom" |
| Underlying | Ticker symbol | SPX |
| Strike(s) | K1, K2, K3... in title or leg table | nearest round number |
| Premium paid/received | Filled price or avg price | 5.00 |
| Quantity | Position size | 1 |
| Multiplier | 100 for equity options and SPX | 100 |
| Expiry | Date in title | 30 DTE |
| Spot price | Current underlying price (NOT strike) | middle strike |
| IV | Shown in greeks panel, or estimate from vega | 20% |
| Risk-free rate | — | 4.3% |
Critical for screenshots: The spot price is the CURRENT price of the underlying index/stock, NOT the strikes. Never default spot to a strike price value.
Current SPX reference price:
!`python3 -c "import yfinance as yf; print(f'SPX ≈ {yf.Ticker(\"^GSPC\").fast_info[\"lastPrice\"]:.0f}')" 2>/dev/null || echo "SPX price unavailable — check market data"`
Match to one of the supported strategies below, then read the corresponding section in references/strategies.md.
| Strategy | Legs | Key Identifiers |
|---|---|---|
| butterfly | Buy K1, Sell 2×K2, Buy K3 | 3 strikes, "Butterfly" in title |
| vertical_spread | Buy K1, Sell K2 (same expiry) | 2 strikes, debit or credit |
| calendar_spread | Buy far-expiry K, Sell near-expiry K | Same strike, 2 expiries |
| diagonal_spread | Buy far-expiry K1, Sell near-expiry K2 | Different strikes, 2 expiries |
| iron_condor | Sell K2/K3, Buy K1/K4 wings | 4 strikes, 2 spreads |
| jade_lizard | Sell put + Sell call spread, credit ≥ call width | 3 strikes |
| straddle | Buy Call K + Buy Put K | Same strike, both types |
| strangle | Buy OTM Call + Buy OTM Put | 2 strikes, both OTM |
| covered_call | Long 100 shares + Sell Call K | Stock + short call |
| protective_put | Long 100 shares + Buy Put K | Stock + long put |
| naked_put | Sell Put K | Single leg |
| ratio_spread | Buy 1×K1, Sell N×K2 | Unequal quantities |
| broken_wing_butterfly | Buy K1, Sell 2×K2, Buy K3 with K3−K2 ≠ K2−K1 | Asymmetric wings |
For strategies not listed, use custom mode: decompose into individual legs and sum their P&Ls.
d1 = (ln(S/K) + (r + σ²/2)·T) / (σ·√T)
d2 = d1 − σ·√T
put = K·e^(−rT)·N(−d2) − S·N(−d1)
call = put + S − K·e^(−rT)
if S >= K3: 0
if S >= K2: K3 − S
if S >= K1: S − K1
else: 0
Net P&L per share = payoff − premium_paid
long_call = max(S − K1, 0)
short_call = max(S − K2, 0)
payoff = long_call − short_call − net_debit
Calendar cannot be expressed as a simple expiry function — always use BS pricing for both legs:
value = BS(S, K, T_far, r, IV_far) − BS(S, K, T_near, r, IV_near)
For expiry curve of calendar: near leg expires worthless, far leg = BS with remaining T.
put_spread = max(K2 − S, 0) − max(K1 − S, 0) // short put spread
call_spread = max(S − K3, 0) − max(S − K4, 0) // short call spread
payoff = credit_received − put_spread − call_spread
Use visualize:read_me with modules ["chart", "interactive"] before building.
Structure section:
Pricing variables section:
Spot price:
Use this JS structure inside the widget, adapting expiryValue() and theoreticalValue() per strategy:
// Black-Scholes helpers (always include)
function normCDF(x) { /* Horner approximation */ }
function bsCall(S,K,T,r,sig) { /* standard BS call */ }
function bsPut(S,K,T,r,sig) { /* standard BS put */ }
// Strategy-specific expiry payoff (per-share, BEFORE premium)
function expiryValue(S, ...strikes) { ... }
// Strategy-specific theoretical value using BS
function theoreticalValue(S, ...strikes, T, r, iv) { ... }
// Main update() reads all sliders, computes arrays, destroys+recreates Chart.js instance
function update() { ... }
['k1','k2',...,'iv','dte','rate','spot'].forEach(id => {
document.getElementById(id).addEventListener('input', update);
});
update();
See references/bs_code.md for the full normCDF and bsCall/bsPut implementations.
After rendering the widget, briefly explain:
Keep it concise — the chart speaks for itself.
For Greeks of the position, recommend greeks-calculator. For vol-context interpretation, recommend iv-surface or vol-skew.
references/strategies.md — Detailed payoff formulas and edge cases for each strategy typereferences/bs_code.md — Copy-paste ready Black-Scholes JS implementation with normCDFnpx claudepluginhub dongzhuoyao/finance-option-skills --plugin option-strategiesCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.