Implied Volatility Surfaces

IV (%) by moneyness and date. Choose the method — raw observed (gaps where no option trades), the simpler spline, or the SVI fit. Both charts share one color scale so they are directly comparable.

Method View
waiting for Python…
waiting for Python…
How these surfaces are built

For each listed expiration, implied volatility is solved from the bid/ask mid price using the Black-76 forward pricer. The forward F, risk-free rate r and dividend yield q are backed out per expiration from put-call parity, so call and put IVs agree at every strike. The three methods below are different ways of turning those solved points into a surface — switch between them with the Method dropdown above.

Raw (from market) — the solved IVs plotted exactly as observed, one point per strike using the out-of-the-money convention (puts at/below spot, calls above). Nothing is smoothed, fit, or filled, so the surface is faithful to the quotes but sparse: cells are left blank wherever no option trades. Best for seeing the real, unmassaged data.

Spline (basic) — a smoothing cubic spline is fit through each expiration's observed smile, then interpolated across time onto the dense 60–140% moneyness grid over every NYSE trading day. Quick and hugs the data closely, but it can wiggle where quotes are noisy and simply flat-extrapolates beyond the observed strikes — no arbitrage controls.

SVI (Industry Standard) — each smile is fit with Gatheral's raw SVI parameterization, a five-parameter shape built to stay arbitrage-free:

w(k) = a + b·[ρ(k − m) + √((k − m)² + σ²)]    with   k = ln(K / F)   and   w = σ²·T

The fitted slices are then filled by interpolating linearly in total variance across time, on the same 60–140% grid and trading-day calendar. Smooth and robust — the market-standard choice, and the default here — though as a parametric fit it won't pass exactly through every observed quote.

Data sources: AAPL option chain & price history — Yahoo Finance (yfinance);  SPX option chain — CBOE delayed quotes.

Price History

Two years of daily closing prices — AAPL (left axis) and SPX (right axis).

waiting for Python…
Current holdings
#AssetQuantityCost / share Cost datePriceEmbedded gain Current value% weight

Proof-of-concept model: SPX Basket and SPX Derivative are assumed to be unrelated for tax purposes. “SPX Basket” is a placeholder for any other stocks held in the portfolio that may carry embedded gains/losses, but can be sold to realise a net gain/loss.

Optional. Units of AAPL, SPX or cash you already own, with cost basis. Price is the current spot (cash = 1.00); Embedded gain is Quantity × (Price − Cost/share). Tick “Include current holdings” under the chart to overlay their change in value, Quantity × (price − cost), on the payoff.

Tax rules applied (proof of concept — not tax advice)

The legs above are scanned for common US options tax landmines. SPX Basket and SPX Derivative are treated as unrelated for tax purposes (a simplification of this model).

  • Constructive sale — §1259. A collar (own the stock + long put + short call) that is too tight can be deemed a sale of the appreciated stock on the day it is established, recognising gain. Practitioner bright line ≈ 15% of spot on both sides. Alert when either the put or the call strike is within 15% of spot.
  • Qualified covered call (QCC) — §1092(c). A covered call (stock + short call, no put) escapes the straddle rules only if the call has more than 30 days to expiry and is not in the money; otherwise it becomes a tax straddle. Adding a protective put (a collar) creates a “larger straddle” that disqualifies the QCC exception under §1092(c)(4)(A), so the collar is a straddle regardless of the call’s QCC status (Rev. Rul. 2002-66). Alert: a covered call is flagged when it fails the bright lines; a collar is always flagged as a straddle.
  • Holding-period reset — §1233(b) / §1092(b)(2). An at- or in-the-money protective put on stock held under 1 year is treated as a short sale: the stock’s holding period is terminated and restarts from zero when the put closes (the straddle ends) — the time already held is wiped out (§1233(b)(2)), so a near-term sale stays short-term. A married put (stock + put bought the same day) is exempt — §1233(c). By contrast §1092(f) only suspends (does not reset) the holding period while you grant a qualified covered call, and §246(c) tolls it for the qualified-dividend test. If the stock is already long-term, none of this bites. Alert when a long put at/near the money (strike within ~1% of spot) or in the money hedges short-term stock (uses the holding’s cost date); the after-tax forecast then taxes that AAPL as short-term.
  • Straddle rules — §1092. Offsetting positions (collar, straddle, strangle) are a tax straddle. Gains are recognised now — §1092 does not defer or accelerate gains. A loss on the loss leg is not recognised currently: under an identified straddle (§1092(a)(2)) it is added to the cost basis of the offsetting position (the stock), capped at that position’s unrealised gain, so the loss — taking the stock’s (long-term) character — is deferred until the stock is sold. Modified wash-sale and short-sale rules also apply. Broad-based index options (SPX) are instead §1256 (60/40 mark-to-market — see below), not subject to this deferral. Alert on legs that form a straddle.
  • Wash sale — §1091. Selling stock at a loss and, within ±30 days, buying a substantially identical call (or writing a deep in-the-money put) on the same name disallows the loss for now — it is deferred into the replacement position’s basis. Alert when a loss sale of held stock is paired with a long call (or deep-ITM short put) on the same underlying.
  • Index options — §1256. Broad-based index options (SPX) are marked to market and taxed 60% long-term / 40% short-term regardless of holding period. Info flag on SPX option legs.

Recognised packages are tinted (e.g. a collar shows long put in blue and short call in green). A 🛑 in the Tax Flag column marks a triggered rule — hover it for the detail; marks informational treatment. Not tax advice — strike spacing, basis, holding period and dividends all matter; for a real position consult a derivatives-savvy CPA.

Sources: Rev. Rul. 2002-66 (IRS) · Collar / QCC straddle guidance (Tax Notes) · 26 U.S.C. §1092(c)(4) (Cornell LII)

Model trade package A
#SideQtyUnderlying/AssetType ExpiryStrike Tax Flag MoneynessPricePremium Net Gain DeltaGammaVegaTheta Notional wtDelta wt

Proof-of-concept model: SPX Basket and SPX Derivative are assumed to be unrelated for tax purposes. “SPX Basket” is a placeholder for any other stocks held in the portfolio that may carry embedded gains, but can be sold to realise a net gain/loss. The SPX Derivative “E-mini” is any other stocks held in the portfolio that may carry embedded gains, but can be sold to realise a net gain/loss. The SPX Derivative “E-mini” is just a notional futures contract ($50 per index point) for exposure modelling — it carries no premium and has no adjustment for carry/financing costs etc.

Model trade package B
#SideQtyUnderlying/AssetType ExpiryStrike Tax Flag MoneynessPricePremium Net Gain DeltaGammaVegaTheta Notional wtDelta wt
Prepaid variable forward (PVF)

A PVF monetises the covered AAPL as a single grouped package: it adds three legs — the floor put, the ceiling call and the cash raised today — sharing one remove control and one colour. Cash now = covered value (spot × shares) − financing + the collar's net premium; financing = covered value × rate × years to the collar expiry. Strikes stay editable (the cash adjusts as they change); side, quantity, type, asset and expiry are locked. The cash stays in this package — it is not added to Current holdings.

Payoff

Forward P&L heat map for each underlying: price history to the left of today, then the package's P&L from today to the last expiry (priced off the fitted vol surface, intrinsic at expiry). Green = gain, red = loss; dashed grey lines mark ±% moves from spot and each option's strike (labelled e.g. “long put”, “short call”). The SPX chart combines all SPX positions (Basket + Derivative).

Show package
open this section to view…
open this section to view…
Payoff (traditional)

Net P&L = payoff minus net premium paid/received, ×100 per contract. Dotted lines are each leg at its own expiry; bold lines are the combined package. Pre-expiry valuation dates are priced off the fitted vol surface. Tick the dates to display (expiry shown by default). The top two charts split the package by underlying — each x-axis is shown in both price and moneyness; the lower chart combines all legs.

Show package
add a leg to choose valuation dates
add an AAPL leg…
add an SPX leg…
add a leg to see the payoff…
Backtest — coming soon.
Settings — coming soon.

Edit the model trade package below — it stays in sync with the Create Package tab.

Tax assumptions

Marginal rates applied to realised gains/losses in the after-tax forecast (built next). Tax-loss harvesting on the SPX Basket reduces realised tax later. Not tax advice.

Goal

by withdrawing $ cash on

Raises this much cash (after tax) at the date above. Existing cash is used first; the rest is funded by selling whichever stock — AAPL or the SPX basket — is most tax-effective (lowest realised tax per dollar raised), allowing for holding period (long vs short term) and any tax-loss harvesting set above. Computed for every simulation. The date must be on or after the day after the last option expiry in the package, so all options have settled.

Optimization — package A

The optimizer works on package A only (package B's PVF is left untouched). It only changes the quantity and strike of the legs already in package A — it does not add or remove leg types or underlyings. It searches those to maximise the mean after-tax net wealth at the goal across the filtered simulations. Each leg is capped by a notional-weight limit: an AAPL option leg's notional (qty × 100 × spot) can't exceed the value of the AAPL holding, and each SPX derivative leg's notional is capped at 100% of the portfolio value. Tax rules apply in the objective — including a §1259 constructive-sale charge on the held AAPL if the result forms a tight collar (long put & short call within 15% of spot). The result drives the optimized A scenario in the charts below. Re-run after changing package A, the goal or tax inputs.

#SideQtyUnderlying/AssetTypeExpiryStrike Tax Flag MoneynessPricePremiumNet Gain DeltaGammaVegaThetaNotional wtDelta wt
run the optimizer to see the result

Portfolio value forecast — scenario means & net wealth after tax

Left: mean simulated portfolio value over time under four cases — current holdings only; holdings + model package A; holdings + the optimised package A; and holdings + package B (the PVF). Package B is a prepaid variable forward: it monetises the pledged AAPL shares for a cash advance now, and at the goal it is exited by delivering those shares to the counterparty (rather than paying cash). The advance is kept untaxed (a loan, not a sale); only the net collar premium (call received − put paid) is taxed at exit. Any SPX basket bought with the cash is taxed as a stock position — capital gains with the tax-loss-harvesting benefit above — not at the §1256 index rate. Right: the resulting net wealth after tax at the goal date for each case, stacked into cash raised for the goal, the remaining AAPL and SPX basket, and the realised tax (shown negative).

waiting for Python & simulations…
 
Final tax transaction breakdown
Scenario

Every transaction that contributes to the realised tax at the goal date for the selected scenario, averaged across the filtered simulations. Sales made to fund the goal show the quantity sold, terminal price, cost basis, gain and tax; package option/derivative P&L and the PVF collar premium are realised at exit. For the AAPL collar (§1092 identified straddle) a gain is taxed now but a loss is deferred into the AAPL cost basis (shown as a “deferred” line with $0 tax now — the benefit lands in a lower AAPL sale gain). A negative tax is a net benefit (harvested losses). Not tax advice.

Tax transactionQuantityPriceCost basis GainEff. rateTax
open the Forecast and tax tab to compute…

Portfolio value forecast — all paths & per-simulation net wealth

Scenario

Left: every simulated portfolio value for the chosen scenario (bold = mean). Right: the after-tax net wealth at the goal date for every simulation (one stacked bar each, sorted by net wealth).

waiting for Python & simulations…
 
Simulations

Monte-Carlo paths from today to the last option expiry, drawn from each asset's historical daily drift & volatility, with AAPL and SPX correlated (ρ from history). Simulation #i for AAPL and #i for SPX form one joint scenario, so portfolio impacts line up later.

Filter by terminal moneyness. Set the share (%) of simulations you want to finish in each band (terminal price ÷ today's spot, at the last expiry), then click Filter to filter the joint scenarios down to those weights — simulations are only removed, never duplicated, so the kept set is smaller. The initial #, filtered # and result % columns show how each band is thinned for both assets. The filtered set drives the charts and later calculations. Use the Filter on toggle to pick which asset's weights drive the filter. By default it's AAPL, filtered to below-the-money outcomes (0% above the money, 25% in each band below it) — the typical worry of an investor holding a large, concentrated AAPL position that it falls in value. The other asset is a fallout: it follows through the joint pairing, and its columns simply report the resulting distribution (e.g. SPX skews down with AAPL). Click Reset filter to drop the filter.

Filter on “None” uses the full set; otherwise the other asset follows via the joint pairing
Terminal moneyness AAPL SPX
weight %initial #filtered #result % weight %initial #filtered #result %
Total 100% 100%
Simulation paths

History to the left of today's dashed line; simulated paths fan out to the right. Bold line = median, dotted = 5th / 95th percentile across the (filtered) scenarios.

simulating…
simulating…