candidates
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-28, from iron-condor-screener-from-the-free-sql-api.
| structure | short_deltas | net_credit | max_loss | credit_pct | expiry | as_of |
|---|---|---|---|---|---|---|
| 730/725 put + 795/800 call | -0.16 / 0.2 | 1.69 | 3.31 | 51.1 | Oct 30, 2026 | Sep 24, 2026 |
| 735/730 put + 795/800 call | -0.18 / 0.2 | 1.47 | 3.53 | 41.6 | Oct 30, 2026 | Sep 24, 2026 |
| 720/715 put + 795/800 call | -0.12 / 0.2 | 1.46 | 3.54 | 41.2 | Oct 30, 2026 | Sep 24, 2026 |
| 725/720 put + 795/800 call | -0.14 / 0.2 | 1.33 | 3.67 | 36.2 | Oct 30, 2026 | Sep 24, 2026 |
| 730/725 put + 800/805 call | -0.16 / 0.14 | 1.21 | 3.79 | 31.9 | Oct 30, 2026 | Sep 24, 2026 |
| 735/730 put + 800/805 call | -0.18 / 0.14 | 0.99 | 4.01 | 24.7 | Oct 30, 2026 | Sep 24, 2026 |
| 720/715 put + 800/805 call | -0.12 / 0.14 | 0.98 | 4.02 | 24.4 | Oct 30, 2026 | Sep 24, 2026 |
| 725/720 put + 800/805 call | -0.14 / 0.14 | 0.85 | 4.15 | 20.5 | Oct 30, 2026 | Sep 24, 2026 |
- Rows × columns
- 8 × 7
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
structure |
text | 8 distinct values | |
short_deltas |
text | 8 distinct values (-0.12 / 0.14, -0.12 / 0.2, -0.14 / 0.14…) | |
net_credit |
number | 0.85 to 1.69 | |
max_loss |
number | 3.31 to 4.15 | |
credit_pct |
number | 20.5 to 51.1 | percent |
expiry |
text | 1 distinct value (Oct 30, 2026) | |
as_of |
text | 1 distinct value (Sep 24, 2026) |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
) AS snapshot,
(
SELECT expiration_date
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = snapshot
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 25 AND 45
GROUP BY expiration_date
ORDER BY sum(volume) DESC
LIMIT 1
) AS target_expiry,
chain AS
(
SELECT
toFloat64(strike_price) AS k,
if(toFloat64(delta) < 0, 'put', 'call') AS side,
avg(toFloat64(option_close)) AS px,
avg(toFloat64(delta)) AS d
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = snapshot
AND expiration_date = target_expiry
AND iv_converged = 1
AND volume > 0
AND toFloat64(option_close) > 0
AND toUInt32(round(toFloat64(strike_price) * 100)) % 500 = 0
GROUP BY k, side
),
put_spreads AS
(
SELECT s.k AS short_k, l.k AS long_k, s.d AS short_delta, s.px - l.px AS credit
FROM chain AS s
CROSS JOIN chain AS l
WHERE s.side = 'put' AND l.side = 'put'
AND s.d BETWEEN -0.20 AND -0.12
AND abs(l.k - (s.k - 5)) < 0.01
),
call_spreads AS
(
SELECT s.k AS short_k, l.k AS long_k, s.d AS short_delta, s.px - l.px AS credit
FROM chain AS s
CROSS JOIN chain AS l
WHERE s.side = 'call' AND l.side = 'call'
AND s.d BETWEEN 0.12 AND 0.20
AND abs(l.k - (s.k + 5)) < 0.01
)
SELECT
concat(toString(toUInt32(p.short_k)), '/', toString(toUInt32(p.long_k)), ' put + ',
toString(toUInt32(c.short_k)), '/', toString(toUInt32(c.long_k)), ' call') AS structure,
concat(toString(round(p.short_delta, 2)), ' / ',
toString(round(c.short_delta, 2))) AS short_deltas,
round(p.credit + c.credit, 2) AS net_credit,
round(5 - (p.credit + c.credit), 2) AS max_loss,
round(100 * (p.credit + c.credit) / (5 - (p.credit + c.credit)), 1) AS credit_pct,
formatDateTime(target_expiry, '%b %e, %Y') AS expiry,
formatDateTime(snapshot, '%b %e, %Y') AS as_of
FROM put_spreads AS p
CROSS JOIN call_spreads AS c
WHERE p.credit + c.credit BETWEEN 0.05 AND 4.0
AND 100 * (p.credit + c.credit) / (5 - (p.credit + c.credit)) >= 20
ORDER BY credit_pct DESC
LIMIT 12
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.