Options data · chain · surface. A desktop options terminal for Mac. Tenor downloads the option chains of 30 liquid US names, fits every expiry's volatility smile, and shows what is cheap or rich against it: ranked hourly while the market is open, frozen every Monday, and scored against a random baseline.
python3.12 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m tenor refresh # download and fit everything (~20 s)
.venv/bin/python -m tenor serve # http://127.0.0.1:8770
.venv/bin/python tools/make_app.py --install # Tenor.app in ~/Applications| Monitor | Market strip (index ETFs, VIX, 10-year), the two ranked boards (8–45 days, weeklies) live or as locked this week, implied vs realised scatter |
| Vol | Volatility board: IV 30d, realised 21d, IV/RV, IV rank, realised percentile, term slope, skew, 25Δ risk reversal and fly, expected moves, put/call, earnings; term-structure matrix |
| Screener | Every contract that passes the liquidity filters, with edge to the smile, filters and CSV |
| Long shots | "Put $100 in, make $10k": the cheapest route to a target multiple with the market's own odds |
| Flow | Call and put volume by name, the most active contracts, volume / open interest, premium |
| Overview | Price with the implied ±1σ cone, the realised-vol cone against today's term structure, implied vs realised history |
| Chain | Mirrored calls / puts with fair value, edge, greeks or activity; expected move, max pain, parity forward |
| Surface | Smiles across expiries, strike × expiry heat map, skew table, Breeden–Litzenberger implied distribution |
| Builder | Multi-leg strategies with presets, payoff at three dates, break-evens, probability of profit, net greeks, scenario grid |
| Book | Paper positions marked at the delayed bid/ask with P&L and greeks; expired ones settle at intrinsic |
| Record | Each Monday's locked list against 20 random contracts that passed the same filters |
Keys: 1–0 pages, ← → or a two-finger swipe to move between them, / command bar (NVDA CHAIN), ⌘K palette
(or pull down with two fingers), ? help.
- Forward per expiry from put-call parity on tight near-the-money pairs, so dividends and borrow are priced in.
- Smile: a leave-one-out local quadratic fit of implied variance in log-moneyness through liquid out-of-the-money quotes. A quote never sets its own fair value.
- Edge = Black-76 price at the smile's vol minus the ask, over the ask. Edges above 15% are flagged and never ranked.
- Ranking: 70% cheapness to the smile, 30% implied below realised (21-day bipower variation), with liquidity filters and at most two picks per name.
- Odds are risk-neutral and lognormal with each strike's own smile vol.
| Part | |
|---|---|
tenor/ |
Engine: chains, surface fit, ranking, history, paper book, local server |
web/ |
The terminal: js/core.js, ui.js, shell.js, math.js, charts.js, one module per page |
tools/ |
Mac app wrapper, artwork, snap (headless page renderer for development) |
docs/SPEC.md |
The data contract between engine and pages |
tests/ |
python -m unittest discover -s tests and node --test tests/js/*.mjs |
Free quotes, delayed about 15 minutes. Relative value, not a forecast. Not investment advice.
