Generated banner for Options Payoff
Generated logo for Options Payoff

Options Payoff

Alex YangCommunityCreated by Alex Yang

  • Skill
  • Content generator
  • Business and productivity
  • MIT
  • No issues found

From the author

Render an interactive options payoff chart — expiry P&L plus Black-Scholes theoretical value — with sliders for strikes, premium, IV, DTE, and spot. Use this skill whenever the user describes or shares an options position or strategy and wants to see how it makes or loses money: vertical, calendar, diagonal, or ratio spreads, butterflies, condors and iron condors, straddles, strangles, covered calls, protective or naked puts, or any multi-leg structure. This includes pasted strikes, premiums, and expiries, requests like "show me the payoff" or "draw the P&L curve", and broker screenshots (IBKR, TastyTrade, Robinhood). Use it even when details are partial — defaults fill the gaps.
— the description by Alex Yang

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The Options Payoff skill provides a visual and analytical tool for traders to evaluate complex options strategies. By processing user-provided strategy details or broker screenshots, it renders an interactive chart that displays both the static expiry payoff and the dynamic Black-Scholes theoretical value. The tool includes adjustable sliders for key variables such as strike prices, implied volatility, days to expiry, and spot price, allowing users to stress-test their positions and visualize potential profit and loss scenarios in real-time.

What it does

  • Extracts strategy parameters from text or screenshots to build a model.
  • Calculates expiry P&L and Black-Scholes theoretical value for multi-leg structures.
  • Renders an interactive chart with dynamic sliders for strikes, IV, DTE, and spot price.
  • Displays real-time metrics including max profit, max loss, and breakeven points.
  • Supports common strategies like butterflies, iron condors, spreads, and straddles.
  • Provides a custom mode for decomposing complex or non-standard multi-leg positions.

When to use it

  • When you need to visualize the P&L curve of a specific options strategy.
  • When evaluating how changes in implied volatility or time decay affect a position.
  • When you have a broker screenshot and want to understand the risk profile.
  • When comparing theoretical value versus expiration outcomes for a trade.
  • When you need to identify breakeven points for a multi-leg spread.

Advantages

  • Interactive sliders allow for immediate 'what-if' analysis of market conditions.
  • Combines static expiry payoff with dynamic theoretical pricing.
  • Automates the extraction of data from unstructured text or images.
  • Provides clear visual indicators for profit zones and risk boundaries.

Usage examples

“Show me the payoff for an iron condor on SPX with short strikes at 5000/5200 and wings at 4900/5300.”
The agent renders an interactive chart showing the iron condor's P&L curve, with sliders to adjust the strikes, premium, and IV, and displays the max profit and loss.
“I have this position [paste screenshot of IBKR trade]. Can you draw the P&L curve?”
The agent parses the screenshot, identifies the legs, and generates an interactive chart showing the current theoretical value and the expiry payoff.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/himself65/options-payoff/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip options-payoff.zip -d .agents/skills

Documentation by Alex Yang

Options Payoff Curve Skill

If your host has not already executed the shell probes below (for example, in Codex), run the commands inside the ! wrappers with its shell tool before choosing a setup path. Use the actual output; if shell access is unavailable, report that limitation.

Generates an interactive HTML chart using the host's available visualization tool, or a standalone HTML file in Codex, showing:

  • Expiry payoff curve (dashed gray line) — intrinsic value at expiration

  • Theoretical value curve (solid colored line) — Black-Scholes price at current DTE/IV

  • Dynamic sliders for all key parameters

  • Real-time stats: max profit, max loss, breakevens, current P&L at spot


Step 1: Extract Strategy From User Input

When the user provides a screenshot or text, extract:

FieldWhere to find itDefault if missing
Strategy typeTitle bar / leg description"custom"
UnderlyingTicker symbolSPX
Strike(s)K1, K2, K3... in title or leg tablenearest round number
Premium paid/receivedFilled price or avg price5.00
QuantityPosition size1
Multiplier100 for equity options, 100 for SPX100
ExpiryDate in title30 DTE
Spot priceCurrent underlying price shown in the screenshot or textlive quote (see below); middle strike only if no quote is available
IVShown in greeks panel, or estimate from vega20%
Risk-free rate—4.3%

Spot for screenshots: spot is the underlying's current price, and broker screenshots often omit it or show it far from the strikes — don't read it off the strike labels. Use the price shown, else a live quote (the SPX probe below, or yfinance for other underlyings). Fall back to the middle strike only when no quote is available, and tell the user you did.

Current SPX reference price:

!`python3 -c "exec('try:\n import yfinance as yf\n p=yf.Ticker(\'^GSPC\').fast_info[\'lastPrice\']\n print(f\'SPX ≈ {p:.0f}\')\nexcept Exception:\n print(\'SPX price unavailable — check market data\')')"`

Step 2: Identify Strategy Type

Match to one of the supported strategies below, then read the corresponding section in references/strategies.md.

StrategyLegsKey Identifiers
butterflyBuy K1, Sell 2×K2, Buy K33 strikes, "Butterfly" in title
vertical_spreadBuy K1, Sell K2 (same expiry)2 strikes, debit or credit
calendar_spreadBuy far-expiry K, Sell near-expiry KSame strike, 2 expiries
iron_condorSell K2/K3, Buy K1/K4 wings4 strikes, 2 spreads
straddleBuy Call K + Buy Put KSame strike, both types
strangleBuy OTM Call + Buy OTM Put2 strikes, both OTM
covered_callLong 100 shares + Sell Call KStock + short call
naked_putSell Put KSingle leg
ratio_spreadBuy 1×K1, Sell N×K2Unequal quantities

For strategies not listed, use custom mode: decompose into individual legs and sum their P&Ls.


Step 3: Compute Payoffs

Black-Scholes Put Price
d1 = (ln(S/K) + (r + σ²/2)·T) / (σ·√T)
d2 = d1 - σ·√T
put = K·e^(-rT)·N(-d2) - S·N(-d1)
Black-Scholes Call Price (via put-call parity)
call = put + S - K·e^(-rT)
Butterfly Put Payoff (expiry)
if S >= K3: 0
if S >= K2: K3 - S
if S >= K1: S - K1
else: 0

Net P&L per share = payoff − premium_paid

Vertical Spread (call debit) Payoff (expiry)
long_call = max(S - K1, 0)
short_call = max(S - K2, 0)
payoff = long_call - short_call - net_debit
Calendar Spread Theoretical Value

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.

Iron Condor Payoff (expiry)
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

Step 4: Render the Widget

When visualize:read_me is available, read modules ["chart", "interactive"] before building and use visualize:show_widget to render. Otherwise use an available host visualization tool according to its documented interface. In Codex without an inline renderer, save a complete HTML document in the workspace, include the chart dependencies and CSS, verify it in a browser when available, and return a clickable file link. Preserve all controls and calculations below. Do not call tools that the host does not expose.

Required Controls (sliders)

Structure section:

  • All strike prices (K1, K2, K3... as needed by strategy)

  • Premium paid/received

  • Quantity

  • Multiplier (100 default, show for clarity)

Pricing variables section:

  • IV % (5–80%, step 0.5)

  • DTE — days to expiry (0–90)

  • Risk-free rate % (0–8%)

Spot price:

  • Full-width slider, range = [min_strike - 20%, max_strike + 20%], defaulting to ACTUAL current spot

Required Stats Cards (live-updating)
  • Max profit (expiry)

  • Max loss (expiry)

  • Breakeven(s) — show both for two-sided strategies

  • Current theoretical P&L at spot

Chart Specs
  • X-axis: SPX/underlying price

  • Y-axis: Total USD P&L (not per-share)

  • Blue solid line = theoretical value at current DTE/IV

  • Gray dashed line = expiry payoff

  • Green dashed vertical = strike prices (K2 center strike brighter)

  • Amber dashed vertical = current spot price

  • Fill above zero = green 10% opacity; below zero = red 10% opacity

  • Tooltip: show both curves on hover

Code template

Use this JS structure inside the widget, adapting pnlExpiry() and bfTheory() 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 (returns per-share value 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() { ... }

// Attach listeners
['k1','k2',...,'iv','dte','rate','spot'].forEach(id => {
  document.getElementById(id).addEventListener('input', update);
});
update();

Step 5: Respond to User

After rendering the widget, briefly explain:

  1. What strategy was detected and how legs were mapped

  2. Max profit / max loss at current settings

  3. One key insight (e.g., "spot is currently 950 pts below the profit zone, expiring tomorrow")

Keep it concise — the chart speaks for itself.


Reference Files

  • references/strategies.md — Detailed payoff formulas and edge cases for each strategy type

  • references/bs_code.md — Copy-paste ready Black-Scholes JS implementation with normCDF

Read the relevant reference file if you're unsure about payoff formula edge cases for a given strategy.

Files

references/strategies.md

Options Strategy Payoff Formulas

Butterfly (Put or Call)

Structure: Buy K1, Sell 2×K2, Buy K3 (K1 < K2 < K3, wings equal: K2-K1 = K3-K2) Cost: Net debit (long butterfly) Max profit: wing_width - premium, at K2 Max loss: premium paid, outside K1 or K3

function expiryValue(S, k1, k2, k3) {
  if (S >= k3) return 0;
  if (S >= k2) return k3 - S;
  if (S >= k1) return S - k1;
  return 0;
}
function theoreticalValue(S, k1, k2, k3, T, r, iv) {
  const s = iv/100;
  return bsPut(S,k1,T,r,s) - 2*bsPut(S,k2,T,r,s) + bsPut(S,k3,T,r,s);
}

Broken wing butterfly: K3-K2 ≠ K2-K1 → one side has residual directional exposure. Adjust formula accordingly.


Vertical Spread

Call Debit Spread (bullish)

Buy K1 call, Sell K2 call (K1 < K2)

function expiryValue(S, k1, k2) {
  return Math.max(S-k1, 0) - Math.max(S-k2, 0);
}
function theoreticalValue(S, k1, k2, T, r, iv) {
  return bsCall(S,k1,T,r,iv/100) - bsCall(S,k2,T,r,iv/100);
}

Max profit: K2-K1-debit | Max loss: debit paid

Put Debit Spread (bearish)

Buy K2 put, Sell K1 put (K1 < K2)

function expiryValue(S, k1, k2) {
  return Math.max(k2-S, 0) - Math.max(k1-S, 0);
}

Max profit: K2-K1-debit | Max loss: debit paid

Credit Spread

Sell the near strike, buy the far strike for protection. Net credit received. Expiry payoff = -(debit_spread expiry). Max profit = credit, Max loss = width - credit.


Calendar Spread (Time Spread)

Structure: Buy far-DTE option at K, Sell near-DTE option at K (same strike) Key: Cannot show a simple expiry curve — instead show value as DTE_near approaches 0.

// T_near = DTE_near/365, T_far = DTE_far/365
function theoreticalValue(S, K, T_near, T_far, r, iv_near, iv_far, isCall) {
  if (isCall) return bsCall(S,K,T_far,r,iv_far/100) - bsCall(S,K,T_near,r,iv_near/100);
  return bsPut(S,K,T_far,r,iv_far/100) - bsPut(S,K,T_near,r,iv_near/100);
}
// At near expiry (T_near=0): near leg expires, far leg retains time value
function atNearExpiry(S, K, T_far, r, iv_far, isCall) {
  if (isCall) return bsCall(S,K,T_far,r,iv_far/100);
  return bsPut(S,K,T_far,r,iv_far/100);
}

UI note for calendar: Show TWO sliders for DTE (near and far). "Expiry" curve = at-near-expiry value minus premium paid. Max profit: When spot = K at near expiry (maximum time value difference) Max loss: Premium paid (if spot moves far from K in either direction)


Iron Condor

Structure: Sell K2 put, Buy K1 put (put spread) + Sell K3 call, Buy K4 call (call spread) K1 < K2 < K3 < K4. Net credit received.

function expiryValue(S, k1, k2, k3, k4) {
  const putSpread = Math.max(k2-S,0) - Math.max(k1-S,0); // loss on short put spread
  const callSpread = Math.max(S-k3,0) - Math.max(S-k4,0); // loss on short call spread
  return -(putSpread + callSpread); // net payoff from short spreads
}
// credit = premium_received. P&L = credit + expiryValue
function theoreticalValue(S, k1, k2, k3, k4, T, r, iv) {
  const s=iv/100;
  return -(bsPut(S,k2,T,r,s)-bsPut(S,k1,T,r,s)) - (bsCall(S,k3,T,r,s)-bsCall(S,k4,T,r,s));
}

Max profit: credit received | Max loss: max(K2-K1, K4-K3) - credit


Straddle

Structure: Buy call at K + Buy put at K (same strike, same expiry)

function expiryValue(S, k) {
  return Math.abs(S - k); // = max(S-K,0) + max(K-S,0)
}
function theoreticalValue(S, k, T, r, iv) {
  return bsCall(S,k,T,r,iv/100) + bsPut(S,k,T,r,iv/100);
}

Breakevens: K ± premium. Max loss: premium paid (if S=K at expiry).


Strangle

Structure: Buy OTM put at K1 + Buy OTM call at K2 (K1 < K2)

function expiryValue(S, k1, k2) {
  return Math.max(k1-S, 0) + Math.max(S-k2, 0);
}
function theoreticalValue(S, k1, k2, T, r, iv) {
  return bsPut(S,k1,T,r,iv/100) + bsCall(S,k2,T,r,iv/100);
}

Breakevens: K1 - premium, K2 + premium. Max loss: premium if K1 ≤ S ≤ K2.


Covered Call

Structure: Long 100 shares at cost_basis + Sell call at K

function expiryValue(S, K, costBasis) {
  const stockPnl = S - costBasis;
  const shortCallPnl = -Math.max(S-K, 0) + premium; // premium = call premium received
  return stockPnl + shortCallPnl;
}

Max profit: K - costBasis + premium | Max loss: costBasis - premium (stock goes to 0)


Naked / Cash-Secured Put

Structure: Sell put at K, receive premium

function expiryValue(S, K, premium) {
  return premium - Math.max(K-S, 0);
}

Max profit: premium | Max loss: K - premium (stock goes to 0)


Edge Cases

  • DTE = 0: skip BS entirely, use intrinsic value only

  • IV = 0: BS undefined (σ=0), use max(intrinsic, 0)

  • K1 > K2: warn user, auto-sort strikes ascending

  • Negative theoretical value: clip to 0 for display (arbitrage-free floor)

  • Calendar with IV skew: use separate IV sliders for near vs far leg

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Python

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Alex Yang
Publisher
Alex Yang (Community)
Source
himself65/finance-skills · plugins/market-analysis/skills/options-payoff · commit a085078
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Alex Yang.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download options-payoff.zip