Historical Optionable Tickers
See which US stocks actually had listed options on a past date, and how densely those options expired: weekly, biweekly, or monthly. Each snapshot is frozen on the first trading day of its month, so a universe built for a date in 2022 contains only what was listed in 2022.
Rebuild the universe as it was.
Pull the snapshot for a past date and get the exact set of ticker values that had a listed chain then, not the set that has one now.
Separate weekly names from monthly ones.
has_weeklies flags continuous weekly expirations, and avg_days_between measures how tight the expiration ladder actually was.
Date when a name became tradeable.
Walk the monthly date snapshots for one ticker to find the first month it appears, and the month its expirations turned weekly.
Re-run my options strategy using only the stocks that actually had options listed on each day it traded. Tell me how much of the return survives and which positions were never tradeable in the first place.
Your agent pulls the snapshot that was current on each of your test dates and drops any position in a name that had no listed chain, or no weekly expirations, at that point.
The options universe, frozen one month at a time.
A stock is optionable when an exchange has listed standardized options contracts on it. Not every US equity is. Listing is a decision an exchange makes against criteria like price and share count, and it is unwound when a company is acquired or delisted. This dataset records who was on that list, month by month.
Each row is one ticker on one snapshot date, taken on the first trading day of the month. Alongside the ticker, the row carries the shape of the expiration ladder listed at that moment: how far apart the next six expirations sat, and whether weekly expirations ran consecutively.
Each row includes:
- The snapshot date: the first trading day of the month the row describes.
- One ticker that had a listed options chain on that day.
- Average spacing across the next six expirations, in days.
- A weekly flag: whether consecutive weekly expirations were listed at the snapshot.
- A record that is never rewritten, so the same query returns the same universe a year from now.
Today's optionable list is not history. Exchanges add chains after a name gets big and liquid enough, and remove them after buyouts and delistings, so a universe screened today hands your backtest contracts that did not exist on the dates it traded.
Stop backtesting options on stocks that had none.
Survivorship bias in options research usually enters through the universe rather than the prices. Screen for optionable names today and you get a list shaped by everything that happened since: the small cap that got a chain in 2023 looks like it had one in 2019, and the names that were bought out or delisted are missing entirely. A strategy tested against that list is trading contracts nobody could have bought.
Expiration density is the other half of the problem. A weekly strategy is only implementable in names where weeklies actually ran. When avg_days_between sits closer to 30 than to 7, the next expirations were a month apart, and a test that assumes a seven-day hold in those names is measuring a trade that did not exist.
- Rebuild the optionable universe for each rebalance date instead of screening once and applying the result backward.
- Restrict a weekly-expiration study to rows where has_weeklies is 1 on the date being traded.
- Rank candidates by avg_days_between when the strategy needs a tight expiration ladder.
- Join a snapshot against your signal dataset to drop signals in names with no chain to trade.
- Measure how much of a published options result survives once the universe is dated.
Snapshotted on the first trading day, never rewritten.
Every snapshot is taken on the first trading day of the month by reading the option expirations listed for each ticker at that time. avg_days_between is the average gap across the next six consecutive expirations after the first week window, so a value near 7 describes a dense weekly ladder and larger values describe biweekly or monthly listings. has_weeklies is set to 1 when multiple consecutive weekly expirations were present.
Records are written once and never retroactively altered. A row dated March 2024 reflects only what was listed in March 2024, which is what makes it safe to reuse as a historical universe. Dates come back as YYYY-MM-DD strings, and large pulls page deterministically with cursor_date and cursor_ticker.
The four columns that decide what your universe contains.
The headline fields below are a subset. Every field, with exact types and semantics, is documented in the API reference.
| Field | Type | What it tells you |
|---|---|---|
| date | string | Snapshot date, the first trading day of the month |
| ticker | string | A stock that had a listed options chain on that date |
| avg_days_between | float | Average days between the next six consecutive expirations; near 7 means a dense weekly ladder |
| has_weeklies | integer | 1 when consecutive weekly expirations were listed at the snapshot, 0 when they were not |
| count | integer | Rows returned in this page of the response |
| has_more | boolean | Whether another page of the universe is waiting |
| next_cursor | object | The date and ticker to resume from on the next call |
| cursor_date | param | Half of the pagination cursor; must match next_cursor from the previous response |
| cursor_ticker | param | The other half; sending only one of the two returns a 400 |
| date_gte | param | Lower bound on snapshot date; date_lte, date_gt, and date_lt work the same way |
One call returns the tradeable list for a date.
One key works across the REST API, the hosted MCP server, and this dashboard. Every response is JSON with a { count, data } envelope.
import requests
url = "https://api.alphanume.com/v1/optionable-tickers"
params = {
"date": "2026-02-02",
"api_key": "alp_abc123"
}
r = requests.get(url, params=params)
print(r.json())curl "https://api.alphanume.com/v1/optionable-tickers?date=2026-02-02&api_key=alp_abc123"{
"count": 1,
"has_more": false,
"next_cursor": null,
"data": [
{
"date": "2026-02-02",
"ticker": "PFE",
"avg_days_between": 7.0,
"has_weeklies": 1
}
]
}What this data does not claim.
- The snapshot is monthly. A chain listed on the tenth of a month does not show up until the next snapshot, so listings and removals inside a month are invisible.
- The presence of a chain is not liquidity. A row says options were listed, not that they had open interest, volume, or a spread worth crossing.
- avg_days_between describes only the next six expirations from the snapshot date. It is a reading of the ladder at that moment, not a full expiration calendar.
- There are no strikes, prices, or greeks here. This is a universe file, meant to be joined against your own options data.
- The dataset publishes monthly snapshots. Pro provides the full point-in-time history and the latest published snapshot.
Asked by researchers, answered plainly.
What does it mean for a stock to be optionable?
It means an exchange has listed standardized options contracts on that stock, so calls and puts on it can be traded. Listing follows exchange criteria around price, share count, and shareholder base, which is why newly public and very small companies often have no chain, and why a name can lose one after an acquisition.
Which stocks have weekly options?
Weekly options are expirations listed on most Fridays instead of only the standard monthly cycle. In this dataset a name qualifies for a given month when has_weeklies is 1 on that snapshot, and the set moves over time as exchanges add and drop weekly classes.
How do I avoid survivorship bias in an options backtest?
Select the universe on each historical date rather than once at the start. Pull the snapshot in force on the rebalance date, intersect it with your candidates, and skip anything absent. That reproduces the choices a trader had in that month instead of the choices available now.
Can I use this to pick which expiration to trade?
Not directly. avg_days_between tells you how tightly expirations were spaced at the snapshot, not the individual expiration dates or strikes. Use it to decide whether a name supported a given holding period, then pull the actual chain from your options data source.
Available with Pro. Enterprise for teams.
New REST API and MCP access requires Pro or Enterprise. Public dashboard previews are separate from a subscription. Pro includes the available historical record, current updates, REST, MCP, dashboard exports, and every standard dataset as it launches. Explore the dashboard preview before subscribing; its existing limits still apply.
Dataset license: Alphanume Terms of Service. Personal or commercial use is subject to your subscription tier. Redistribution requires written consent.