Option Expiration Cycles: Wetin Dem Mean
Option expiration cycles decide which months go show for stock option chain. See how the three cycle groups work and why LEAPS dey land for January.
Option expiration cycles na listing rule wey decide which expiration months go appear for stock option chain. Every US stock wey get options dey assigned to one of three cycles when dem first list the options. That assignment, together with rule say at least four expiration months must dey available at all times, na wetin produce the row of dates wey you dey see for broker chain. The question here na which months go get listing. For the date wey option actually expire, see when options expire, and for this year’s dated list, see 2026 options expiration calendar.
Wetin be option expiration cycle?
When exchange first list options for one stock, e put that stock inside one of three expiration cycles. Each cycle na four months, and dem dey come every quarter:
- January cycle: January, April, July, October
- February cycle: February, May, August, November
- March cycle: March, June, September, December
Once dem set stock cycle, e no dey change for as long as the listing dey active. Na property of the listing, no be the company own. The cycle control the longer-dated monthly expirations, meaning contracts for the third Friday wey dey beyond the front of the chain. E no talk anything about the next few weeks; another rule dey cover that one.
Why every chain dey show at least four expiration months?
Listing standards set minimum. Optionable stock dey carry at least four expiration months anytime, and dem dey pick am for fixed order. The first two na near-term months: current month and the month wey follow am. The next two na the first two months for the stock own cycle wey near-term pair never already cover.
Make we work am through for stock wey dey on February cycle, during June. The near-term months na June and July. The next cycle months wey never claim na August and November, so the chain dey read June, July, August, November. Once June expiration pass, near-term pair become July and August, and the chain reach November and February. Near-term months dey roll every month. Cycle months dey move one step every three months.
Which expiration months are listed on a real chain?
Four na the minimum, and one heavily traded name fit get plenty pass am. The panel below list every expiration for Apple chain for the latest session wey dey on file, plus the number of contracts wey dey for each date.
| expiry date | expiration label | days out | contract count |
|---|---|---|---|
| 2026-09-04 | Sep 4, 2026 | 2 | 81 |
| 2026-09-09 | Sep 9, 2026 | 7 | 62 |
| 2026-09-11 | Sep 11, 2026 | 9 | 80 |
| 2026-09-14 | Sep 14, 2026 | 12 | 38 |
| 2026-09-16 | Sep 16, 2026 | 14 | 39 |
| 2026-09-18 | Sep 18, 2026 | 16 | 106 |
| 2026-09-25 | Sep 25, 2026 | 23 | 57 |
| 2026-10-02 | Oct 2, 2026 | 30 | 54 |
| 2026-10-09 | Oct 9, 2026 | 37 | 46 |
| 2026-10-16 | Oct 16, 2026 | 44 | 84 |
| 2026-11-20 | Nov 20, 2026 | 79 | 91 |
| 2026-12-18 | Dec 18, 2026 | 107 | 95 |
| 2027-01-15 | Jan 15, 2027 | 135 | 107 |
| 2027-02-19 | Feb 19, 2027 | 170 | 56 |
| 2027-03-19 | Mar 19, 2027 | 198 | 52 |
| 2027-04-16 | Apr 16, 2027 | 226 | 55 |
| 2027-06-17 | Jun 17, 2027 | 288 | 66 |
| 2027-09-17 | Sep 17, 2027 | 380 | 70 |
| 2027-12-17 | Dec 17, 2027 | 471 | 74 |
| 2028-01-21 | Jan 21, 2028 | 506 | 52 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= today() - 10
) AS chain_date
SELECT
toString(expiration_date) AS expiry_date,
formatDateTime(expiration_date, '%b %e, %Y') AS expiration_label,
toUInt32(max(days_to_expiry)) AS days_out,
countDistinct(ticker) AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = chain_date
AND expiration_date >= chain_date
GROUP BY expiration_date
ORDER BY expiration_dateNa 22 separate expiration dates dey for one underlying. The nearest one, Sep 4, 2026, dey 2 days ahead and get 81 contracts. The farthest one, Dec 15, 2028, dey 835 days out and get 57 contracts. Look the pattern between both ends: dates dey come weekly for the front, become roughly one per month through the middle of the year, then stretch reach the far-dated months for the right edge. Those contract counts show how many strikes dey exist for each date, no be how much open interest dey on them. That na the separate question behind the max pain strike.
Weeklies and dailies dey follow the cycle?
No. The cycle na only for monthly expirations, wey be the third Friday contracts. The rest of modern chain dey come from separate listing programs wey dey outside the cycle:
- Weekly options, wey dem list some weeks ahead and expire on Fridays wey no be the third Friday.
- End of month and quarter end series, wey dey tie to the last trading day of the month or quarter, instead of Friday.
- Daily options, wey get expiration for every trading day of the week. Dem dey available for short, specific list of very active underlyings. See which stocks get daily options for the list.
None of dem add any cycle month. Stock fit show ten weekly dates one after another for the front of its chain and still get ordinary four month cycle name behind dem. Two chains fit look completely different but still dey run with the same rules.
Put several underlyings side by side for the same session, and the difference go show as number of dates.
| symbol | listed expirations | expirations within 45d | months beyond 90d |
|---|---|---|---|
| SPY | 32 | 15 | 10 |
| AAPL | 22 | 10 | 11 |
| MSFT | 21 | 10 | 10 |
| KO | 17 | 7 | 9 |
| HRL | 11 | 7 | 4 |
| CLX | 6 | 2 | 4 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE date >= today() - 10
) AS chain_date
SELECT
underlying_symbol AS symbol,
countDistinct(expiration_date) AS listed_expirations,
countDistinctIf(expiration_date, days_to_expiry <= 45) AS expirations_within_45d,
countDistinctIf(toStartOfMonth(expiration_date), days_to_expiry > 90) AS months_beyond_90d
FROM global_markets.options_greeks
WHERE date = chain_date
AND expiration_date >= chain_date
AND underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'KO', 'CLX', 'HRL')
GROUP BY underlying_symbol
ORDER BY listed_expirations DESCAcross the 6 names for that panel, SPY get the widest lineup, with 32 listed expirations. 15 of dem dey inside 45 days. That dense front end dey come from daily and weekly listing program, no be from the cycle. CLX dey for the other end of the panel, with 6 listed dates altogether. After 90 days, the picture change: 10 different expiration months for the name with the widest lineup, compared with 4 for the narrowest one. Na for the front of the chain the lineups dey differ. The back na where the cycle dey show.
How I fit know which cycle stock dey follow?
No lookup table dey needed. Open the chain, skip the current month and the month after am, then find the first monthly expiration after those two months. That month, plus the month three months after am, na the stock’s cycle months.
You fit see the same pattern across the whole listed market at once. The next panel count, for every third Friday expiration inside the next fourteen months, how many underlyings list am.
| expiry month start | month label | underlyings listing |
|---|---|---|
| 2026-09-01 | Sep 2026 | 3663 |
| 2026-10-01 | Oct 2026 | 3244 |
| 2026-11-01 | Nov 2026 | 1367 |
| 2026-12-01 | Dec 2026 | 1874 |
| 2027-01-01 | Jan 2027 | 2152 |
| 2027-02-01 | Feb 2027 | 904 |
| 2027-03-01 | Mar 2027 | 1479 |
| 2027-04-01 | Apr 2027 | 934 |
| 2027-05-01 | May 2027 | 100 |
| 2027-07-01 | Jul 2027 | 23 |
| 2027-08-01 | Aug 2027 | 46 |
| 2027-09-01 | Sep 2027 | 362 |
| 2027-10-01 | Oct 2027 | 11 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE date >= today() - 10
) AS chain_date
SELECT
toString(toStartOfMonth(expiration_date)) AS expiry_month_start,
formatDateTime(toStartOfMonth(expiration_date), '%b %Y') AS month_label,
countDistinct(underlying_symbol) AS underlyings_listing
FROM global_markets.options_greeks
WHERE date = chain_date
AND expiration_date >= chain_date
AND days_to_expiry <= 430
AND toDayOfWeek(expiration_date) = 5
AND toDayOfMonth(expiration_date) BETWEEN 15 AND 21
AND underlying_symbol NOT IN ('SPCX')
GROUP BY toStartOfMonth(expiration_date)
ORDER BY toStartOfMonth(expiration_date)The nearest third Friday, Sep 2026, get listing from 3663 underlyings. Every name wey get options carry e front months, and that first point dey close to the whole listed universe. The count then dey drop, but e no drop evenly. After the near-term pair, stock go show again only for the months wey belong to e own cycle. So, each later month get only one part of the market instead of the whole market. Quarter-end months and the January series usually stand above their neighbours. The far edge of the panel dey thinner still: Oct 2027, the last month inside the fourteen-month window and more than one year away, get listing from only 11 underlyings. After twelve months, the ladder empty for every month except the January series, wey the LEAPS panel below dey cover.
The four March cycle months na also the four triple witching dates for the year. Na those dates index and equity contracts expire together on one third Friday.
Why LEAPS dey list for January?
LEAPS, long dated options wey get more than one year before dem expire, follow their own listing schedule. For single stocks, the long dated series na January one, no matter the cycle wey the stock dey follow. Stock wey dey March cycle still dey get January LEAPS.
The market-wide count make the pattern clear. This panel take every third Friday expiration wey dey more than 300 days away, then count the underlyings wey list am.
| LEAPS series | underlyings listing |
|---|---|
| Jan 2028 | 1252 |
| Sep 2027 | 362 |
| Dec 2027 | 321 |
| Dec 2028 | 256 |
| Jun 2028 | 124 |
| Aug 2027 | 46 |
| Nov 2027 | 31 |
| Jul 2027 | 23 |
| Sep 2028 | 16 |
| Mar 2028 | 14 |
| Oct 2027 | 11 |
| Feb 2028 | 3 |
| Apr 2028 | 2 |
| Jul 2028 | 1 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE date >= today() - 10
) AS chain_date
SELECT
formatDateTime(toStartOfMonth(expiration_date), '%b %Y') AS leaps_series,
countDistinct(underlying_symbol) AS underlyings_listing
FROM global_markets.options_greeks
WHERE date = chain_date
AND days_to_expiry > 300
AND toDayOfWeek(expiration_date) = 5
AND toDayOfMonth(expiration_date) BETWEEN 15 AND 21
AND underlying_symbol NOT IN ('SPCX')
GROUP BY toStartOfMonth(expiration_date)
ORDER BY underlyings_listing DESCJan 2028 na the biggest month for that window, and dem list am on 1252 underlyings. The month wey get the fewest listings for the same window, Jul 2028, show for 1.
Nothing change for January contract as time dey pass. January series wey dem list two years ahead na the same contract wey, one year later, simply become the January monthly for the chain: same strike, same third Friday. Na only the label dey disappear when e reach the one-year point. Wetín be LEAPS cover the contract side, while LEAPS wey deep in the money cover how traders dey use the long dated end.
Cycle decide whether spread fit get quote
Na here listing rule dey meet real order. Calendar spread dey buy one expiration and sell another one for the same strike. Diagonal dey do similar thing across two strikes. Both need two expirations to dey exist at the same time for the same underlying.
For name wey get weeklies and full cycle, this one easy. But for thinner name, the month wey you want fit no dey listed at all. February cycle stock no dey list September expiration until September become one of the two near-term months. So, you no fit build June-to-September calendar on top am for June, no matter the price. Na this same limit dey explain why long-dated structures dey gather around January expirations. A poor man's covered call na diagonal wey use long-dated call, and January na the month wey every optionable name get in common.
Liquidity na second filter on top of listing. Month fit dey listed and still get wide quote with small open interest. This one fit turn two-leg structure into problem of getting fill. Listing rule tell you wetin dey exist. Tape tell you wetin dey trade.
FAQ
Option expiration cycle tori na wetin?
Three cycles dey, and each one carry name of im first month: January cycle (January, April, July, October), February cycle (February, May, August, November), and March cycle (March, June, September, December). Dem assign stock to one cycle when dem first list options on am, and dem no dey change that assignment afterward.
How many expiration months stock fit get at the same time?
At least four. Two na near-term months: the current month and the next one. The other two come from the cycle wey dem assign to the stock. Actively traded names fit get plenty more when weekly, end of month, quarter end and daily expirations join those four.
All stocks dey get the same expiration months?
No. The two near-term months dey the same for everybody. The months after dem depend on which of the three cycles dem assign to the stock. So two similar companies fit get completely different back months.
Weekly options dey part of expiration cycle?
No. Dem list weeklies under separate program a few weeks ahead, and dem expire on Fridays wey no be the third Friday. Dem no change the stock cycle, and dem no count toward the four-month minimum.
Why dem dey list LEAPS for January?
Single stock LEAPS dey tied to January expiration, no matter the underlying stock cycle. This gives every optionable name one common long-dated month. As January series enter its final year, e become the stock’s regular January monthly, and the contract itself no change.
How these panels dey count
Each panel dey read the latest session wey dey on file for the daily contract level options data. E count expiration as listed when at least one contract for that expiration get record for the session. Dem identify monthly expirations by the date pattern: Friday wey fall between the 15th and 21st day of a month na the third Friday, and na that expiration the cycle rule dey control. Weekly, end of month and daily expirations no pass this test, so dem remove dem from the two market-wide panels by design. Na why those two counts dey lower than the raw number of dates for any real chain. The market-wide panels also remove symbols wey vendor feeds don assign to more than one company over time, so one ticker no go merge two entities into one count.
Every panel here get the SQL wey produce am. Open one, change the ticker, and the same question go run against any chain wey you like for the Strasmore terminal.