Ewan Li

S-B SPY iron condor

Index volatility premium with a VIX gate

paperaccountMAbookSPY-ICstartedSep 11, 2026

What it is

Sells a SPY iron condor about three weeks out, once a week, when the volatility gate is on: a put credit spread below the price and a call credit spread above it, on one expiry. This is the champion book, the rule as frozen before any result; its exploration twin ignores the gate. The iron condor was S-B's secondary structure, and after the first backtest, on 2026-09-05, it was retired as a candidate to trade on that backtest's sample; it is still entered on paper and reported at the read. Its record starts on 2026-09-11, but its first position was entered on 2026-09-25: on 09-11 no call within the long call's band had printed at least 5 contracts from 15:00, and on 09-18 the gate was off. SPY's long call is often too thin to qualify: in the 103 sessions from March to early September 2026 that S-B's specification measured, it had a qualifying print on 71% of them, so this book misses some weeks even with the gate on.

The rule

  • Gate: VIX3M above VIX (G1) and VIX above its median of the 20 sessions before (G2), both on the prior close; a missing value means no entry.
  • Entry: the last session of the week, each leg priced at its average traded price from 15:00 to 16:00 ET; of the expiries that traded that day, the Friday one (the Thursday before a Friday holiday) nearest 21 calendar days out, between 7 and 30.
  • Strikes: short put at S(1 − m), long put at S(1 − 2m), short call at S(1 + m), long call at S(1 + 2m), with S SPY's price at the day's last option print and m = VIX/100 × √(DTE/365), DTE the calendar days to expiry and VIX at that day's close; each the strike nearest its target, within 0.25m × S of it, that printed at least 5 contracts from 15:00. If a leg has no such strike in that expiry, there is no entry that week. S and m are taken at the end of the day, up to an hour after the prices the legs are entered at; S-B's specification accepts this gap.
  • Spread: each short leg's quoted spread at its prints from 15:00, averaged by size, at most 10% of the quote's midpoint; otherwise, or with no quote, no entry that week. The long legs' spreads are charged, not filtered.
  • Size: max loss per contract is the wider side's width less the credit. As many contracts as keep the max loss within 3% of $100,000, but never fewer than one, so one contract can risk more; at most 3 open.
  • Exit: held to expiry and settled at intrinsic value against the official close (or SPY's price at that day's last option print if the close is missing). Early assignment and dividends are not modelled.
NameValueUnitWhere it livesPinned by
target_dte_cal21calendar daysengine/config.py:125tests/test_sb_frozen_params.py:31
dte_cal_min7calendar daysengine/config.py:126tests/test_sb_frozen_params.py:31
dte_cal_max30calendar daysengine/config.py:127tests/test_sb_frozen_params.py:31
short_sigma1m, the short legs' distance from Sengine/config.py:128tests/test_sb_frozen_params.py:31
wing_sigma2m, the long legs' distance from Sengine/config.py:129tests/test_sb_frozen_params.py:31
strike_band_sigma0.25m × S, the most a strike may sit from its targetengine/config.py:130tests/test_sb_frozen_params.py:31
leg_size_min5contracts printed from 15:00, each legengine/config.py:131tests/test_sb_frozen_params.py:31
short_spread_max0.1of the quote's midpoint, short legsengine/config.py:132tests/test_sb_frozen_params.py:31
median_window20sessionsengine/config.py:133tests/test_sb_frozen_params.py:31
equity100000USDengine/config.py:140tests/test_sb_frozen_params.py:31
max_loss_frac0.03of equityengine/config.py:141tests/test_sb_frozen_params.py:31
max_open_per_sleeve3open positionsengine/config.py:142tests/test_sb_frozen_params.py:31
LATE_START15:00:00ET, the late window's start; it runs to the closeengine/config.py:42tests/test_frozen_params.py:39
COMMISSION_PER_CONTRACT0.65USD a contract, each legengine/config.py:55tests/test_frozen_params.py:39
SB_SCALE_MIN_POSITIONS40graded paper positions before more than one contractengine/config.py:176tests/test_sb_frozen_params.py:47

Its read

What is read
S-B's read reports this book against the bar fixed before any result: a three-year backtest priced by model and one priced from real option prints since March 2026, on entries through 2026-11-06. The iron condor was retired as a candidate to trade on the first backtest's sample, on 2026-09-05, and is kept so the read reports it.
Read on
Dec 1, 2026
Trades needed
—
Trades logged
—
Hard stop
—
Shipped on
—
Deployed commit
5bf92f8

Record so far

Closed trades
0
Won
—
P&L
—
Net P&L
—
Closed without a P&L
—
Closed without a net P&L
—
Open
2
Record GitHub ledger
Cost model

half of each leg's quoted spread plus $0.65 a contract at entry; $0.65 a contract at expiry

Trades

2 trades

OpenedClosedAccountSymbolSideSizeEntryExitP&LNet P&LReturnHeldExit byStatusRecord
Oct 2, 2026—MASPYshort11.815827——————openGitHub ledger (1)
Sep 25, 2026—MASPYshort12.07017——————openGitHub ledger (1)
  1. (1)
    Record GitHub ledger
    Cost model

    half of each leg's quoted spread plus $0.65 a contract at entry; $0.65 a contract at expiry

Where the research is