market-analysis
S-C C1 iron butterfly
Single-name variance premium, earnings-free
What it is
Sells iron butterflies about four weeks out on up to ten stocks a week, chosen from liquid $1B to $20B companies whose next earnings come after the expiry: the at-the-money call and put sold, and a call and a put about two standard deviations away bought to cap the loss. Fewer than ten usually qualify (five in its first week) and some weeks none do. It is S-C's defined-risk launch candidate; S-C's short straddle sells the same stocks without wings. C1 takes every sector; C2 removes the stocks the screener labels Technology before picking its ten. C1 and C2 hold the same position whenever both pick a stock, so their records overlap and should not be added together. Every selection is recorded, graded and counted toward the read, including any the book's caps would leave out.
The rule
- Universe: the options data's end-of-day stock screener: common stock or ADRs closing at $10 or more, with a market cap of $1B to $20B, a 20-session average dollar volume (close times volume, from public daily bars) of at least $50M, a 30-day implied volatility of 30% to 80%, and a next earnings date that is known and after the expiry.
- Expiry: of the expiries that traded that day, the one 20 to 40 calendar days out nearest 28.
- At the money: the strike nearest the close, within 2.5% of it, whose call and put each printed at least 5 contracts from 15:00 to 16:00 ET; both legs' quoted spreads at their prints from 15:00, averaged by size, at most 8% of the quote's midpoint, a leg with no quote failing.
- Selection: the ten names that pass with the lowest mean at-the-money spread, from every sector.
- Entry: the last session of the week; the call and put sold at their average traded price from 15:00 to 16:00 ET.
- Wings: a call bought at S + 2σ and a put at S − 2σ, each at the nearest strike on the expiry's grid, which need not have traded, with S the close and σ = S × the 30-day implied volatility × √(days to expiry/365). A wing is priced at its average traded price from 15:00 to 16:00 ET if at least 5 contracts traded then, at the quote's midpoint at its last print in that window if fewer did, and otherwise by Black-Scholes from the close and the 30-day implied volatility, adjusted for the contract's own implied volatility when it traded in the five sessions before. A stock whose wings would not fall on either side of the sold strike gets no iron butterfly that week.
- Size: as many contracts as keep the max loss, the wider wing's width less the credit, within 0.5% of $100,000, but at least one, so a stock whose one contract risks more is still entered at one contract (two of the five on 2026-10-02 risked $917 and $1,933); the return is measured on the max loss.
- Caps: in selection order, at most 10 new a week, 20 open and 4 open per sector in this book, and, while S-B's champion holds a position, open risk of at most $4,000. Only positions inside the caps count toward them. A selection outside them is still recorded, graded and counted toward the read, marked so.
- Exit: held to expiry and settled at intrinsic value against the official close (or the stock's price at that day's last option print if the close is missing); a split during the hold is adjusted for, and a stock that stops trading settles at its last close. Early assignment and dividends are not modelled.
| Name | Value | Unit | Where it lives | Pinned by |
|---|---|---|---|---|
| price_min | 10 | USD, the entry session's close | engine/config.py:243 | tests/test_sc_frozen_params.py:25 |
| mcap_min | 1000000000 | USD of market cap | engine/config.py:244 | tests/test_sc_frozen_params.py:25 |
| mcap_max | 20000000000 | USD of market cap | engine/config.py:245 | tests/test_sc_frozen_params.py:25 |
| adv_min | 50000000 | USD a day, 20-session average dollar volume | engine/config.py:246 | tests/test_sc_frozen_params.py:25 |
| ADV_WINDOW_SESSIONS | 20 | sessions in the average dollar volume | engine/strategies/sc_data.py:17 | — |
| iv30d_min | 0.3 | 30-day implied volatility, annualized, as a fraction | engine/config.py:247 | tests/test_sc_frozen_params.py:25 |
| iv30d_max | 0.8 | 30-day implied volatility, annualized, as a fraction | engine/config.py:248 | tests/test_sc_frozen_params.py:25 |
| dte_cal_min | 20 | calendar days | engine/config.py:249 | tests/test_sc_frozen_params.py:25 |
| dte_cal_max | 40 | calendar days | engine/config.py:250 | tests/test_sc_frozen_params.py:25 |
| target_dte_cal | 28 | calendar days | engine/config.py:251 | tests/test_sc_frozen_params.py:25 |
| atm_band | 0.025 | of the close | engine/config.py:252 | tests/test_sc_frozen_params.py:25 |
| leg_size_min | 5 | contracts printed from 15:00, each leg | engine/config.py:253 | tests/test_sc_frozen_params.py:25 |
| spread_max | 0.08 | of the quote's midpoint, each leg | engine/config.py:254 | tests/test_sc_frozen_params.py:25 |
| select_n | 10 | names a week | engine/config.py:255 | tests/test_sc_frozen_params.py:25 |
| wing_sigma | 2 | σ, the wings' distance from S | engine/config.py:257 | tests/test_sc_frozen_params.py:25 |
| equity | 100000 | USD | engine/config.py:264 | tests/test_sc_frozen_params.py:25 |
| ib_max_loss_frac | 0.005 | of equity | engine/config.py:265 | tests/test_sc_frozen_params.py:25 |
| max_new_per_week | 10 | new positions a week in this book | engine/config.py:267 | tests/test_sc_frozen_params.py:25 |
| max_open_per_variant | 20 | positions open in this book | engine/config.py:268 | tests/test_sc_frozen_params.py:25 |
| max_open_per_sector | 4 | positions open per sector in this book | engine/config.py:269 | tests/test_sc_frozen_params.py:25 |
| book_budget_frac | 0.4 | of the risk of 20 positions at 0.5% of equity each, so $4,000, while S-B's champion holds a position | engine/config.py:270 | tests/test_sc_frozen_params.py:25 |
| LATE_START | 15:00:00 | ET, the late window's start; it runs to the close | engine/config.py:42 | tests/test_frozen_params.py:39 |
| COMMISSION_PER_CONTRACT | 0.65 | USD a contract, each leg | engine/config.py:55 | tests/test_frozen_params.py:39 |
| TIER1_MIN_SIZE | 5 | contracts printed from 15:00 for a wing to be priced at its average traded price | engine/config.py:50 | tests/test_frozen_params.py:39 |
| MODEL_IV_LOOKBACK | 5 | sessions back for a model-priced wing's own implied volatility | engine/config.py:52 | tests/test_frozen_params.py:39 |
| MODEL_SPREAD_LOOKBACK | 20 | sessions of the stock's option spreads behind a model-priced wing's spread | engine/config.py:53 | tests/test_frozen_params.py:39 |
| MODEL_SPREAD_FLOOR | 0.05 | a model-priced wing's least spread | engine/config.py:51 | tests/test_frozen_params.py:39 |
| SPLIT_TOL | 0.05 | gap between the screener's and the daily bars' entry close read as a split | engine/strategies/sc.py:38 | tests/test_sc_frozen_params.py:39 |
| SC_READ_MIN_WEEKS | 40 | entry weeks with graded positions before the read | engine/config.py:286 | tests/test_sc_frozen_params.py:32 |
Its read
Record so far
Cost model
half of each leg's spread plus $0.65 a contract at entry, the spread quoted from 15:00 to 16:00 ET or, for a wing priced by model, the stock's median option spread over the 20 sessions before, at least 5%; nothing at expiry
Trades
6 trades
| Opened | Closed | Account | Symbol | Side | Size | Entry | Exit | P&L | Net P&L | Return | Held | Exit by | Status | Record |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Oct 9, 2026 | — | MA | OKLO | short | 1 | 4.652923 | — | — | — | — | — | — | open | GitHub ledger (1) |
| Oct 2, 2026 | — | MA | CRCL | short | 1 | 10.671829 | — | — | — | — | — | — | open | GitHub ledger (1) |
| Oct 2, 2026 | — | MA | MARA | short | 1 | 1.826553 | — | — | — | — | — | — | open | GitHub ledger (1) |
| Oct 2, 2026 | — | MA | OKLO | short | 1 | 4.825618 | — | — | — | — | — | — | open | GitHub ledger (1) |
| Oct 2, 2026 | — | MA | QBTS | short | 1 | 2.088474 | — | — | — | — | — | — | open | GitHub ledger (1) |
| Oct 2, 2026 | — | MA | WULF | short | 1 | 2.462839 | — | — | — | — | — | — | open | GitHub ledger (1) |
- (1) Record GitHub ledger
Cost model
half of each leg's spread plus $0.65 a contract at entry, the spread quoted from 15:00 to 16:00 ET or, for a wing priced by model, the stock's median option spread over the 20 sessions before, at least 5%; nothing at expiry
Where the research is
- market-analysis
- S-C's specification (findings market-analysis/DESIGN/90)