protective_put_price
Price a protective put or zero-cost collar on a single-stock position, reporting annualized hedge cost, maximum loss, upside cap, and probability of protection floor hit.
Instructions
Black-Scholes pricing of a protective put or zero-cost collar on a single-stock position. Use for standalone hedge pricing on a single-stock position; for concentration-vs-hedge tax-cost comparison, use concentration_analyze with a hedgeChoice. Parameter interactions an agent should know: volatility omitted falls back to sector_stats[sector].annualVol × 1.20 (the implied-over-realized vol multiplier); supply an explicit sigma when the user provides one. For collars, omitting upsideCapPct lets the tool back-solve the cap that zeros the net premium (truly zero-cost collar); supplying upsideCapPct overrides the solver and yields a non-zero net premium when the cap is wider than zero-cost. tenorYears drives the risk-free-rate lookup AND the floor-hit / cap-hit probability metrics, so changing tenor shifts every probability output even at fixed strike. expectedReturn affects only the probability metrics (real-world drift in the floor-hit / cap-hit calculations); premium math is risk-neutral and ignores it (default 0). protectionLevel sets the put strike as (1 − protectionLevel) × spot; raising it widens the protected zone but raises premium roughly linearly. Closed-form, deterministic, offline: sector volatility table and risk-free-rate curve compiled in. Reports annualized hedge cost as a percentage of position value, maximum loss with the hedge in place, upside-participation cap (collar only, since the short call offsets the long put premium), and probability of hitting the protection floor over the tenor. Returns a top-level object with keys: inputs (echoed canonical input), riskFreeRate (used in Black-Scholes), realWorldDrift (from expectedReturn), barePut (strike, premium, annualCost, annualCostPct, maxLoss, badYearPrice, badYearDropPct, coveredLossAtBadYear, premiumToCoveredRatio, expectedProfit, premiumToExpectedProfitRatio), collar (putStrike, callStrike, netPremium, annualCost, annualCostPct, maxLoss, upsideCap, upsideCapPct, isZeroCost, capProbability), payoffTable, payoffRange, and recommended (the better of bare put vs collar given the inputs). Both barePut and collar blocks are always returned regardless of caller preference; the caller picks. Example call: {positionValue: 400000, sector: "tech_software", protectionLevel: 0.10, tenorYears: 1}. IMPORTANT: every field listed in required must come from the user's message. The model invoking this tool MUST NOT invent a value for any required field. If the user did not supply it, ask the user. For enum fields that accept unsure, pass unsure when the user does not know; do not guess yes/no.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| positionValue | Yes | Market value of the underlying single-stock position, USD. Premium and max-loss scale linearly with this. | |
| sector | Yes | Sector tag. Drives the default volatility when no explicit `volatility` is supplied. Lookup table is in lib/markets/sector-stats.ts. | |
| volatility | No | Annualized implied volatility (sigma) of the stock. Defaults to a sector-typical IV when omitted. The model SHOULD NOT invent this. Either pass an explicit value the user gave you, or omit it and let the sector default apply. | |
| protectionLevel | Yes | Put strike as (1 − this fraction) × spot. 0.10 = 10% OTM put. Range 0.05..0.50. | |
| tenorYears | Yes | Option tenor in years. 1 = 12-month; 0.25 = ~90-day. | |
| expectedReturn | No | Annual expected stock return (decimal). Drives risk-neutral drift in the cap-hit / floor-hit probability metrics. Does not affect premium math. Default 0. | |
| tickerLabel | No | Optional display string echoed back in the result. Not used in pricing. |