Option Expiration Cycles: How Dem Work
Option expiration cycles decide which months go show for stock option chain. Learn the three cycle groups and why LEAPS dey land for January.
Option expiration cycles na listing rule wey dey decide which expiration months go show for stock option chain. When dem first list options for every US stock wey get options, dem assign am to one of three cycles. That assignment, together with rule say at least four expiration months must dey available at any time, na wetin produce the row of dates wey you see for broker chain. The question here na which months dem go list. For the date wey option actually expire, see when options expire, and for this year date list, see 2026 options expiration calendar.
Wetin be option expiration cycle?
When exchange first list options for one stock, e put the stock inside one of three expiration cycles. Each cycle na four months, and the months 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 — the third Friday contracts wey dey beyond the front of the chain. E no talk about the next few weeks; separate 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 for any time, based on fixed order. The first two na near-term months: current month and the month after am. The next two na first two months for the stock own cycle wey the near-term pair never cover.
Make we work am out for February cycle stock wey dey June. Near-term months na June and July. The next cycle months wey never enter na August and November, so the chain show June, July, August, November. Once June expiration pass, near-term pair become July and August, while chain reach November and February. Near-term months dey roll every month. Cycle months dey move one step every three months.
Which expiration months dey listed for a real chain?
Four na the floor, and heavily traded name dey well above am. The panel below list every expiration for Apple’s chain on the most recent session wey dey on file, together with the number of contracts carried for each date.
| expiry date | expiration label | days wey remain | contract count |
|---|---|---|---|
| 2026-10-23 | Oct 23, 2026 | 1 | 121 |
| 2026-10-26 | Oct 26, 2026 | 4 | 70 |
| 2026-10-28 | Oct 28, 2026 | 6 | 60 |
| 2026-10-30 | Oct 30, 2026 | 8 | 85 |
| 2026-11-04 | Nov 4, 2026 | 13 | 58 |
| 2026-11-06 | Nov 6, 2026 | 15 | 79 |
| 2026-11-13 | Nov 13, 2026 | 22 | 70 |
| 2026-11-20 | Nov 20, 2026 | 29 | 110 |
| 2026-11-27 | Nov 27, 2026 | 36 | 61 |
| 2026-12-04 | Dec 4, 2026 | 43 | 34 |
| 2026-12-18 | Dec 18, 2026 | 57 | 109 |
| 2027-01-15 | Jan 15, 2027 | 85 | 102 |
| 2027-02-19 | Feb 19, 2027 | 120 | 66 |
| 2027-03-19 | Mar 19, 2027 | 148 | 65 |
| 2027-04-16 | Apr 16, 2027 | 176 | 65 |
| 2027-06-17 | Jun 17, 2027 | 238 | 66 |
| 2027-09-17 | Sep 17, 2027 | 330 | 75 |
| 2027-12-17 | Dec 17, 2027 | 421 | 80 |
| 2028-01-21 | Jan 21, 2028 | 456 | 66 |
| 2028-03-17 | Mar 17, 2028 | 512 | 28 |
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_dateThat one na 23 separate expiration dates on one underlying. The nearest one, Oct 23, 2026, dey 1 days ahead and carry 121 contracts. The farthest one, Jan 19, 2029, dey 820 days out with 59 contracts on am. Look the shape between the two ends: dates dey come weekly for the front, then thin to roughly one per month through the middle of the year, before dem stretch to 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 dem. That one 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 remaining part of modern chain dey come from separate listing programs wey no dey inside 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 tied 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 these 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 on 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 wey dey within 45d | months wey pass 90d |
|---|---|---|---|
| SPY | 33 | 16 | 10 |
| AAPL | 23 | 10 | 11 |
| MSFT | 22 | 10 | 10 |
| KO | 18 | 7 | 9 |
| HRL | 13 | 7 | 4 |
| CLX | 7 | 1 | 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 33 listed expirations. 16 of them dey inside 45 days. That dense front end dey come from daily and weekly listing program, no be from the cycle. CLX dey the other end of the panel, with 7 listed dates altogether. After 90 days, the picture change: the widest name get 10 distinct expiration months, compared with 4 for the narrowest one. Na for the front of a chain lineup dey differ. The back na where the cycle dey show.
How I fit tell which cycle stock dey follow?
No lookup table dey necessary. Open the chain, skip the current month and the month after am, then find the first monthly expiration after those two months. That month and 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 how many underlyings list each third Friday expiration inside the next fourteen months.
| expiry month start | month label | underlyings listing |
|---|---|---|
| 2026-11-01 | Nov 2026 | 3769 |
| 2026-12-01 | Dec 2026 | 3037 |
| 2027-01-01 | Jan 2027 | 2152 |
| 2027-02-01 | Feb 2027 | 924 |
| 2027-03-01 | Mar 2027 | 1584 |
| 2027-04-01 | Apr 2027 | 1155 |
| 2027-05-01 | May 2027 | 861 |
| 2027-07-01 | Jul 2027 | 38 |
| 2027-08-01 | Aug 2027 | 61 |
| 2027-09-01 | Sep 2027 | 447 |
| 2027-10-01 | Oct 2027 | 18 |
| 2027-11-01 | Nov 2027 | 53 |
| 2027-12-01 | Dec 2027 | 365 |
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, Nov 2026, dey listed by 3769 underlyings. Every name wey get options carry its front months, so 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 its own cycle. So each month farther out get only one part of the market, no be the whole market. Quarter-end months and the January series usually dey higher than their neighbours. The far edge of the panel dey thinner: Dec 2027, the last month inside the fourteen-month window and more than one year away, na only 365 underlyings carry am. 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, dey follow their own listing schedule. For single stocks, the long dated series na January one, no matter the cycle wey the stock dey follow. Even stock wey dey March cycle still get January LEAPS.
The count across the market dey show this clearly. This panel dey 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 | 1412 |
| Jan 2029 | 1054 |
| Sep 2027 | 447 |
| Dec 2027 | 365 |
| Dec 2028 | 259 |
| Jun 2028 | 130 |
| Aug 2027 | 61 |
| Nov 2027 | 53 |
| Mar 2028 | 20 |
| Sep 2028 | 20 |
| Oct 2027 | 18 |
| Feb 2028 | 9 |
| 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 1412 underlyings list am. The month wey get the fewest listings for the same window na Jul 2028, and 1 underlyings get am.
Nothing dey happen to January contract as e dey age. 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 mark. Wetín be LEAPS cover the contract side, while LEAPS wey deep in the money dey explain how people dey use the long dated end.
Cycle dey 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 the same 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. For thinner name, the month wey you want fit no dey listed at all. February cycle stock no go list September expiration until September become one of the two near-term months. So you no fit build June-to-September calendar on that stock in June, no matter the price. Na the same restriction dey explain why long-dated structures dey concentrate for January expirations: poor man's covered call na diagonal wey dey use long-dated call, and January na the month wey every optionable name get in common.
Liquidity na second filter after listing. Month fit dey listed and still quote wide with small open interest. That one fit turn two-leg structure into fill problem. Listing rule dey tell you wetin dey exist. Tape dey tell you wetin dey trade.
FAQ
Option expiration cycle three ones na wetin?
Three cycles dey, and dem name each one after the first month wey e cover: 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 the assignment no dey change 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 dem add weekly, end of month, quarter end and daily expirations on top this minimum.
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 the 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’s 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’s cycle. This one give every optionable name one common long-dated month. As January series enter within one year to expiration, e become the stock’s ordinary January monthly, without any change to the contract itself.
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 that session. Monthly expirations dey separate based on their date pattern: Friday wey fall between the 15th and 21st day of a month na the third Friday. Na that expiration the cycle rule dey control. Weekly, end-of-month and daily expirations no pass this test, so dem dey drop out of 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.