put_carry
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-22, from can-german-retail-investors-short-stocks.
| expiry_bucket | premium_pct_of_spot | daily_decay_pct_of_premium |
|---|---|---|
| 0-7 days | 1.21 | 27.23 |
| 8-30 days | 2.2 | 3.39 |
| 31-60 days | 3.21 | 1.19 |
| 61-120 days | 4.57 | 0.51 |
| 121+ days | 8.37 | 0.15 |
- Rows × columns
- 5 × 3
- 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 |
|---|---|---|---|
expiry_bucket |
text | 5 distinct values (0-7 days, 121+ days, 31-60 days…) | |
premium_pct_of_spot |
number | 1.21 to 8.37 | percent |
daily_decay_pct_of_premium |
number | 0.15 to 27.23 | percent |
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.
SELECT
multiIf(days_to_expiry <= 7, '0-7 days',
days_to_expiry <= 30, '8-30 days',
days_to_expiry <= 60, '31-60 days',
days_to_expiry <= 120, '61-120 days',
'121+ days') AS expiry_bucket,
round(avg(toFloat64(option_close) / toFloat64(underlying_close)) * 100, 2) AS premium_pct_of_spot,
round(avg(-theta / toFloat64(option_close)) * 100, 2) AS daily_decay_pct_of_premium
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND lower(toString(option_type)) LIKE 'p%'
AND iv_converged = 1
AND volume > 0
AND theta < 0
AND toFloat64(option_close) >= 0.10
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.02
AND date >= '2025-07-01'
AND date <= '2025-09-30'
GROUP BY expiry_bucket
ORDER BY min(days_to_expiry)