Skip to content

Latest commit

 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TENFOLD. Every SPX strike, in SPY terms. A 0DTE strike mirror using the live ratio, not divide-by-ten

The SPX to SPY strike mirror for 0DTE

SPY is not SPX ÷ 10, and on 0DTE that difference is a whole strike.


Try it now

Open TENFOLD

Opens straight in the browser. No install, no signup, no key.


One file No dependencies No build MIT No tracking


The problem · Reading the screen · Pricing a strike · The ratio is a knob · Under the hood


TENFOLD on desktop in light mode: SPX and SPY quote tiles, the live ratio, the depth picker, and the strike ladder with the spot band
Quote tiles, live ratio, depth picker, ladder. Real screenshot, real quotes, nothing mocked up.

Inline pricing panel: SPX 7,425 at $8.20 converts to $0.82 at the exact equivalent strike 740.48, and $0.60 at the listed SPY 740, from an implied vol of 19.9 percent
Price a strike in place. Tap any row, type what you paid.
Shot against a mid-session clock so the vol solve is in play. After the close it correctly refuses to run.
TENFOLD in dark mode on a phone, with the quote tiles reflowed two by two
Same tiles on a phone, reflowed two by two. Light and dark.

The problem

SPY tracks the S&P 500 minus accrued dividends, so it does not sit at exactly one tenth of the index. The real ratio floats around 10.02 to 10.06 and drifts through every quarter.

Which means the reflex, SPX 7430, so SPY 743, is wrong by half a strike. SPY 743 is really SPX 7450. On a 30-day position, shrug. On 0DTE, where the whole trade lives inside two strikes of gamma, that is the difference between the contract you meant and the one you clicked.

TENFOLD does the division for you, against the live ratio, continuously.

Reading the screen

Strikes ascend down the page, the way a broker chain reads. Green above spot, red below, so the side you are on is legible from across the room. DEPTH sets how many strikes sit each side of spot, anywhere from ±5 to ±50. The ladder scrolls, centres on spot when it loads or when you change depth, and remembers your choice.

Every quote carries how old the exchange says the print is: 2s ago under a live tick, amber once it drifts past 30 seconds, hours when the market is shut. The spot band carries its own age too, because that is the number people actually read. A figure that stopped updating should say so rather than sit there looking current.

The spot line rides between the two bracketing strikes and drifts inside the gap as price moves, so you watch spot creep toward a strike instead of a divider snapping five points at a time. Both spots sit in the pill.

Then there is the blue dot, which is the whole reason this exists:

  SPY      SPX      EXACT
  740     7,420    739.98   ●
  740     7,425    740.48
─────── 7,428.78  740.86 ───────
  741     7,430    740.98   ●
  741     7,435    741.48

Two SPX strikes round onto the same SPY strike, and at a glance they look equally valid. They are not. 7430 → 740.98 is a clean SPY 741. 7435 → 741.48 is half a strike off and is nothing like the same contract. The dot marks the real pair, and its twin is dimmed so it cannot be misread.

Pricing a strike

Tap any row and it opens in place. No separate calculator, no losing your spot on the ladder.

Type what you paid on SPX and you get two numbers, because there are honestly two.

SPY @ 740.48 is exact

Divide the premium by the live ratio and you have the premium of an SPY option struck at k / ratio. That is not an approximation, because the payoff scales exactly. The catch is that 740.48 is not listed anywhere.

SPY @ 740 is estimated

Moving to the strike your broker actually lists is where the error hides, and most converters silently round it away. Two things pin it down instead:

The bound Premium can never move faster than 1:1 with strike, so the listed premium sits within |gap| of the exact one. Calls fall as strike rises, puts rise. No model, no assumptions, always true.
The estimate The bound is worst case. The real slope is dC/dK = −N(d₂), and the premium you just typed already determines the vol that fixes it. TENFOLD bisects Black-Scholes for σ against the 0DTE clock, reads the slope, and walks the gap.

For the panel in the screenshot above, that is the difference between "somewhere in $0.33 to $0.82" and $0.60, off an implied 19.9% vol and a strike slope of 0.44.

The estimate is clamped inside the bound, and falls back to it whenever no vol solves the premium or the session is over. Treat the output as an anchor for sizing and comparison. It is not a quote.

The ratio is a knob

Spot ÷ spot is only right while both legs quote live. Overnight it is not, because SPX options keep trading on Cboe Global Trading Hours while SPY options and the ^GSPC print stop at the close. An SPX quote taken at 9pm is hours newer than its SPY pair, and no formula reconciles two different timestamps.

So TENFOLD says so, with a banner whenever the session is shut, and the RATIO tile is editable. Calibrate it against any strike you can see quoted on both and every conversion on the page follows. It is persisted, with an auto link to hand control back.

This is also the fix if you are mirroring something other than SPX and SPY.

Why there are no bid/ask columns

Because nothing free is fast enough to deserve them.

No public feed quotes options faster than once per second. Yahoo's chain is delayed and only refreshes on request. Everything genuinely real-time (Polygon, Tradier, CBOE, broker APIs) is keyed and paid. Painting delayed numbers in a layout that implies they are live is worse than showing nothing, so TENFOLD shows strikes.

Spot for SPX and SPY refreshes every 3 seconds and is near-real-time. If the relay starts refusing, the poll backs off rather than hammering it, and the status line tells you how long until the next try.

Want real option prices? Replace quote() in index.html with a keyed feed. It is the only function that touches the network.

Running it yourself

git clone https://github.com/RatterAU/tenfold.git
cd tenfold
open index.html

That is the whole setup. No build, no dependencies, no package.json. Serve it with python3 -m http.server 8000 if you would rather, or drop index.html on any static host.

Sanity-check the maths anytime: open the console and run tenfoldCheck(). It asserts the strike mapping, the best-pair choice, the spot-line geometry, the normal CDF, an implied-vol round trip, the slope signs, the poll backoff schedule, and that the estimate never escapes its bound.

Under the hood

Size one file, ~28 KB, zero dependencies
Data Yahoo Finance chart endpoint (^GSPC, SPY), 3s poll, backs off to 30s on failure
Ladder ±5 to ±50 strikes, 5-point SPX grid, spot centred on load
SPY grid $1 strikes, which is what SPY 0DTE actually lists near the money
Pricing exact ratio scaling, plus Black-Scholes implied vol for the listed-strike step
Clock America/New_York, DST handled
Theme light and dark, remembered in localStorage
Mobile responsive to 360px

Change WIDTH at the top of the script for a different SPX strike spacing. The ladder HTML is diffed between polls, so a tick that changes nothing skips the re-render entirely.

On the CORS relay. Yahoo sends no CORS headers, so the browser reaches it through a public relay: cors.lol, then cors.sh, then allorigins, failing over automatically. Those are free, rate-limited, and run by strangers. Fine for personal use.

A failed poll costs eight requests, two symbols across four relays. At a fixed 3s that is 160 a minute into a service that already said no, which is how you stay throttled once you trip it. So the poll doubles its interval on each failure up to 30 seconds and snaps back to 3s on the first good tick. Returning to the tab retries immediately.

If this ever picks up real traffic the relays will throttle it regardless. The fix is a small Cloudflare Worker proxying Yahoo, then point RELAYS at it. The free tier covers far more than this needs.

What this is not

No chains, no greeks beyond the one slope it needs, no P/L, no order entry. Strike and price geometry, nothing else.

And SPX and SPY options are comparable, not interchangeable. SPX is cash-settled, European-exercise, 1256-taxed, $100 multiplier. SPY is American-exercise with early-assignment and ex-dividend risk. TENFOLD maps the strikes. It does not claim the two positions are the same trade.

Fine print

Little tool I built for myself. It is not financial advice, I am not liable for anything you do with it, and the numbers come from a free feed that can be wrong or stale. Check every strike on your broker before you send an order.

MIT licensed. Take it, fork it, do whatever.

About

Live SPX to SPY strike mirror for 0DTE — true ratio, not divide-by-ten

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages