Quantitative research · Volatility & options
I study volatility — how to forecast it, how options price it, and how to tell a real edge from an overfit one.
I’m Jonas Löffler. I forecast volatility, measure what option prices imply about it — and try hard to prove my own ideas wrong. Hypotheses and decision rules are written down before the first run, results are judged out of sample, and failures are published with the same care as successes. Right now I’m measuring how much the options market charges for a single trading day, and running a live SPX volatility dashboard that anyone can check.
Live volatility forecast · planned
A pre-registered S&P 500 volatility forecast, committed to GitHub before every open and scored in public after the close. The record starts on the day it goes live — nothing is backfilled.
Research
Tools
Eight instruments I built to think with — two on today’s real market data, six as experiments with a known truth. All math is my own implementation, tested against finite differences or known answers, and runs in your browser.
Research log
- Forecasting protocol frozen before the confirmatory test (pre-registration, Research 1)Done
- Working paper completed: forecasting holds up, the strategy is disqualifiedDone
- Trading Library v1.2 released — a public teaching series, errata includedDone
- NextResearch 1 public release: paper, code that runs on a synthetic sample, DOIPlanned
- NextResearch 2 pre-registration published as the repository’s first commit — before any resultPlanned
- NextDaily live forecast, committed before the open, scored after the closePlanned
Live · Cboe delayed data · SPX & NDX
S&P 500 & Nasdaq-100 volatility, today
The full S&P 500 and Nasdaq-100 option chains (about 29,000 and 15,000 contracts) turned into implied-volatility surfaces, model-free implied moves, the term structure with a calendar-arbitrage check, and dealer-positioning scenarios — rebuilt about every 15 minutes during US trading hours by a GitHub Action. Only derived analytics are published, never raw quotes.
Live data could not be loaded. The page expects data/live/latest.js, written by pipeline/live_snapshot.py. Run the pipeline once, or wait for the scheduled GitHub Action.
History & live
–
Data table
Implied volatility surface
SVI fit per expiry · drawn only inside the quoted strike range
Smile: market, spline and SVI
Bid–ask implied vol per strike (own Black-76 inversion), a smoothing spline through the quotes and the five-parameter SVI fit.
- Bid–ask IV (market)
- Spline through the quotes
- SVI fit (dashed)
Data table
Measurement check
My model-free replication from the chain, interpolated to the index tenors, vs. Cboe’s official indices.
| Tenor | Mine | Cboe | Diff. |
|---|
Same method as Research 2’s validation gate. Differences come from snapshot timing (delayed feed vs. the 16:15 fixing), strike selection and the rate input.
What the amber line on the surface is
The at-the-money line (strike = forward) across all expiries — the ATM term structure. Its slope is contango (rising) or backwardation (falling), analyzed below.
Term structure: contango, backwardation, calendar arbitrage
Contango — longer-dated options carry more implied vol than shorter ones — is the calm-market norm; backwardation (front above back) marks stress or an event close ahead. Neither is an arbitrage. That only arises if total implied variance w = σ²·T falls with maturity: then a calendar spread (sell the front, buy the back) would cost less than nothing.
Implied vol by expiry — spot and forward
ATM vol (spline through the quotes) and model-free vol to each expiry; the steps are the forward vol between two consecutive expiries, √((w₂ − w₁) ÷ (T₂ − T₁)). Square-root time axis. Between neighbouring daily expiries a step isolates a single day: time runs in calendar days, so a Friday → Monday step spreads one session over three days and comes out low, and small fit errors are magnified — read the front steps as noisy.
- ATM vol to expiry
- Model-free vol to expiry
- Forward vol between expiries
- Negative forward variance
Data table
Today’s curve at fixed tenors
My model-free vol interpolated to fixed tenors (the VIX method) and Cboe’s own indices.
- Model-free, from the chain
- Cboe index
Data table
Calendar check — where fitted smiles cross
Consecutive expiries, compared at the same forward log-moneyness on the strikes both quote.
| Front → back | Strike (K/F) | Size | Fit RMSE | Verdict |
|---|
Size: how many vol points the back expiry’s IV at that strike would have to rise for w to stop falling. A violation smaller than the two fits’ own RMSE cannot be told apart from fit noise; even larger ones are rarely tradable once bid–ask spreads are paid.
Last 12 months
Daily closes of Cboe’s volatility indices.
Data table
Calendar spreads and the curve. A long calendar sells the front expiry and buys the back one at the same strike: long vega, short the front’s faster time decay. In contango it pays the richer back-month vol; in backwardation it sells the richer front — it then gains if the curve normalizes and loses if the stress persists. Try both in the tool: pick “Calendar” and move the term-structure slider until the calendar check turns red.
Dealer gamma — two assumptions
Open interest does not say who is long. Under convention A dealers are long calls and short puts; under B they are short everything. Same data, opposite conclusions — that is the identification problem, made visible.
Total gamma exposure across spot
Σ Γ × open interest × 100 × S² × 1 % — $ billions per 1 % move, all expiries, sticky-strike vols.
- A · long calls, short puts
- B · short all options
Data table
Gamma exposure by strike (convention A)
$ billions per 1 % move at today’s spot, all expiries.
- Long gamma
- Short gamma
Data table
Where the activity is
Share of open interest vs. share of the day’s volume by delta bucket. If a bucket’s volume share exceeds its open-interest share, it is traded more than it is held.
- Open interest share
- Volume share
Data table
All expiries — forward, rates, fit quality
| Expiry | Settle | Days | Forward | r (≥ 30 d) | q (≥ 30 d) | ATM IV | Implied move | Straddle | Spline in bid–ask | SVI in bid–ask | SVI RMSE | Butterfly |
|---|
Forward and discount factor from a put–call-parity regression on the strikes nearest the money; r and q shown from 30 days only — over a few days the discount factor differs from 1 by less than its estimation noise, so the rate is not identified (the forward itself is). ATM IV from the spline through the quotes at K = F. “In bid–ask”: share of strikes where the curve lies inside the bid–ask IV. Butterfly: Durrleman’s g ≥ 0 for spline and SVI. Implied move = √(model-free total variance to expiry); straddle ≈ √(2/π)·σ√T·F.
What this is: Cboe’s delayed quotes (about 15 minutes), rebuilt about every 15 minutes in trading hours. Implied vols are my own Black-76 inversions of mid quotes on the parity forward; time runs in calendar minutes as in the VIX, so a Monday expiry seen on Friday includes the weekend. Open interest is the prior day’s (OCC). The Nasdaq-100 chain is thinner than the S&P 500’s, so its fits are noisier and its dealer-gamma totals far smaller. What it is not: a trading signal — the dealer-gamma panels depend on an unverifiable sign assumption.
Tool · research · live · ES & NQ
Implied range
How far the options market expects ES and NQ to move — and five years of data on whether its levels actually hold. The rule: expected move = price × IV ÷ √252 (about IV ÷ 16), laid out as a σ-ladder from 0.25σ to 2σ.
Live data could not be loaded. This tool needs data/live/latest.js.
σ-ladder
Levels from the selected anchor.
| Level | Price | Distance | Reached | Random walk | Held |
|---|
Latest session against its implied range
- Price (5-min close)
- 5-min high–low
- ±1σ range
- σ-levels
- First touch
Drag across the chart to zoom into a time window · double-click or “Reset zoom” to zoom out · ⤢ enlarges.
| Level | Price | First touch (ET) | Furthest beyond | At the close |
|---|
Data table
② The math, step by step
Everything on this page follows from eight small ideas. The live numbers in grey come from today’s data.
1 · From annual to daily volatility
Volatility indices are quoted as annualized standard deviations. If daily returns are independent, variances add, so volatility grows with the square root of time. With 252 trading days a year:
Fine print: the VIX annualizes 30 calendar days with a 365-day year. Spread over the ~21 trading days in 30 calendar days that is VIX² · 30/365/21 ≈ VIX²/256 per trading day — the ÷√252 rule is within about 1 %.
2 · The expected move and the ladder
One standard deviation of the one-day return, in points, is the expected move (EM). The ladder is the anchor plus or minus multiples of it:
3 · What the normal distribution promises
If the one-day return R were normal with standard deviation σ, the close would land inside ±kσ with probability
Φ is the standard normal distribution function: 38.3 % inside ±0.5σ, 68.3 % inside ±1σ, 95.4 % inside ±2σ. Section ③ checks this against five years of closes.
4 · Touching is twice as likely as closing beyond
Reflection principle: for a driftless random walk, every path that touches the level and ends above it has a mirror image — reflected at the first touch — that ends below it. So
+1σ is touched on 31.7 % of days (each side), although the close ends beyond it on only 15.9 %.
5 · The 50 % benchmark for “levels hold”
The same symmetry says: once the level is touched, the rest of the day is a fresh random walk starting at the level. It closes back inside half of the time:
A level that “held” is only interesting if it holds clearly more often than 50 % — pure noise already produces a turn at every other touched level. Try it in the simulator below; test it in the level lab ④.
6 · Fair value of the future
Put–call parity at the futures expiry links calls C, puts P, the discount factor D and the forward F. Regressing C − P on the strike K gives D (minus the slope) and F:
7 · Why the ruler is usually too wide
Option sellers demand a premium for bearing variance risk, so implied variance tends to exceed the variance that is later realized — the variance risk premium:
8 · Where the rule breaks
- VIX and VXN measure 30 calendar days. Using them for one day assumes a flat term structure; VIX1D prices the next day directly.
- Scheduled events (CPI, FOMC, earnings) concentrate variance on single days.
- Returns have fat tails and a skew: large down days are more frequent than the normal allows.
- Daily bars cannot tell whether the high came before the low — so this page never claims an order of events it cannot see.
Try it: random-walk sessions with a known σ
Each session is a driftless random walk of 390 one-minute steps whose daily σ equals the implied one — the world in which the ladder is exactly right. Shown: 60 of the sessions; statistics over all of them.
- Touched neither level
- Touched a level, closed back inside (held)
- Touched a level, closed beyond it (broke)
③ How often do the levels hold? Calibration
Every session of the last five years, measured from the prior close with the prior close’s one-day implied σ. Descriptive statistics on public Cboe and Nasdaq data — a check on the ruler, not a trading rule.
Close inside ±kσ of the prior close
Observed share of sessions vs. the normal distribution.
- Observed
- Normal
Data table
Intraday touches of +kσ and −kσ
Share of sessions whose high / low reached the level vs. a driftless random walk.
- High reached +kσ
- Low reached −kσ
- Random walk
Data table
④ Level lab — touched, then held or broke?
For every session: did the day reach the level, and where did it close? A level “held” if the index touched it and closed back inside; it “broke” if the close stayed beyond. The random-walk benchmark is exactly 50 % (step 5 of the math).
Loading five years of sessions…
What five years of data say
Computed in your browser from the session file on every load — nothing here is typed in by hand. Intervals: Wilson 95 %, treating touches as independent (optimistic under volatility clustering).
Every session: how far it went, where it closed
Each dot is one session (both sides: two dots). Right of the dashed line = the level was touched; above the solid line = the close stayed beyond it.
- Not touched
- Touched → held
- Touched → broke
Hold rate by level, with 95 % confidence intervals
Share of touches that closed back inside, for every level from 0.25σ to 2.5σ; whiskers: Wilson 95 % intervals — wide where touches are rare.
- +kσ (high touched)
- −kσ (low touched)
- Random walk: 50 %
Data table
Definitions and limits. Cash index, regular session (09:30–16:00 ET), daily open / high / low / close from Cboe (S&P 500) and Nasdaq (Nasdaq-100), cross-checked against a second source. Level = prior close × (1 ± kσ) with σ = IV ÷ √252 at the prior close. ES and NQ also trade overnight; those moves are not in the cash index. Daily bars show whether a level was touched and where the day closed, but not when or in which order — so this measures “touched → closed back inside”, not intraday reversal timing. The index’s first print at 09:30 still contains stale prices of stocks that have not opened yet, so part of an overnight gap can appear as a move in the first minutes — “reached intraday” is the cleaner test, not a perfect one.
⑤ Distribution, regimes and the variance risk premium
Same data as the level lab (series and session filter). Where the ruler is off, and when.
Where the day closed, in σ
z = (close ÷ prior close − 1) ÷ σ_day. Bars: sessions per 0.25σ bin; line: the standard normal the ladder assumes.
- Observed
- Normal(0, 1)
Data table
Implied vs. subsequently realized volatility
Implied vol at each close vs. the volatility realized over the next 21 sessions (close-to-close, annualized). All sessions; the filter does not apply.
- Implied
- Realized, next 21 sessions
Data table
Calibration by regime
Same statistics, split by the level of implied vol, the VIX term structure and the weekday.
| Sessions | n | Inside ±1σ | Touched +kσ | Touched −kσ | Held (95 % CI) | Realized ÷ implied |
|---|
What the ladder is — and isn’t. The σ-levels are the market’s price of dispersion, not support or resistance. The variance risk premium makes the 30-day ruler too wide on an average day, fat tails make the rare breaks bigger than a normal distribution suggests, and a touched level turns back about half of the time even in pure noise — the findings in ④ show how real sessions compare. Descriptive statistics, not investment advice.
Tool · implied volatility
Volatility surface
A parametric SSVI surface (Gatheral & Jacquier 2014), the standard arbitrage-aware parametrization. Shape it, then test it: butterfly and calendar arbitrage, Dupire local volatility and the risk-neutral density all follow from the same formula.
SSVI · K/F × maturity
Real data: today’s SPX surface, fitted expiry by expiry from the Cboe chain — with bid–ask fit quality and a check against the VIX. Live Market →
Smiles
Implied vol by strike, four maturities.
- 1 week
- 1 month
- 3 months
- 1 year
Data table
ATM term structure
At-the-money implied vol by maturity.
Data table
Risk-neutral density
Of ln(ST/F) vs. lognormal at the ATM vol.
- Implied by the smile
- Lognormal
Data table
What this is: a parametric surface with θT = σATM(T)²·T — every number is internally consistent and checked (the implied density integrates to one and prices the forward). What it is not: market data. Next step: fitting it daily to delayed Cboe chains and reporting the share of strikes whose model IV lands inside the bid–ask IV.
Tool · option strategies
Options & Greeks
Build a position and see its P&L — or any of 13 greeks up to third order — as a surface over spot × volatility or spot × time. Black–Scholes with dividend yield; every greek is checked live against a finite difference.
Spot × implied vol
P&L profile
By spot, in $ (×100 multiplier).
- Now
- At first expiry
Data table
Position greeks
At current spot, vol and time · $ per unit shown · live finite-difference check.
| Greek | Value | Per | Check |
|---|
Tool · market mechanics
Dealer Gamma Lab
Option dealers hedge their delta. Long gamma, their hedges lean against the move; short gamma, they chase it. Here is that argument as a model you can derive in three lines — and break.
Dealer gamma across spot
Feedback λΓD(S); shaded: model breaks down.
- Long gamma
- Short gamma
Data table
Gamma exposure by strike
Dealer $-gamma per 1 % move at the current spot, normalized.
- Long
- Short
Data table
What it does to volatility
σeff/σ0 across spot; 1× = no dealer effect.
Data table
Same shocks, with and without dealer hedging
20 trading days in 5-minute steps, common random numbers — only the mechanism differs.
- No dealer hedging
- With dealer book
Data table
Tool · same-day options
0DTE variance
SPXW 0DTE options settle on the close, so a chain at 09:35 prices exactly the variance of the rest of the session. Before measuring it on 1,771 real days, the estimator has to pass a known-answer test — and survive discrete strikes, skew and wings that stop quoting.
Each strike’s share of the estimate
2ΔK·Q(K)/K² as a share of the replicated variance.
- OTM puts
- K₀ (put–call average)
- OTM calls
- Excluded by the zero-bid rule (tick below axis)
How to read: the 1/K² weight gives out-of-the-money puts more weight than calls at the same distance, and skew adds more. Coarse strikes bias the sum; excluded strikes are the truncation error.
Data table
Implied moves
Move priced by the options
A 1-sd move is S·σ·√T; the ATM straddle costs about √(2/π) ≈ 0.8 of it.
Trading-time convention: 252 days × 6.5 hours. Cboe’s VIX uses calendar minutes — the choice changes the annualized number, not the total variance.
Event move from the term structure
Total variance adds up: an expiry just after an event (FOMC, CPI) carries the event day’s variance on top.
σ²event = σ₂²T₂ − σ₁²T₁ − σ₁²(T₂ − T₁ − 1 day), trading days / 252; assumes non-event days carry the pre-event vol.
Research status: the real measurement (1,771 days, second-level quotes) is pre-registration first — no results yet, by design. Research questions →
Tool · measuring & forecasting
Realized volatility
Two questions behind my first paper, as experiments with a known truth: which estimator measures volatility best, and why does a simple HAR cascade beat a random walk?
Which estimator?
Estimates vs. truth
Annualized vol: mean and 5–95 % range over 300 windows; the line is the true value.
How to read: range estimators are far more efficient than close-to-close — until the overnight gap (Parkinson, Garman–Klass, Rogers–Satchell and intraday realized variance only see the session) or sparse sampling (the observed high/low understates the true range) biases them down. Yang–Zhang adds the overnight piece back. Realized variance wins without noise; add microstructure noise and it overshoots at high frequency — the reason for 5-minute sampling.
Data table
HAR forecasting lab
Forecast loss (QLIKE)
Lower is better; gray = infeasible floor (knows the true latent variance).
Data table
Forecast vs. realized
Last 200 out-of-sample days, annualized vol. The random-walk forecast is just yesterday’s noisy value.
- Realized (noisy proxy)
- HAR forecast
Data table
Tool · overfitting & fills
Backtest Lab
The two ways backtests lied to me — selection among many configurations, and fills that the tape never gave — rebuilt on simulated data where the truth is known.
Why a Sharpe of 0.96 didn’t count
Where does the in-sample winner land out of sample?
Logit λ of its relative out-of-sample rank across all 252 splits. Left of zero = below the OOS median.
- Below OOS median (overfit)
- Above OOS median
Data table
The Sharpe-8 illusion
A mean-reversion fade of mine looked spectacular on one-minute bars — Sharpe 5–8, 65–76 % winners — and lost money on every variant on real ticks. The mechanism, reproduced on a pure random walk:
Same prices, same rule, two engines
Cumulative P&L in ticks, net of costs.
- Bar backtest (fill on touch)
- Tick replay (fill on trade-through)
How to read: the bar engine fills whenever the low touches the limit, then credits the take-profit if the same bar’s high reaches it — although that high may have printed before the fill. On ticks, a resting order fills only on a trade-through and exits happen in time order.
Data table
What happened in the real study
| Test | Data | Result |
|---|---|---|
| Faithful rebuild of the original rule | NASDAQ-100, 1-minute bars, 2013–2026 | Sharpe −2.91 · −90 € per trade · 6,036 trades |
| “Fade v2” (near take-profit, tight stop) | 1-minute bars | Sharpe 5–8 · 65–76 % winners — an artifact |
| Fade v2 variants | real NQ futures ticks | −34 to −370 € per trade |
| Counter variant | bars → ticks | +316 € / 75.9 % winners → −370 € / 4.8 % winners (853 tick trades) |
| Original algorithm | real NQ ticks | −129 € per trade (49 trades) |
Limits: 15 trading days of ticks (May 2025, NQ); mechanical translation of the rule, not discretionary execution.
How not to fool yourself with a backtest
- Fill limit orders on a trade-through, not a touch.
- Never let a bar’s high and low both be “known” after an intrabar fill.
- Resolve take-profit vs. stop in time order — or assume the worst.
- Charge realistic costs, and count every configuration you tried.
- Treat a Sharpe above 3 on a simple rule as a bug report.
Research
Research
Pre-registered, out of sample, every trial counted — and negative results published with the same care.
Research 1 · working paper v1.1
Forecasting holds up. The strategy doesn’t.
I forecast the daily realized variance of the S&P 500 — built from 5-minute returns on 1-minute data, February 2005 to August 2026, out of sample from January 2013 (3,422 trading days) — and test whether those forecasts can size equity exposure. Hypotheses, parameter grids, costs and, decisively, disqualification rules were fixed in writing before the first run; all 73 configurations computed enter the multiple-testing correction.
One-day-ahead forecast loss, out of sample
QLIKE (lower is better), S&P 500, 2013–2026. Blue: the two steps tested formally.
How to read: log-HAR beats the random walk (Clark–West p ≈ 0.03, pre-registered), adding the VIX beats log-HAR (p = 0.019), and HAR-IV is the only classical model in the 90 % model confidence set. Gradient boosting ties HAR-IV (DM p = 0.86).
Data table
Best strategy vs. buy-and-hold
Sharpe with 95 % block-bootstrap interval, net, walk-forward OOS.
How to read: Sharpe 0.96 vs. 0.83 and drawdown −9.9 % vs. −34.0 % — but the intervals overlap almost completely (ΔSharpe +0.13), PBO is 0.84 against a 0.7 gate, and the effect is single-market. Disqualified by my own rules.
Data table
Findings
- Volatility is forecastable. MSE-based OOS R² +23 % at one day, +27 % at one week, +43 % at one month (the one-month gain is not significant at 5 %, Clark–West p = 0.053).
- Implied volatility carries information past realized volatility does not (HAR-IV vs. log-HAR, Clark–West p = 0.019, in both sub-periods).
- Calibrated on average (Mincer–Zarnowitz slope ≈ 1): of the 2.54× under-estimation on spike days, a perfectly calibrated forecaster already produces ≈ 1.90× through outcome selection under right skew.
- The strategy is disqualified: PBO 0.84, single market, Sharpe advantage inside the bootstrap noise. Published anyway.
What this does not show
- A tradeable edge — the contribution is the forecasting result and the validation method.
- Anything beyond the S&P 500; the strategy result is single-market by construction.
- That a rich feature set helps robustly — its QLIKE gain does not carry over to MSE.
- Live performance: nothing counts as “supported” without a live prediction log — that is what the daily forecast is for.
Paper (PDF)CodeDOIPaper, code (runs on a synthetic sample) and DOI: public release in preparation.
Research 2 · in progress · pre-registration first
How much volatility does the options market price for a single day?
Since 2022, S&P 500 options expire every trading day. Because SPXW contracts settle on the closing print, a 0DTE chain observed at 09:35 ET prices exactly the variance of the rest of the session. I’m building a model-free measure of it from second-level quotes on every strike: 1,771 expiration days, January 2018 to September 2026 — five years before Cboe’s VIX1D — and comparing it with realized variance over the same window.
No results yet — by design. Hypotheses, effect sizes from the literature, the sample split and every test will be committed publicly before the first result is computed. Try the estimator →
| Question | Hypothesis or gate |
|---|---|
| RQ1 · Measures what it should? | Gate: tracks VIX1D where both exist (since 2023) — high rank correlation, no drift in the ratio. If it fails, fix the measurement first. |
| RQ2 · Intraday variance risk premium? | E[IVoc − RVoc] > 0; change with daily expiries (2022); FOMC/CPI days. |
| RQ3 · Does it forecast? | IVoc vs. HAR + VIX for same-day RV, out of sample (QLIKE, Clark–West, MCS). |
Known limits, stated up front
- Spreads are wide after the open — measurement time is a robustness dimension (09:35 vs. 10:00).
- Before 2022, 0DTE days are mostly Mon/Wed/Fri — not a random sample; the 2022 break is tested explicitly.
- With jumps, the log-contract replication is not exactly quadratic variation.
- The quote data are licensed and will never be published — only code, a synthetic sample, aggregates and figures.
Integrity as a feature
Research standards
- Pre-registration first.Hypotheses, effect sizes, sample splits and decision rules are committed before the first run.
- Out of sample, or it didn’t happen.Nothing is called “validated” without an out-of-sample test.
- Count every trial.Multiple testing is corrected — deflated Sharpe ratio, probability of backtest overfitting.
- Direction check.The sign of the data must match the sign of the claim before the claim is made.
- Reproducible by default.Clone, install, run — the printed numbers must match.
- Errata, not silent edits.Corrections are logged publicly.
- Negative results are results.They are published with the same care.
- Licensed data stays licensed.Only code, derived aggregates and data fingerprints are published.
How I work
I design the research questions, pre-registrations and tests myself, and I verify every reported number by re-running the code from a clean clone. I use AI assistants as tools — for drafting, refactoring code and adversarial review of my own analyses — the same way I use Python libraries: every output is checked, and every error is mine. Corrections are published in each project’s errata rather than silently edited.

About
Jonas Löffler
Based in Germany. I work on volatility from three sides: forecasting it from high-frequency data, reading it from option prices — surfaces, model-free implied variance, dealer positioning — and testing trading ideas without fooling myself. What I care about most is knowing which results are real.
How I work
- One question first.Every project starts as a single falsifiable question with an expected effect size — not as a search for a good backtest.
- Commit before I look.Hypotheses, sample splits, costs and kill rules go into a pre-registration before the first run; the commit timestamp is the proof.
- Test it like it’s wrong.Out-of-sample or walk-forward only, every trial counted, estimators checked against a known answer before they touch real data.
- Publish all of it.Code that reproduces from a clean clone, negative results included, corrections logged as errata instead of silent edits.
The full rules are in the research standards.
Toolkit
Teaching — Trading Library
22 original papers in seven tracks, from beginner (L1) to research level (L3). Every empirical number is reproducible from free data; papers CC BY 4.0, code MIT, errata public.
L3 · Options
Dealer Flows & GEX
Hedging flows, gamma/vanna/charm — and why published GEX has an identification problem.
L3 · Volatility
Vol Modeling, SVI & VRP
Volatility models, the SVI parametrization and the variance risk premium.
L3 · Quant methods
Overfitting Control & Calibration
Deflated Sharpe, PBO, walk-forward design, calibration of probabilistic forecasts.