Spec 03 — Volatility Risk Premium / Options-Income Strategy Family
Status: Research + design spec (no production code, no repo edits).
Author: Institutional quant research pass, 2026-06-06.
Target codebase: /Users/admin/qgtmai/trading (Python 3.12, Alpaca paper).
Scope: A systematic short-volatility income sleeve on liquid optionable ETFs, paired with a mandatory tail-hedge overlay, expressed in real Alpaca equity/ETF options (not the current delta-one proxy), plus a tractable backtest design that survives the historical-options-data gap.
0. TL;DR and brutal-honesty verdict
The edge is real but shrinking, and the implementation constraints on Alpaca are the binding risk — not the alpha.
-
VRP is one of the best-documented risk premia (implied vol > realized vol, persistent and pervasive across assets, with a clean risk-based reason it should survive publication). But the most recent evidence (Federal Reserve Bank of Chicago WP 2025-17) shows traded-option alpha has declined toward zero over the last ~15 years. Design for a thinner premium than the 1990–2010 papers imply, and earn the bulk of the Sharpe from drawdown control and structuring, not from raw carry.
-
Alpaca can express this sleeve — within hard limits:
- US-listed equity & ETF options only, all American-style → physical settlement and early-assignment risk are real. No SPX/XSP/NDX index options (no cash settlement, no European exercise, no §1256 tax treatment).
- Paper accounts are auto-approved to Level 3. Live requires application per level.
- Multi-leg (MLEG) orders must be fully covered within the single order. A naked short leg in an MLEG is rejected. This forces defined-risk structures (put credit spreads, iron condors) for any short-call exposure, and forces rolls to be two separate orders (close, then open).
- Single-leg short puts are allowed as cash-secured puts (Level 2). Single-leg short calls must be covered (own the shares). There is no "naked call" level.
-
Historical option price data starts February 2024. You cannot backtest option P&L through 2018, 2020, or most of 2022 using Alpaca data. This is the #1 feasibility risk and is addressed in §7.
-
The current codebase does NOT actually trade options. Every existing "vol" strategy (
vol_risk_premium_pm,options_strategies.py,tail_hedge_pm, …) emits aSignalon the underlying ETF symbol with a directionalweight, and both the OMS and the backtester treat that as a delta-one share position. The option legs live only inSignal.metadataand are ignored downstream. So today's "short vol" backtests are really "short the ETF" backtests — no theta, no convexity, no premium, no vega. Fixing this (a real options order path + a real options P&L model) is the bulk of the engineering, and is specified in §4 and §7. -
Prioritized shortlist (full detail in §6):
| Rank | Sleeve | Alpaca expression | Why first | Net Sharpe target* | Assignment risk |
|---|---|---|---|---|---|
| 1 | S1 Put-Write / Put-Spread engine (the core) | Cash-secured short put (L2) or put credit spread (L3 MLEG) | Best-studied VRP harvest; PUT index Sharpe ≈0.65 hist.; maps cleanly to Alpaca | 0.45–0.75 | Med (puts ITM → long shares) |
| 2 | S5 Tail-hedge overlay (mandatory co-requisite) | Long OTM put ladder + optional VIXY calls, premium-financed | Converts naked short-vol into capped, convex left tail | N/A (insurance) | None (long options) |
| 3 | S3 Iron-condor / defined-risk strangle | L3 MLEG iron condor (all legs covered) | Assignment-light, capital-efficient, scales capacity | 0.4–0.7 | Low (defined risk) |
| 4 | S2 Risk-managed covered-call overwrite | Covered call (L2) + delta management | Harvests VRP on the existing long ETF book (gold, etc.) | 0.4–0.7 | Med (calls ITM → lose shares) |
| 5 | S4 Term-structure regime gate + small calendar | Signal/gate from VIX–VIX3M; optional SPY calendar | Cheap, uses data already in repo; throttles S1–S3 | adds ~0.1–0.2 to sleeve | Low |
* Realistic net-of-cost, post-VRP-decline estimates, not promises. See §6 per-sleeve and §9 for how these are validated. The defensible claim is risk-adjusted improvement over buy-and-hold via lower drawdown (Calmar), not a high absolute Sharpe.
One-line recommendation: Build S1 + S5 as a single paired unit ("short-put carry with a financed crash hedge"), prove it on the 3-tier backtest (§7), then add S3 for capacity and S2 to monetize the existing long book. Treat S4 as a regime gate from day one. Do not ship any short-vol leg without S5 live.
1. The edge: why VRP exists and whether it persists
1.1 Definition and mechanism
The variance/volatility risk premium (VRP) is the persistent gap by which option-implied volatility exceeds subsequently realized volatility on the same underlying. A seller of options (or of variance) is paid this gap as compensation for bearing the risk that realized vol spikes — and crucially, that it spikes in bad states of the world (equity drawdowns), exactly when the payout hurts most. That state-dependence is the risk-based explanation for why the premium is not an arbitrage and should survive publication: investors rationally overpay for downside insurance.
- Carr & Wu (2009), Variance Risk Premiums — formalizes VRP via synthetic variance swaps; documents large, significantly negative variance-swap returns for equity indices (i.e., sellers earn a premium).
- Bakshi & Kapadia (2003) — delta-hedged option returns are negative, the canonical VRP proxy.
- Bollerslev, Tauchen & Zhou (2009) — VRP also forecasts equity returns (regime information).
1.2 Persistence and pervasiveness (the bull case)
A large body of work (summarized by Berkin & Swedroe / Alpha Architect, "The Variance Risk Premium is Pervasive") finds VRP is: - Persistent across time (multi-decade), and - Pervasive across assets and geographies — equity indices, bonds, commodities, FX — with low cross-asset correlation in its drivers (gold vol is driven by different shocks than equity vol). This is the basis for diversifying the sleeve across SPY/QQQ/IWM and GLD/SLV/TLT.
1.3 The decline (the honest bear case — design around this)
- Federal Reserve Bank of Chicago, WP 2025-17, "The Decline of the Variance Risk Premium" documents that equity index option alphas have become statistically indistinguishable from zero over the past ~10–15 years, and ties the decline to reduced intermediary risk-bearing constraints. The delta-hedged-option proxy (Bakshi-Kapadia) confirms the compression.
- Practical corollaries:
- Carry alone is thin now. The sleeve must add value via structuring (strike/DTE/management discipline, regime gating) and risk control (tail overlay, delta management), not by selling more vol.
- 0DTE and the post-2018 seller glut have compressed front-end premium and changed intraday gamma dynamics. Favor 30–45 DTE monthlies over 0DTE for a systematic income engine (capacity, slippage, manageability).
- Assume decay. Wire the sleeve into the existing
DecayMetricsmachinery (qgtm_strategies/base.py) and pre-commit to kill-criteria (§12).
Net stance: VRP is a legitimate, risk-based premium worth harvesting, but at a lower expected magnitude than the classic literature. The product is "structured short-vol with a hard floor," not "sell premium and pray."
2. Benchmark evidence (grounding the return expectations)
2.1 CBOE put-write / buy-write indices (the reference implementations)
CBOE S&P 500 PutWrite (PUT) — sells 1-month ATM SPX puts against T-bill collateral: - Long-term (1986–2018, Bondarenko/CBOE; via SSRN 3393940 and CFA Institute): annualized Sharpe ≈ 0.65 for PUT vs ≈ 0.49 for S&P 500 TR, with comparable compound return and substantially lower volatility (~9.95% vs ~15%). - Max drawdown −32.7% (PUT) vs −50.9% (S&P 500) over the same window. - Average annual gross premium collected ≈ 22.1% (PUT, monthly) / ≈ 37.1% (WPUT, weekly).
CBOE S&P 500 One-Week PutWrite (WPUT) — weekly ATM puts: - Max drawdown −24.2%, beta 0.54, annualized vol 9.48% (lower than PUT and SPX). Weekly cadence → smaller per-trade premium but higher aggregate and shorter/shallower drawdowns (longest 22 months vs 29 for PUT vs 52 for SPX).
CBOE S&P 500 BuyWrite (BXM) — long S&P 500, sell 1-month ATM calls (covered call). From the CBOE BXM factsheet (since Jun 1986): - Annualized return 8.5%, vol 10.7%, max DD −35.8%, beta 0.62, Sharpe 0.54, Sortino 0.74 vs S&P 500 TR 11.2% / 15.2% / −50.9% / 1.0 / 0.56 / 0.83. - Calendar-year stress behavior (BXM vs S&P 500 TR): 2018: −4.8% vs −4.4%; 2020: −2.8% vs +18.4% (covered call badly lagged the V-recovery — the cap hurt); 2022: −11.4% vs −18.1% (income cushion helped in a grind-down).
Reading the tape: option-income indices deliver lower vol and much lower max drawdown than the index, with a comparable-to-slightly-lower Sharpe, and they underperform in sharp V-shaped recoveries (2020) while outperforming in grind-down bears (2022) and roughly matching in fast single-shock selloffs (2018). That is exactly the payoff profile to expect — and to size for.
2.2 Covered calls decomposed (how to do it right)
Israelov & Nielsen (2015), "Covered Calls Uncovered" (AQR, FAJ): - A covered call = passive equity + short volatility + an uncompensated equity-timing (reversal) bet. - The short-vol component had a realized Sharpe ≈ 1.0 but contributed <10% of the strategy's risk. - The equity-timing bet contributes ~¼ of the risk and ~0 return — pure waste. - Fix: delta-manage (trade the underlying to hold net delta constant), which removes the timing bet → higher Sharpe, lower downside beta for the same VRP capture. This is the single most important "structuring" lever (see S2 and §5.3).
2.3 Term structure / vol carry
- The VIX futures term structure is in contango most of the time (Avellaneda & Papanicolaou, SSRN 3028910: typical state VIX ≈ 12%, long-run futures ≈ 20%), so short-vol carry harvests roll-down, but with modest Sharpe (~0.5) and severe, inevitable backwardation spikes (Feb 2018, Mar 2020). Backwardation (front > back) = stress = the regime to stand down and let the tail overlay pay.
- Alpaca cannot trade VIX futures or SPX, so term structure is used here primarily as a regime gate and sizing throttle (data already in repo via FRED
VIXCLS, plusvix_front/vix_backcolumns the existing strategies consume), with an optional small SPY calendar-spread expression (S4).
2.4 Tail hedging cost (why the overlay must be budgeted)
- Israelov, "Pathetic Protection" / AQR work on put protection: systematically buying puts bleeds — it is expensive insurance with persistent negative carry. Ilmanen (2012), "Do Financial Markets Reward Buying or Selling Insurance?" and Bhansali (2014), Tail Risk Hedging, reach the same conclusion: protection must be financed and budgeted, not bought naively.
- Design implication: S5 is funded out of S1–S3 premium with a hard NAV budget (the existing
tail_hedge_pmalready encodes a 0.5%/month budget pattern). The whole point is that the short-vol carry pays for the crash hedge, netting to a defined-risk, convex-left-tail sleeve.
3. Alpaca options capability matrix (what we can actually do)
Sources: Alpaca docs (
/us/docs/options-trading,/options-trading-overview,/options-level-3-trading,/historical-option-data), Alpaca Learn articles, and thealpaca-pybull-put-spread example. Confirmed 2026-06.
3.1 Instruments & settlement
| Capability | Status | Consequence for design |
|---|---|---|
| US equity & ETF options (SPY, QQQ, IWM, GLD, SLV, TLT, …) | ✅ Supported | Our universe is fine |
| Index options (SPX, XSP, NDX, RUT) | ❌ Not supported | No cash settlement, no European exercise, no §1256 tax; must use ETF proxies |
| Exercise style | American (all) | Early-assignment risk on any ITM short leg |
| Settlement | Physical (shares) | ITM short put → you're long 100 sh/contract; ITM short call (covered) → shares called away |
| Exercise / Do-Not-Exercise via API | ✅ | Can manage long-leg expiry programmatically |
3.2 Approval levels
| Level | Allowed | Paper | Live |
|---|---|---|---|
| 1 | Buy calls, buy puts (long premium) | auto | apply |
| 2 | + Covered call, + Cash-secured put (single-leg shorts that are covered/secured) | auto | apply |
| 3 | + Multi-leg spreads (verticals, straddles, strangles, condors, butterflies, calendars) | auto-approved | apply |
| "Naked" | No naked-call level exists | — | — |
3.3 The MLEG "covered-only" rule (critical, shapes every structure)
From Alpaca's Level-3 docs:
"…an MLeg order is accepted only if all its legs are covered within the same MLeg order. For example, an MLeg order containing two short call legs would be rejected, though submitting those short calls separately as single-leg orders is allowed. This restriction also impacts certain strategies, including rolling a short contract or rolling a calendar spread, since they would involve uncovered short legs within the same multi-leg order."
Implications — read carefully: - ✅ Put credit spread = short put + long lower put → long leg covers short → allowed as one MLEG. - ✅ Iron condor = put spread + call spread, all four legs → fully covered → allowed as one MLEG. This is our preferred no-assignment short-vol vehicle. - ❌ Naked short strangle (short put + short call, no wings) as an MLEG → rejected (two uncovered shorts). Must be an iron condor (add wings) or legged as separate orders (and the short call still needs share coverage). - ⚠️ Cash-secured put is a single-leg short put (Level 2) → allowed (not an MLEG). - ⚠️ Rolling a short option must be TWO orders: buy-to-close the near contract, then sell-to-open the next — you cannot put it in one MLEG (the open leg is an uncovered short). This creates leg risk + double slippage at every roll → model it (see §6.1 exit, §7 costs).
3.4 Market data
| Feed | Cost | Latency | Contents |
|---|---|---|---|
| Indicative | Free | 15-min delayed | derivative quotes/trades (not true OPRA); greeks/IV availability limited |
| OPRA | Paid (Algo Trader Plus) | Real-time | consolidated BBO; needed for live execution & greeks/IV at quality |
| Historical option bars/trades | via Market Data API | since Feb 2024 only | OCC-format contracts, active & expired |
- The repo already has
qgtm_data/options.py::OptionsDataProviderthat pulls/v2/options/contracts, enriches via/v1beta1/options/snapshots(delta/gamma/theta/vega/rho/IV), gets the underlying mark, and even proxies historical IV as realized-vol×1.2 (it explicitly notes "Alpaca doesn't store historical IV directly"). That proxy is the seed of our synthetic backtest engine (§7). - Honest gap: greeks/IV in snapshots are quality only with OPRA; on the free indicative feed they may be sparse/delayed. For paper validation this is acceptable; for live budget for OPRA or compute greeks ourselves (we control the BSM pricer anyway — §7.2).
3.5 Assignment & lifecycle
- Assignment/exercise arrive as Non-Trade Activities (NTA), retrieved by polling
/v2/account/activities?activity_types=OPASG,OPEXP,OPEXC— not pushed over the order WebSocket. The daemon must poll and reconcile. - On assignment, a share position appears in
/v2/positions(asset classus_optionvs equity); the sleeve must detect it, fold it into (or flatten it against) the equity book, and re-hedge delta. - Ex-dividend early-assignment risk on short ITM calls: SPY/QQQ/IWM/TLT pay distributions; GLD/SLV do not pay dividends (lower call-assignment risk — a point in their favor for overwriting). Avoid holding ITM short calls through ex-div.
4. Codebase integration reality and required additions
4.1 What exists (and the core gap)
- Strategy contract (
qgtm_strategies/base.py):generate_signals(features, universe, timestamp) -> list[Signal];Signal.weight ∈ [-1,1],confidence ∈ [0,1], free-formmetadata.FactorExposurealready hasvolatilityandcarryfields;CapacityModelandDecayMetricsexist; regime gating viaregime_tags/should_trade. - Signal/Order types (
qgtm_core/types.py):Orderis single-symbol, single-leg, equity-only. There is no option symbol, right, strike, expiry, orlegs[], and noorder_class. - OMS (
qgtm_execution/oms.py):process_signalsizes a position asquantity = int(position_value / current_price)on the underlying and submits one equity order. It has good infra we want to reuse: pre-trade cost gate, TCA, VWAP/TWAP routing, audit log, idempotency, kill switch. - Broker (
qgtm_execution/broker.py::AlpacaBroker): posts/v2/orderswithsymbol/qty/side/type/tif; supports equity bracket/OCO. No options path. - Backtester (
qgtm_backtest/engine.py): vectorizednet_ret = ret_1d(underlying) * weight − cost. No option P&L. Has excellent validation infra: purged k-fold, walk-forward, embargo, deflated Sharpe & PBO (deflated_sharpe_ratio). - Data:
qgtm_data/options.py(chain + greeks + FRED GVZ/VXSLV/VIX) — solid live-chain plumbing, no historical option prices, no synthetic pricer.
Conclusion: the existing vol strategies are signal prototypes, not tradeable options strategies. The metadata they emit (
option_action,strike,call_strike/put_strike,dte_target) is the right intent but is dropped by the OMS and misinterpreted (delta-one) by the backtester.
4.2 Required additions (the implementation surface)
Minimal, back-compatible extensions — each is additive so the 200+ existing equity tests keep passing.
(a) Types — qgtm_core/types.py
class OrderClass(StrEnum):
SIMPLE = auto() # existing equity behavior (default)
MLEG = auto() # multi-leg option order
class OptionRight(StrEnum):
CALL = auto()
PUT = auto()
class OptionLeg(BaseModel):
occ_symbol: str # e.g. "SPY260320P00540000"; resolved from chain
underlying: str
right: OptionRight
strike: Decimal
expiry: date
side: Side # LONG = buy_to_open/close, SHORT = sell_to_open/close
ratio_qty: int = 1 # contracts per structure unit
open_close: str = "open" # "open" | "close" (rolls submit close then open)
# Extend Order (all new fields default so SIMPLE equity orders are unchanged):
# order_class: OrderClass = OrderClass.SIMPLE
# asset_type: str = "equity" # "equity" | "option"
# legs: list[OptionLeg] = [] # populated for MLEG / single-leg option
# contracts: int = 0 # # of structures (×100 multiplier)
OptionPosition (or extend Position with asset_type, legs, aggregate greeks) so the risk layer can read net delta/vega/gamma/theta.
(b) Strategy emission — qgtm_strategies/base.py
Add an OptionStrategy mixin/subclass whose helper emit_structure(...) writes a validated leg schema into Signal.metadata["option_structure"]:
signal.metadata["option_structure"] = {
"kind": "put_credit_spread" | "cash_secured_put" | "iron_condor" |
"covered_call" | "long_put_ladder" | "calendar",
"underlying": "SPY",
"target": {"short_delta": 0.20, "wing_delta": 0.10, "dte": 38},
"legs": [ {right, strike_rule, side, ratio}, ... ], # strikes resolved at exec by chain
"management": {"profit_take": 0.5, "close_dte": 21, "stop_mult": 2.0},
"sizing": {"mode": "tail_budget", "tail_dollar_risk_pct": 0.004},
}
Signal.symbol = underlying so existing risk/attribution/decay keep working; the OMS reads option_structure to build the real OptionLeg[].
(c) OMS — qgtm_execution/oms.py
New process_option_signal(signal, portfolio, chain_provider, ...):
1. Pull the live chain (OptionsDataProvider.fetch_options_chain), select OCC symbols by target delta + DTE (nearest-delta strike, nearest-DTE expiry within tolerance).
2. Size by contracts from tail budget / notional (see §8), not int(notional/underlying_price).
3. Validate against the MLEG covered-only rule (reject naked-short MLEGs at build time).
4. Reuse the existing pre-trade cost gate with an option-aware spread estimate (per-contract bid/ask in $, not bps of underlying).
5. Route to broker.submit_options_order. Rolls = two sequential orders (BTC then STO), each idempotent.
(d) Broker — qgtm_execution/broker.py
AlpacaBroker.submit_options_order(order) posts /v2/orders with order_class="mleg" and a legs[] array (symbol, side ∈ {buy,sell}, position_intent ∈ {buy_to_open,…}, ratio_qty), or a single-leg option order for CSP/covered-call. Add:
- get_option_positions() (parse asset_class=="us_option" from /v2/positions).
- poll_option_activities() → /v2/account/activities?activity_types=OPASG,OPEXP,OPEXC for assignment/expiry reconciliation.
- exercise_option() / do_not_exercise() for long-leg expiry control.
(e) Risk — qgtm_risk/manager.py
Add Greeks-aware checks alongside check_signal/check_order/plan_order:
- Portfolio caps on net delta, net vega, net gamma, short-gamma notional, and tail $-risk budget.
- Buying-power/cash check for cash-secured puts (strike×100×n − premium, per Alpaca's CSP requirement).
- Assignment-aware exposure: treat short ITM puts near expiry as contingent long equity.
(f) Backtest — qgtm_backtest/engine.py
Add an OptionsBacktestEngine (or a pricing hook on run) that prices each leg daily via a BSM repricer over a synthetic IV surface, accrues theta, models assignment/roll, and nets the tail overlay — see §7. Reuse the existing deflated Sharpe / PBO / purged-CV harness unchanged (it operates on a daily-return vector, which the options engine produces).
(g) Data — qgtm_data/options.py
Add: historical option-bar fetch (Feb-2024+), a synthetic IV-surface builder (VIX/VIX3M/GVZ/VXSLV-anchored, skew-parameterized), and a BSM pricer + greeks module (so we don't depend on OPRA greeks for backtests or paper).
5. Sleeve architecture
5.1 Universe
- Core index VRP: SPY, QQQ, IWM — deepest options, penny/nickel spreads, richest research base, highest capacity.
- Cross-asset diversifiers: GLD, SLV (different vol drivers; the existing repo is gold-centric and already has GVZ/VXSLV), TLT (rates vol). Optionally HYG (credit), EEM (EM).
- Rationale: cross-asset VRP has low correlation in its drivers (§1.2), so a basket lowers sleeve vol and reduces single-shock dependence.
5.2 Component roles
┌─────────────────────────── VRP INCOME CORE ───────────────────────────┐
S1 Put-Write / Put-Spread ──┐
S3 Iron Condor (defined risk)─┼── short vol carry (theta+), +delta, −vega, −gamma
S2 Risk-managed Overwrite ──┘ (delta-managed to isolate equity+vol premia)
└────────────────────────────────────────────────────────────────────────┘
│ premium funds ↓ (budgeted ≤20–30% of credit)
S5 Tail-Hedge Overlay ────────┘ long OTM puts + VIXY calls: −delta, +vega, +gamma (convex)
S4 Term-structure gate ─────────── scales S1–S3 gross; flips S5 funding; optional calendar
5.3 Cross-cutting design principles
- Always defined-risk in aggregate. Even when using single-leg CSPs (S1 mode A), S5 must provide the basket-level floor so the sleeve is never unboundedly short vol.
- Delta-manage the carry (Israelov). Maintain a target net delta band by trading the underlying ETF (cheap, liquid) so the sleeve earns equity+vol premia without the uncompensated timing bet. Start simple (partial overwrite ratio <100%, delta band rebalanced weekly), then full daily delta-hedge if it pays after costs.
- Term-structure gate (S4). Size short-vol gross by VRP signal and VIX–VIX3M slope: full size in contango + rich VRP; throttle to spreads-only and reduce size when flat; stand down (carry off, hedge on) in backwardation.
- Manage at 50% profit or 21 DTE (the empirically robust short-premium rule: harvest most of theta, avoid terminal gamma). 2× credit stop on undefined-risk legs; defined-risk structures let the wing be the stop.
- No positions through binary events you can't price (FOMC/CPI same-week entries throttled; earnings N/A for ETFs but macro prints matter).
- Decay-aware: register
in_sample_sharpeand letDecayMetricsflag when 6m/12m Sharpe < 50% of IS (auto-quarantine path already exists).
6. Per-strategy specifications
Each spec follows the mandated template: rationale & persistence · construction · data & Alpaca feasibility · entry/exit/roll/assignment · sizing & tail budget · expected Sharpe/turnover/capacity · correlation · failure modes & decay · OOS validation & stress.
S1 — Systematic Put-Write / Put-Spread Engine (CORE)
Rationale & persistence. Selling puts is the purest, best-documented VRP harvest (CBOE PUT Sharpe ≈0.65 vs SPX 0.49, 1986–2018; max DD −32.7% vs −50.9%). The premium is risk-based (investors overpay for downside insurance) → expected to persist, though thinner post-2010 (§1.3). On an ETF book this is "PUTW/WPUT done systematically with a regime filter and a crash hedge."
Construction.
- Mode A — cash-secured short put (Level 2, single-leg): sell ~20–25Δ put, 30–45 DTE (target 38). Used when tail budget is healthy and VIX term in contango.
- Mode B — put credit spread (Level 3 MLEG): short ~25Δ put + long ~10Δ put (width 3–7% of spot). Used when tail risk elevated, VRP marginal, or to cap margin/scale capacity. Defined risk = the wing.
- Per underlying, ladder entries weekly (4 tranches) to diversify entry vol — the WPUT insight (smoother equity, shorter drawdowns).
- Strikes resolved from the live chain by nearest delta; never by a fixed % rule (the existing prototypes use crude price*(1−iv*0.15) — replace with delta-targeting from OptionContract.delta).
Data & Alpaca feasibility. ✅ Fully supported. Mode A = Level 2 single-leg short put (paper auto-approved; live needs cash = strike×100×n − premium). Mode B = Level 3 MLEG (long leg covers short). Chain/greeks via existing OptionsDataProvider. Roll = 2 orders (BTC + STO).
Entry / exit / roll / assignment.
- Entry: VRP signal positive (IV₃₀ > forecast RV; use IV−RV percentile ≥ ~60th as in vol_risk_premium_pm), term-structure not backwardated, no same-week unpriceable binary, liquidity OK (OI/volume gate as in the alpaca-py example validate_sufficient_OI).
- Exit: 50% of max profit or 21 DTE, whichever first; 2× credit stop (Mode A) / let wing define loss (Mode B).
- Roll: if tested (short strike breached) and thesis intact, BTC and STO down-and-out (lower strike, next expiry) as two orders; cap rolls to avoid martingale.
- Assignment: ITM at/near expiry → long 100 sh/contract. Handler folds shares into equity book, then either (i) flattens at next open, or (ii) overwrites via S2 (wheel). Avoid surprise assignment by closing/rolling ITM shorts before expiry; poll OPASG.
Sizing & tail budget. Size by tail $-risk (§8): contracts chosen so a defined adverse move (Mode B = full width; Mode A = move to e.g. −2σ/short-strike-minus-stop) costs ≤ a per-trade fraction of NAV. Aggregate short-put notional capped; aggregate net delta inside band. S5 hedge sized to the basket's gap-risk.
Expected performance (honest). Gross Sharpe ~0.5–0.7 (index-level historical, pre-decline); realistic net 0.45–0.75 with regime gate adding drawdown control; could be 0.3–0.5 if VRP stays compressed. Turnover: ~12–17 cycles/yr/underlying (monthly with rolls) → high option-leg turnover, modest underlying turnover. Capacity: very high for SPY/QQQ ($50–100M+ at our sizes), high GLD/IWM, medium SLV/TLT.
Correlation. +0.3–0.6 to equities via residual long delta (→ +1 in crises if unhedged — the reason S5 is mandatory); 0.6–0.9 to S2/S3; diversifies the gold-centric existing book in calm regimes.
Failure modes & decay. Gap-through-strike (Feb 2018, Mar 2020) — the dominant risk; pin risk; assignment cash drag; liquidity holes widening spreads in stress; VRP decay (Chicago Fed). Mitigants: S5 floor, defined-risk Mode B in stress, 21-DTE/50% discipline, decay monitor.
OOS validation & stress. 3-tier backtest (§7); must clear deflated Sharpe > 0 and PBO < ~0.5 on Tier-2 synthetic; stress vs Feb-2018 (+20 VIX pts/1 day), Mar-2020 (−34% SPX, VIX 82), 2022 grind. Report conditional crash loss with vs without S5.
S5 — Tail-Hedge Overlay (MANDATORY co-requisite, not optional)
Rationale & persistence. Short vol without a hedge is picking up pennies in front of a steamroller; the indices show −33% to −51% drawdowns are on the table. Buying protection bleeds (Israelov "Pathetic Protection"; Ilmanen 2012), so it must be financed and budgeted. The overlay converts the sleeve's payoff from "naked short put" to "short put spread" at the basket level — capped, convex left tail.
Construction. - Long 10–20Δ index puts (SPY primary; QQQ/IWM secondary), laddered across 1–3 months, rolled to maintain duration. - Optional convexity kicker: long VIXY/UVXY calls (Alpaca can trade VIXY/UVXY options; note ETN decay) sized small. - Optionally structure as put debit spreads to cheapen carry when far-OTM tails are pricey. - Counter-cyclical sizing: buy more protection when it's cheap (low VIX, complacency, rich VRP funding) and ratchet strikes up as the carry book grows.
Data & Alpaca feasibility. ✅ Long options = Level 1 (always allowed, no assignment risk on longs). VIXY/UVXY options supported (equity ETPs).
Entry/exit/roll/assignment. Always-on (never fully off). Roll at ~21 DTE or when delta drifts; take profit by monetizing on spikes (sell into backwardation, redeploy lower). No assignment risk (we're long). Long legs near expiry → DNE/let-expire via API.
Sizing & tail budget. Hard budget: spend ≤ 20–30% of S1–S3 net premium, capped at ~0.5–1.0%/yr of NAV (mirror the existing tail_hedge_pm monthly_budget_pct=0.005). Target: in a −20% basket gap, the overlay offsets ≥ ~50–70% of the carry book's loss.
Expected performance. Standalone negative carry (it's insurance). Judged on sleeve-level Calmar and conditional crash P&L, not its own Sharpe. The right metric: "how much of the 2018/2020 loss does it neutralize per $ of annual bleed."
Correlation. Strongly negative to S1–S3 in drawdowns (the diversifier); near-zero/slightly negative carry otherwise.
Failure modes & decay. Bleed too large (over-hedging) → kills sleeve Sharpe; basis risk (ETF puts vs the basket); VIXY decay; a slow grind with no spike (2022) where puts expire worthless but the carry book also struggles. Mitigant: budget cap + counter-cyclical sizing + prefer put spreads.
OOS validation & stress. Always test S1/S2/S3 net of S5. Stress must show the overlay caps the left tail to the budgeted figure in 2018/2020.
S3 — Iron Condor / Defined-Risk Strangle Engine
Rationale & persistence. Same VRP, but assignment-light and capital-efficient, and it fits Alpaca's MLEG covered-only rule perfectly (all four legs covered). Sells both wings → harvests put and call VRP; market-neutral-ish (low net delta at inception) so it's a cleaner vol bet than S1.
Construction. Short ~16Δ put + short ~16Δ call; long wings ~8–10Δ (or fixed width 3–6% of spot). 30–45 DTE. Symmetric or put-skew-aware (equity skew → put side richer; consider asymmetric deltas). One MLEG order.
Data & Alpaca feasibility. ✅ Level 3 MLEG, fully covered → accepted. Best vehicle where we don't want shares (IWM, QQQ, SLV). Roll = close condor (one MLEG, all covered) then open new (separate) — closing is fine as one order; opening the new one is a separate MLEG.
Entry/exit/roll/assignment. Entry: VRP rich + range-bound regime (low trend, contango). Exit: 50% max profit / 21 DTE; if one side tested, roll the untested side toward spot or close. Assignment risk low (defined risk; only matters if a short goes deep ITM near expiry — close before).
Sizing & tail budget. Max loss per condor = (width − credit)×100 → size contracts so aggregate max loss ≤ sleeve budget. Naturally defined-risk; still counts toward net vega/gamma caps. S5 still required for correlated multi-name gap.
Expected performance. Net Sharpe ~0.4–0.7; lower premium than naked put-write but lower tail and no assignment cash drag → better Calmar. Turnover similar to S1 (4 legs/cycle → high leg count, watch slippage). Capacity high (SPY/QQQ/IWM).
Correlation. ~0.6–0.9 to S1/S2 (shared short-vega); lower net delta than S1 (more neutral).
Failure modes & decay. Both-sides-blown in a huge move; whipsaw rolling in choppy trends; 4-leg slippage; condor crowding. Mitigant: wider wings in high-VVIX, fewer adjustments, leg-into condors only via single MLEG (never naked).
OOS validation & stress. As S1; condors specifically stressed on trend scenarios (2022 grind both directions) and single-shock (2020).
S2 — Risk-Managed Covered-Call Overwrite
Rationale & persistence. Monetizes VRP on the existing long ETF book (the repo holds GLD/SLV/PM ETFs). Israelov & Nielsen: the short-vol piece has Sharpe ~1.0; delta-manage to strip the uncompensated equity-timing bet → higher Sharpe, lower downside beta. GLD/SLV pay no dividend → minimal early-call-assignment risk (a real edge for overwriting vs SPY).
Construction. Against each 100-sh lot held: sell ~20–30Δ call, 30–45 DTE. Partial overwrite (e.g., 50–75% of holdings) to retain upside. Risk-managed variant: trade the underlying to hold net delta in a band (the Israelov delta-hedge), v1 can approximate with a fixed overwrite ratio + weekly delta rebalance.
Data & Alpaca feasibility. ✅ Level 2 covered call (must own shares — enforced by Alpaca). Single-leg short call, covered → allowed. Roll = BTC + STO (two orders).
Entry/exit/roll/assignment. Entry: IV percentile elevated, holding present, no near-term ex-div (for dividend ETFs). Exit: 50%/21 DTE; roll up-and-out if tested and you want to keep shares; accept assignment (shares called away at profit) when you're happy to sell. Avoid ITM through ex-div on SPY/QQQ/IWM/TLT.
Sizing & tail budget. Bounded by shares held × overwrite ratio. Caps upside (the 2020 lesson: covered call lagged badly in the V-recovery) → keep ratio <100% and strikes further OTM in low-vol. S5 still hedges the long-equity downside.
Expected performance. Net Sharpe ~0.4–0.7 on the overlay; main benefit is income + variance reduction on an existing position (BXM-like: lower vol, lower DD, caps upside). Turnover monthly. Capacity = size of the long book.
Correlation. Adds short-vol to an already-long book → reduces book vol; correlated to S1/S3 via short-vega; the upside cap is the cost.
Failure modes & decay. Sharp rallies cap gains (opportunity cost, 2020); ex-div assignment; overwriting into a melt-up. Mitigant: partial ratio, delta management, skip overwrite when momentum strongly positive (the existing CoveredCallWriter already gates on IV percentile — add a trend gate).
OOS validation & stress. Compare overwritten vs un-overwritten book; stress the upside scenario (2020/2021 melt-up) for opportunity cost, not just crashes.
S4 — Term-Structure Regime Gate (+ optional SPY calendar)
Rationale & persistence. VIX term structure shape is a robust regime signal: contango = calm = harvest; backwardation = stress = stand down. Roll-down carry exists but Sharpe is modest (~0.5) with violent backwardation spikes — so use it primarily to modulate S1–S3 gross and S5 funding, not as a standalone return engine (and Alpaca can't trade VIX futures/SPX anyway).
Construction.
- Gate (primary, ship first): compute VIX–VIX3M (or vix_front/vix_back already consumed by vol_risk_premium_pm/vol_term_structure_pm) slope + VVIX. Map to a gross-exposure multiplier for S1–S3 (1.0 in steep contango → 0.0 in backwardation) and a hedge-funding multiplier for S5.
- Optional small alpha: SPY calendar spread (sell front, buy back) to harvest term premium when the curve is steep — defined-ish risk, Level 3.
Data & Alpaca feasibility. ✅ Gate uses FRED VIXCLS + a VIX3M/VIX9D series (already FRED-accessible) — no options needed. Calendar = Level 3 MLEG (note: a long calendar has a covered structure; rolling it hits the uncovered-short MLEG rule → manage as separate orders).
Entry/exit. Gate recomputed daily; calendars entered only in steep contango, closed on flattening.
Sizing & tail budget. The gate is the sizing throttle; calendar (if used) sized tiny (≤0.5% NAV risk).
Expected performance. As a gate, it doesn't have a standalone Sharpe — it adds ~0.1–0.2 to the sleeve Sharpe and materially cuts drawdown by de-risking before/into stress. Calendar alpha is small and optional.
Correlation. It's a meta-controller; reduces sleeve crash beta.
Failure modes & decay. Whipsaw (curve flips intraday around events); lag (daily signal misses fast shocks — S5 covers that gap); over-fitting the slope thresholds (keep them coarse, validate OOS).
OOS validation & stress. Ablation: run S1–S3 with vs without the gate; the gate must improve OOS Calmar and reduce 2018/2020 conditional loss to justify itself.
7. Backtesting options P&L — the headline feasibility problem and the fix
7.1 The problem (be blunt)
Alpaca historical option prices begin Feb 2024. The mandated stress windows — 2018 volmageddon, 2020 COVID, 2022 bear — predate that. The current engine (engine.py) only multiplies underlying ret_1d × weight, which cannot represent option theta, convexity, vega, or premium. So neither real data nor the current engine can validate this sleeve over the periods that matter. This is the gating risk for the whole spec.
7.2 The fix — a 3-tier backtest, cross-validated
Build returns from three independent methods and require them to agree where they overlap.
Tier 1 — Published-index replication (ground truth, 1986/2006→present). Use CBOE PUT, WPUT, BXM, and (where available) PUTW / CNDR / 5%-OTM PutWrite total-return histories as the benchmark and sanity anchor for the SPY index VRP sleeve. These are computed by CBOE off real SPX option settlement, so they encode true VRP, true drawdowns, and true 2018/2020/2022 behavior. Our SPY-based S1/S2/S3 should track these in shape (allowing for ETF-vs-index basis, delta/DTE choices). If our synthetic engine can't reproduce the published indices, it's wrong.
Tier 2 — Synthetic BSM repricing over a vol surface (workhorse, ~2006/2010→present).
The tractable, defensible core. Each day:
1. Choose legs by target delta/DTE from a modeled IV surface, not a real chain.
2. Build the surface from observable inputs:
- Level: an implied-vol anchor — VIX/VIX9D/VIX3M for SPY/QQQ/IWM, GVZ for GLD, VXSLV for SLV (all already FRED-wired in qgtm_data/options.py), TLT via TYVIX/realized proxy. Where no vol index exists, use forecast RV × (1 + VRP wedge), the same RV×~1.2 proxy the repo already uses, but with a time-varying wedge calibrated to Tier-1.
- Term structure: interpolate the level across DTE using the VIX9D/VIX/VIX3M points (contango/backwardation captured directly).
- Skew: parameterize a put-skew (e.g., SVI-lite or a linear-in-log-moneyness slope) calibrated so 25Δ/10Δ put prices match Tier-1 index economics; refit slope to VVIX (skew steepens with VVIX).
3. Price & greeks via Black–Scholes–Merton (American adjustment small for short-dated equity options; use Barone-Adesi-Whaley if precision needed for deep-ITM/ex-div).
4. Daily mark-to-market by repricing each held leg with updated S (real underlying close from Alpaca equity bars, which do go back far), τ, and surface; theta accrues as τ decays; vega P&L from surface moves; gamma P&L from S moves. Net the premium received at entry.
5. Model assignment (ITM at expiry → share conversion + gap), rolls (BTC+STO with modeled slippage), and the MLEG/roll double-slippage explicitly.
6. Costs: per-contract spread (modeled as f(VIX, moneyness, DTE) — wider in stress), commissions (Alpaca options are commission-free but there are exchange/ORF/clearing fees ~$0.03–0.65/contract — include them), and slippage. This is where retail option frictions live; do not omit.
Validation of the synthetic engine: Variance-swap identity check. A delta-hedged short-vol position's P&L ≈ Σ [IV²_entry − RV²_realized] (scaled). Tier-2's delta-hedged S1 must reproduce this and Tier-1's index returns within tolerance before we trust it on 2018/2020.
Tier 3 — Real Alpaca option bars (live-fidelity, Feb 2024→present). Run S1–S5 on actual historical option bars for the only window Alpaca provides. Measure tracking error of Tier-2 synthetic vs Tier-3 real over 2024–2026. If they agree (target: leg-level mark error within a few %, sleeve daily-return correlation > ~0.9), we can trust Tier-2 on the pre-2024 stress windows. If they diverge, recalibrate the surface/skew/cost model until they don't.
7.3 Engine integration
- New
OptionsBacktestEngineproduces a daily net-return vector, then reuses the existing_compute_metrics,run_walk_forward,run_purged_kfold,deflated_sharpe_ratio, and PBO unchanged. - Keep PIT discipline (the current engine's "signal at close(t−1) applied to t" convention) — the surface and chain selection at t−1 must use only data ≤ t−1.
- Report path-dependent stats options care about: skew/kurtosis of daily returns (already in
WalkForwardResult), conditional drawdown, and CVaR (the risk layer has acvar_limit_95).
7.4 Proxy-only fast path (for fast research iteration)
For quick screening before full repricing: model the short-vol sleeve as a short variance swap — daily P&L ≈ vega-notional × (IV²_entry − RV²_t)/(2·IV_entry) with a gap/jump term. Cheap, captures the carry and most of the crash, misses fine path dependence (pin/assignment). Use for parameter sweeps; confirm survivors on Tier-2/3.
8. Sizing, tail budget, and Greeks risk limits
8.1 Two-constraint sizing (notional AND tail)
Size min(notional cap, tail-budget cap):
- Notional cap: Σ short-put strike notional ≤ X% of NAV (cash-secured discipline even for spreads); per-underlying ≤ RiskLimits.effective_cap_for(symbol).
- Tail-budget cap (binding one): contracts chosen so a defined adverse scenario costs ≤ a per-trade fraction of NAV:
- Mode B / condor: max loss = (width − credit)×100×n.
- Mode A CSP: scenario loss = (short_strike − stop_or_−kσ)×100×n.
- Aggregate sleeve: a basket gap scenario (e.g., −10% one-day correlated move with vol doubling) must cost ≤ the sleeve's CVaR budget after S5 offset.
8.2 Greeks budget (portfolio-level, new risk checks)
| Greek | Limit (illustrative, calibrate in paper) | Why |
|---|---|---|
| Net delta | within ±[band] of target (≈ market-neutral-ish or a small long) | strip the uncompensated equity-timing bet (Israelov) |
| Net vega | short, capped at V% of NAV per 1 vol pt | bound vol-spike loss |
| Net gamma / short-gamma notional | hard cap | bound convexity loss into a gap |
| Theta | positive target (the carry) | confirms we're paid to wait |
| Tail $-risk after S5 | ≤ sleeve CVaR budget | the floor must bind |
8.3 Tail budget mechanics
- S5 spend ≤ 20–30% of net premium collected by S1–S3, hard-capped at 0.5–1.0%/yr NAV (reuse
tail_hedge_pm.monthly_budget_pctpattern and its VRP-funding gate). - If VRP funding turns negative (carry book bleeding), reduce short-vol gross first, keep the hedge (the existing tail strategy already scales hedge by
vrp_funding).
9. Out-of-sample validation & stress-testing plan
9.1 Validation protocol (reuse existing harness)
- Purged k-fold + embargo (
run_purged_kfold) and walk-forward (run_walk_forward) on the Tier-2 synthetic daily returns (longest history). Report deflated Sharpe and PBO — pre-registern_trialshonestly (count every parameter variant tried) so DSR isn't gamed. - Tier-3 real-data confirmation (Feb 2024+): the live-fidelity check; sleeve must be profitable and track Tier-2.
- Tier-1 anchor: SPY sleeve shape vs CBOE PUT/BXM/WPUT.
- Ablations (each must earn its place): with/without S5; with/without S4 gate; CSP vs spread; delta-managed vs naive; 16Δ vs 25Δ; 30 vs 45 DTE; 50%/21DTE vs hold-to-expiry.
- Paper-trade ≥ 1–2 quarters before any live capital; compare paper fills to Tier-3 modeled fills (slippage reality check).
9.2 Mandated stress scenarios (run on every short-vol leg, net of S5)
| Scenario | Shock | What to prove |
|---|---|---|
| Feb 2018 "Volmageddon" | VIX ~17→37 in a day (+~20 pts), XIV blowup, −10% SPX/2wk | short puts/strangles gap; S5 caps loss to budget; condor wings hold |
| Mar 2020 COVID | SPX −34% peak-trough, VIX→82, backwardation | worst case; S4 should have de-risked; S5 should offset ≥50–70% of carry loss; assignment cascade handled |
| 2022 grind bear | SPX −18% slow, vol elevated not spiking | carry should outperform (PUT/BXM beat SPX in 2022); S5 bleeds (acceptable, budgeted) |
| 2020/2021 melt-up | sharp V-recovery + rally | S2 upside cap / S1 missed-upside opportunity cost quantified (the honest downside of income strategies) |
| Liquidity stress | spreads 3–5× wider, fills at worse marks | cost model robustness; rolls don't compound losses |
9.3 Acceptance gates (pre-commit)
- Tier-2 OOS deflated Sharpe > 0 and PBO < ~0.5.
- Conditional 2018/2020 loss (net of S5) ≤ tail budget.
- Tier-2 vs Tier-3 daily-return correlation > ~0.9 (else recalibrate surface/costs, do not ship).
- Sleeve Calmar > buy-and-hold of the underlying basket over the full sample.
10. Correlation to other sleeves (portfolio fit)
- Within the VRP sleeve: S1/S2/S3 are ~0.6–0.9 correlated (shared short-vega/long-delta); S5 is strongly negative in tails; S4 is a controller. Net them at the Greeks level, not the strategy level.
- vs existing gold/PM book (the bulk of
qgtm_strategies/): SPY/QQQ/IWM VRP adds equity beta the gold book lacks → diversifying in calm regimes, but converging toward +1 in a 2020-style everything-selloff. GLD/SLV VRP (S1/S3 on metals) has idiosyncratic vol drivers → genuinely diversifying (the cross-asset VRP point, §1.2), and reuses GVZ/VXSLV already in the repo. - vs
tail_hedge_pm: S5 overlaps it — unify them (one tail-budget book funded by total sleeve premium) rather than running two competing hedge programs. - vs intraday/scalper book: near-orthogonal (different horizon); watch only aggregate net delta/vega at the portfolio risk layer.
- Factor view: declare
FactorExposure(volatility=-0.6, market=+0.2…+0.4, carry=+0.4)for the income core andvolatility=+0.9, market=-0.5for S5 (matching the existingvol_risk_premium_pm/tail_hedge_pmconventions) so the portfolio optimizer nets vol exposure correctly.
11. Prioritized build roadmap
Phase 0 — Plumbing (unblocks everything).
Types (OptionLeg, OrderClass, extend Order/Position); AlpacaBroker.submit_options_order + assignment polling; OMS process_option_signal (delta/DTE chain selection, contract sizing); risk Greeks caps. Paper-only. Acceptance: can place/close a SPY put credit spread and an iron condor on paper, detect assignment.
Phase 1 — Backtest engine (unblocks validation).
OptionsBacktestEngine with BSM repricer + synthetic surface (Tier-2), Tier-1 index anchors, Tier-3 real-bar loader; reuse DSR/PBO/CV. Acceptance: reproduce CBOE PUT/BXM shape; Tier-2↔Tier-3 corr > 0.9.
Phase 2 — Ship S1 + S5 as a unit. Cash-secured/spread put-write + financed tail overlay + S4 gate. Validate per §9, paper ≥1 quarter.
Phase 3 — Add S3 (iron condor) for assignment-light capacity; Phase 4 — Add S2 (risk-managed overwrite) on the existing long book; Phase 5 — Optional S4 calendar alpha.
Phase 6 — Live (small). Apply for live options levels; start at a fraction of paper size; compare live fills to Tier-3.
12. Failure modes, decay, and kill-criteria
Structural risks.
- Naked-short-vol blowup — mitigated by mandatory S5 + defined-risk default in stress. Never run a short leg without the basket floor live.
- Assignment surprises (American/physical) — poll OPASG/OPEXP; close/roll ITM shorts pre-expiry; avoid ITM short calls through ex-div (SPY/QQQ/IWM/TLT). GLD/SLV (no dividend) preferred for overwriting.
- Roll leg-risk (MLEG covered-only forces close-then-open) — model the double slippage; cap roll frequency; use limit legs.
- Data feasibility — pre-2024 validation rests on the synthetic engine; its credibility = Tier-1 anchor + Tier-3 tracking. If Tier-2↔Tier-3 won't agree, do not trust the historical backtest and size down accordingly.
- OPRA cost — greeks/IV quality for live needs Algo Trader Plus, or we compute greeks ourselves (we have the BSM pricer). Budget it.
Decay (assume it). VRP is compressing (Chicago Fed 2025). Wire DecayMetrics; pre-register in_sample_sharpe; auto-quarantine when 6m/12m Sharpe < 50% of IS (machinery exists). Watch for: shrinking IV−RV spread, falling win rate at fixed delta, rising roll slippage.
Kill-criteria (pre-commit, before going live and continuously):
1. Tier-2 OOS deflated Sharpe ≤ 0 or PBO ≥ ~0.5 → don't ship / pull.
2. Conditional 2018/2020 net loss > tail budget → re-architect S5, don't ship.
3. Live slippage > ~1.5× modeled for a month → halt, recalibrate.
4. Realized net Sharpe < ~0.2 over two rolling quarters with hedge on → quarantine.
5. Any unhedged-short-vol exposure detected (S5 down while shorts on) → kill switch (emergency_flatten exists).
Appendix A — Key sources
- Carr & Wu (2009), Variance Risk Premiums, RFS. · Bakshi & Kapadia (2003). · Bollerslev, Tauchen & Zhou (2009).
- Berkin & Swedroe / Alpha Architect, "The Variance Risk Premium is Pervasive."
- Federal Reserve Bank of Chicago, WP 2025-17, "The Decline of the Variance Risk Premium: Evidence from Traded and Synthetic Options." (the honesty anchor)
- Bondarenko / CBOE, Historical Performance of Put-Writing Strategies (SSRN 3393940); CFA Institute, "Option-Based Strategies: Opt In or Opt Out?" (2019); CBOE BXM/PUT/WPUT factsheets & methodology.
- Israelov & Nielsen (2015), Covered Calls Uncovered, FAJ 71(6) (AQR) — covered-call decomposition & risk-managed variant.
- Israelov, "Pathetic Protection / Still Not Cheap"; Ilmanen (2012), "Do Financial Markets Reward Buying or Selling Insurance?"; Bhansali (2014), Tail Risk Hedging; Taleb (2010).
- Avellaneda & Papanicolaou (SSRN 3028910), Statistics of VIX Futures… (term-structure/roll-yield).
- Alpaca docs: Options Trading, Options Trading Overview, Options Level 3, Historical Option Data;
alpacahq/alpaca-pyoptions examples.
Appendix B — Alpaca facts cheat-sheet (for implementers)
- ETF/equity options only; American/physical; no SPX/XSP/NDX.
- Paper auto-Level-3; live needs application. L1 buy; L2 covered call + CSP; L3 MLEG spreads.
- MLEG must be fully covered in-order; naked-short MLEG rejected; rolls = close then open (2 orders); single-leg short put = CSP (L2), single-leg short call must be covered.
- Historical option data since Feb 2024; Indicative feed free (15-min delayed), OPRA paid.
- Assignment/exercise via NTA polling (
/v2/account/activities, typesOPASG/OPEXP/OPEXC), not WebSocket; exercise/DNE via API. - Repo already has:
qgtm_data/options.py(chain + greeks snapshots + FRED GVZ/VXSLV/VIX), and the full validation harness inqgtm_backtest/engine.py.
Appendix C — OCC symbol format (chain selection)
<ROOT><YYMMDD><C|P><STRIKE×1000, 8 digits> — e.g. SPY260320P00540000 = SPY put, exp 2026-03-20, strike $540.000. The OMS resolves these from the live chain by nearest target delta and nearest DTE within tolerance; never hard-code strikes.