In development

The volatility system

Options are a market in forecasts. The trade is the forecast error.

An end-to-end research and execution platform for defined-risk index-volatility strategies, under active construction and documented as it goes. Phase 1 focuses on defined-risk SPY and SPX/SPXW structures at roughly 5–45 days to expiry, with VIX options captured for the term structure. The architecture is designed to generalise to additional underlyings and strategy families once the initial research and execution loop is validated. What I own at every stage below is the interface, the validation, and the failure handling — not necessarily the implementation. PyArrow, NumPy and SciPy do the work they are good at; the pricing identities, the entitlement probes and the coverage audits are mine because they are what decides whether a number is trustworthy.

01 · Premise

Why volatility

An option price is a statement about the distribution of future returns. Implied volatility is that statement made legible. It is also, persistently and measurably, a biased forecast: implied volatility exceeds subsequently realised volatility most of the time in index options, because someone is being paid to carry the risk of it not doing so.

That premium is well documented, which means it is not an edge by itself. Harvesting it naively is a strategy that makes money for years and then returns all of it in a fortnight. The interesting questions are the ones underneath: when is the premium unusually rich relative to the risk being assumed, how much should be risked given a specific portfolio of Greeks, and what does the position actually cost to put on and hedge after spreads, slippage, and hedging costs.

Those are estimation and optimisation problems under uncertainty — the discipline I have spent a decade applying in other domains. Why this domain, and why now, is on the homepage.

Trading is a game of edges, and the edge is usually in the execution and the risk management rather than the prediction. — the working assumption, after Euan Sinclair
02 · Architecture

System stages

Each stage is independently testable and independently loggable. Failures are attributed to a stage, not to “the model.” Every card below separates what the stage does today from what it is designed to do, and where a stage is held up by the data entitlement rather than by unwritten code, it says so. These cards are generated from a single component manifest, so they cannot drift from the status reported elsewhere on the site.

01 Data

Data & cleaning

Operational

Options chains, trades, day bars, dividends and the Treasury curve land on a schedule under a daily coverage audit.

Runs today
End-of-day and intraday options chains, option trades and day bars, underlying prices, dividend schedules and the Treasury curve land on a cron schedule. A daily coverage audit reports on the absence of a job rather than only on its failures, which is how a dataset can otherwise go missing for weeks while every log line looks healthy. Cleaning on the entitled inputs filters by open interest, flags prices that violate static no-arbitrage bounds, and reconstructs the forward from put-call parity rather than trusting a vendor field.
Designed to
A point-in-time warehouse in which every field used by a model can be reconstructed as it stood at the decision timestamp, with quote-level hygiene sufficient to trust a fill assumption.
Blocked by
Option NBBO is a 403 on the current data tier. There is no bid, ask or mid anywhere in the warehouse, so every price is a traded price — last trade, else day close. Dropping crossed and locked quotes and filtering by spread width are defined in terms of fields this tier does not provide.

Inputs, outputs and acceptance test →

02 Data

Pricing & identities

Operational

Own implied volatility and Greeks, checked every evening against reprice and put-call parity identities.

Runs today
Implied volatility is inverted per contract from the traded price: Newton with bounds and a Brent fallback for European contracts, and a Brent inversion of the binomial tree for American-style SPY, so SPY volatility now comes off the same engine that prices it. A price outside the discounted no-arbitrage bounds raises an error rather than returning a NaN, and an American put priced at intrinsic inverts to zero rather than failing, because exercised now it is worth that at every volatility. Greeks are computed from the full named catalogue, European closed-form for SPX and SPXW and a binomial tree for American-style SPY. Vendor implied volatility and Greeks are copied as diagnostics and are never inputs. A daily canary re-checks the stored numbers against three identities on at-the-money names: that the engine reprices its own input, that call and put gamma and vega agree, and that put-call parity holds.
Designed to
A pricing layer whose every output can be re-derived from declared inputs and conventions, so that a downstream error is attributable to a model rather than to arithmetic.

Inputs, outputs and acceptance test →

03 Analytics

ATM term structure

Implemented — under validation

One row per date, root and expiry over the archive back to 2022-08-31, with the forward recovered from parity.

Runs today
Per-contract implied volatilities are reduced to an at-the-money term structure: one row per date, root and expiry, carrying the parity forward, the ATM strike and both leg implied volatilities. It is built from option day bars rather than chain snapshots because day bars reach back to 2022-08-31 while the snapshot sweep only begins in 2026. Pricing is done in the forward measure, which reduces Black-Scholes-Merton to Black-76, because a spot price and a dividend yield are exactly what this tier does not provide. Vol time is a hybrid rather than a flat day count: trading sessions over 252 inside the attested and upcoming exchange calendar, falling back to ACT/365 past the horizon the calendar covers, and stamped per row so a later reader can tell which convention produced a given number rather than having to infer it. The whole archive rebuilds in about seven minutes.
Designed to
The level and slope of at-the-money volatility, queryable per root and expiry, as the input a 5-45 day book is actually traded off — and as the baseline any later surface fit must beat.

Inputs, outputs and acceptance test →

04 Analytics

Smile & surface

Implemented — under validation

Raw SVI per expiry over OTM strikes, SPX/SPXW only, with butterfly and calendar arbitrage repaired inside the fit. Runs daily.

Runs today
A raw-SVI (Gatheral) smile is fitted per date, root and expiry to total implied variance against log-moneyness, over own-inverted OTM strikes from option day bars — calls above the parity forward, puts below. Butterfly and calendar constraints are repaired inside the fit rather than checked after it, and a slice that cannot be repaired raises rather than writing an arbitrageable smile. The fitted surface evaluates at any strike and maturity, interpolating linearly in total variance between expiries and holding flat outside them. It sits alongside the ATM curve rather than replacing it, and is built from the same chain, the same forward and the same inversion, so agreement between the two at the money is a cross-check between datasets rather than a calibration target. Scheduled daily after the term structure; the archive rebuilds separately.
Designed to
A globally consistent, arbitrage-free volatility surface across the whole chain, extended to SSVI, that downstream Greeks and any off-strike valuation can rely on.
Blocked by
SPY is refused: its strikes are American and would invert under the wrong exercise boundary in a European fit path. An American inverter exists, so this is follow-up work rather than a structural limit. VIX options sit on the VX future and are a different modelling question.

Inputs, outputs and acceptance test →

05 Analytics

Volatility forecasting

In progress

A HAR-RV baseline forecast is implemented and tested on a continuous SPY series; it is not yet scheduled or evaluated.

Runs today
A HAR cascade in logs — daily, weekly and monthly realised-variance terms — is implemented against a continuous SPY spot series, with its own uncertainty band. The spot series it consumes is built on a schedule; the forecast itself is not, and no out-of-sample evaluation has been run. Fitting is done in logs so the heavy right tail of realised variance does not dominate, and forecasts exponentiate back to variance.
Designed to
Realised-volatility estimators that use the full bar — Parkinson, Garman-Klass, Yang-Zhang — rather than close-to-close, feeding HAR-RV and GARCH-family baselines. Learned models are promoted only where they show incremental out-of-sample value over those baselines; a model that fails to beat them is a result, not a defect.

Inputs, outputs and acceptance test →

06 Analytics

Signal & target sizing

Planned

Converts a forecast-versus-implied spread into a target position, subject to Greek budgets.

Runs today
Nothing. No signal or sizing code exists.
Designed to
The spread between forecast realised and market implied volatility becomes a signal only after it clears modelled costs. Sizing separates direction from conviction by meta-labelling: one model decides whether to act, a second sizes the bet, and the portfolio is constrained by vega, gamma and net-liquidation budgets rather than by notional. This layer proposes a target; it does not authorise one.

Inputs, outputs and acceptance test →

07 Trading control

Risk authorisation & hedging

Planned

The independent authority that can veto a target. Continuous Greek accounting, banded delta hedging, margin modelling.

Runs today
Nothing. No risk or hedging code exists.
Designed to
Continuous Greek accounting with discrete delta hedging against an explicit rebalancing band, where hedging error is a cost to be optimised rather than a nuisance; scenario and stress grids across spot and volatility shocks; and margin modelling, because a strategy that survives a drawdown on paper can still be closed out by a margin call. This layer is deliberately separate from sizing: it authorises or vetoes the target that analytics proposes, and it can only reduce risk, never raise it.

Inputs, outputs and acceptance test →

08 Trading control

Execution

Planned

Fills at achievable prices, legging risk on multi-leg structures, and the SPY assignment hazards of Phase 1.

Runs today
Nothing is executed. Interactive Brokers Flex reporting is connected read-only, with no gateway and no trading permission, so executions can be ingested but none can be sent.
Designed to
Fills modelled at achievable prices rather than at the mid, because in options the quoted spread is frequently wider than the modelled edge. Multi-leg structures carry legging risk, and index settlement carries hazards of its own — AM-settled SPX expiries print off the opening auction, not the close. Early assignment, stock borrow and share delivery do not apply to SPX and SPXW, which are European-style and cash-settled, but they do apply to SPY, which is American-style and physically settled, and are therefore first-class Phase 1 execution risks.
Blocked by
The spread-dependent components of the cost model cannot be calibrated without an option NBBO entitlement. With no bid or ask the crossing cost can be bounded, roughly half the spread in volatility terms, but it cannot be measured or corrected for.

Inputs, outputs and acceptance test →

09 Evaluation

Evaluation

Planned

Purged and embargoed cross-validation, walk-forward testing, and deflated Sharpe ratios beside raw ones.

Runs today
The protocol is written and published, and dated in version control, but nothing has been evaluated under it because nothing produces a result yet. The track-record page's statistics are implemented and withhold every inferential figure below twenty returns.
Designed to
Purged and embargoed cross-validation, walk-forward testing as the headline, deflated Sharpe ratios reported alongside raw ones, and an explicit count of every configuration tried so that the probability of backtest overfitting can be estimated rather than ignored.

Inputs, outputs and acceptance test →

10 Operations

Operations & logging

In progress

Scheduled jobs, structured logs and dead-man alerting run; position and P&L reconciliation does not exist yet.

Runs today
The ingest box runs on an installed crontab with a continuous-integration alarm that fires when the running schedule drifts from the one declared in the repository. Every job writes structured JSON lines and pings a dead-man's-switch service, so a job that silently stops running raises an alert rather than going unnoticed. Entitlements are probed rather than assumed, and the probe fails in either direction — a capability gained is as much a change as one lost.
Designed to
Structured logs at every stage, daily reconciliation of expected against actual positions and profit and loss, and an alerting layer for silent failures — a stale data feed that produces plausible-looking numbers is far more dangerous than one that crashes.
Blocked by
Position and profit-and-loss reconciliation cannot exist before there are positions.

Inputs, outputs and acceptance test →

03 · Results

Track record

Nothing is published here until the evaluation protocol has been run end-to-end and the out-of-sample clock has been running long enough for the number to mean something.

The live record has its own page, and its contract is already in force: append-only, each observation a separate dated commit, with CI rejecting any edit to a day that has already been published. No observations have been recorded yet — the record starts when the first stage trades. Every statistic on it is computed in the browser from the raw data file.

It reports the minimum track record length next to the Sharpe ratio — how long the record would have to run before that Sharpe could be told apart from luck. While it is too short to mean anything, the page says so.

04 · Failures

Post-mortems

Every losing period and every dead hypothesis will be written up: what I expected, what happened, what I had wrong, and what changed as a result. The log is empty today because the system has not yet produced a result worth writing about. When it has, those will be the most useful pages here and the hardest ones to fake.

05 · Sources

What this is built on

Euan Sinclair — Volatility Trading, Positional Option Trading
The mechanics and economics: where the premium comes from, why hedging error matters as much as the forecast, and how position sizing rather than prediction separates traders who survive from those who do not.
Marcos López de Prado — Advances in Financial Machine Learning, Machine Learning for Asset Managers
The statistics of self-deception: why standard cross-validation leaks in time series, how to purge and embargo, why a Sharpe ratio without a trial count is uninterpretable, and how meta-labelling separates the decision to act from the size of the bet.

This page was last updated . Every stage above is versioned in the repository; changes are commits, not edits.