nso_calculate
Calculate after-tax payout for NSO exercise, comparing sell-at-exercise versus holding for long-term capital gains, including federal, state, and FICA taxes.
Instructions
After-tax payout on a non-qualified stock option (NSO) exercise: federal, state, and FICA (Social Security + Medicare + Additional Medicare), comparing sell-at-exercise vs hold-for-long-term-capital-gains over the chosen horizon. Use for NSOs; for ISOs use amt_iso_optimize, for RSUs use rsu_sell_vs_hold. Deterministic, offline; tax tables compiled in. Optional ticker resolves expectedSalePrice from a bundled trailing-CAGR snapshot.
Returns a top-level object with these keys:
exercise: bargainElement, federal, state, socialSecurity, medicare, additionalMedicare, total, netCashSellAll, sharesSoldToCover, sharesRetained.hold: expectedGain, capGainFederal, capGainState, capGainTotal, isLongTerm at end of holdYears (LTCG triggers at holdYears ≥ 1).sellNowInvest: counterfactual where shares are sold at exercise and proceeds reinvested at expectedMarketReturn.holdMinusCashless: dollar delta betweenholdandsellNowInvest.bracketJump: fromRate, toRate, thresholdAtJump describing the marginal bracket change at exercise.
Example call: {shares: 5000, strike: 10, currentPrice: 50, ordinaryIncome: 180000, filingStatus: "single", stateCode: "CA", stillEmployed: true, holdYears: 2, volatility: 0.3, holdFunding: "cash", ticker: "AAPL"}. IMPORTANT: every field listed in required must come from the user's message OR be derivable from an optional ticker. The model invoking this tool MUST NOT invent a value for any required field. If the user did not supply it and no ticker resolves it, ask the user.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| shares | Yes | Non-qualified Stock Option (NSO) shares to exercise. | |
| strike | Yes | Strike price per share, USD. | |
| currentPrice | Yes | Current fair market value per share, USD. The bargain element at exercise is shares × (currentPrice − strike). | |
| ordinaryIncome | Yes | Annual W-2 ordinary income before this exercise, USD. Baseline for the bracket walk on the bargain element. | |
| filingStatus | Yes | Federal filing status. Drives ordinary brackets and LTCG brackets used at the hold horizon. | |
| stateCode | Yes | Two-letter US state code. Drives state ordinary and LTCG treatment. | |
| stillEmployed | Yes | True if still employed at exercise. FICA (Social Security + Medicare + Additional Medicare) applies only when true. | |
| holdYears | Yes | Years to hold after exercise (minimum 1). At ≥1 year, the appreciation since exercise is LTCG; sub-1-year holds are out of scope. | |
| expectedSalePrice | No | Projected $/share at end of holdYears. Required unless `ticker` resolves it from currentPrice × (1 + trailing CAGR)^holdYears. | |
| volatility | No | Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the user-supplied volatility directly; the tool computes the horizon-cumulative drag internally. The model MUST NOT compute drag itself — the correct formula is horizon-dependent and most models get it wrong. If the user does not supply a volatility number, ASK them. | |
| expectedMarketReturn | No | Annual after-tax-proceeds reinvestment rate. Defaults to SPY trailing CAGR for holdYears if omitted. | |
| ticker | No | Optional public-stock symbol (e.g. "NVDA", "AAPL"). When set, the tool substitutes the ticker's trailing CAGR for any unsupplied expected-return / sale-price field instead of requiring the caller to invent one. ~90 symbols covered; unknown tickers fall through to "required field" errors so the model knows to ask the user. | |
| holdFunding | Yes | How the strike cost and exercise tax are funded. 'sell-to-cover' sells enough shares to cover strike + tax (reduces sharesRetained). 'cash' pays from outside the position (full sharesRetained but requires the cashNeededAtExercise field). |