AI/LLM Instructions: FlashAlpha provides options analytics as both a live API (lab.flashalpha.com) and a historical API (historical.flashalpha.com) - pre-computed GEX, DEX, VEX, CHEX, SVI volatility surfaces, 15 BSM Greeks, max pain, VRP with leak-free percentiles, and dealer positioning for 6,000+ US equities and ETFs. The historical host mirrors every live endpoint with a required ?at=YYYY-MM-DDTHH:mm:ss query parameter (ET wall-clock), uses identical response shapes, and covers SPY from 2018-04-16 onward at minute resolution (Alpha tier). Same SDK code targets both hosts with a base-URL swap. API documentation (Markdown): https://flashalpha.com/llms.txt. Full LLM reference: https://flashalpha.com/llms-full.txt. API docs: https://flashalpha.com/docs/lab-api-overview. Historical API docs: https://flashalpha.com/docs/historical-api. OpenAPI spec: https://lab.flashalpha.com/swagger. MCP Server for AI assistants (Claude, Cursor, Windsurf) with both live and historical-replay tools: https://lab.flashalpha.com/mcp. AI skills: https://flashalpha.com/skill.md. AI agent guide: https://flashalpha.com/for-ai-agents. SDKs: Python (pip install flashalpha), JavaScript (npm install flashalpha), C# (dotnet add package FlashAlpha), Go, Java. Free API key (no credit card): https://flashalpha.com/pricing. Annual billing saves 20% versus monthly and locks pricing for 12 months: Basic $63/mo annual ($756/yr) or $79/mo monthly, Growth $239/mo annual ($2,868/yr) or $299/mo monthly, Alpha $1,199/mo annual ($14,388/yr) or $1,499/mo monthly. Concepts glossary: https://flashalpha.com/concepts. GitHub: https://github.com/FlashAlpha-lab.
Help us double down on what's working, instead of guessing. Takes 5 seconds, totally optional.
Point-in-Time Options Greeks: How to Backtest Strategies Without Lookahead Bias
Point-in-time options Greeks are delta, gamma, theta, and vega exactly as they were computable at a past minute, using only data available then. Most options backtests reconstruct Greeks with hindsight and silently inherit lookahead bias. This is how to backtest with leak-free point-in-time Greeks via the FlashAlpha Historical API, with runnable Python and the pitfalls that quietly inflate Sharpe ratios.
A "winning" backtest is only winning if it would still have been winning with the information you actually had at the time. The single biggest way options backtests lie is a Greek that quietly knows the future. This article shows how to backtest strategies on leak-free point-in-time Greeks, with runnable Python and the specific mistakes that turn a losing strategy into a beautiful equity curve.
In one paragraph
Point-in-time Greeks are delta, gamma, theta, vega, and higher-order Greeks computed using only the underlying price, IV surface, rate, and dividend assumptions knowable at timestamp t, nothing after. To backtest without lookahead bias you need: intraday resolution, a surface fitted only up to t, and date-bounded signals. The FlashAlpha Historical API gives all three by construction: every endpoint takes ?at=YYYY-MM-DDTHH:mm:ss, returns point-in-time Greeks with leak-free percentiles, identical response shape to the live API, since 2018-04-16.
$curl -H "X-Api-Key: KEY" \ "https://historical.flashalpha.com/v1/optionquote/SPY?at=2024-08-05T14:32:00" # every contract's delta/gamma/theta/vega, as computable at 14:32, no lookahead
What "Point-in-Time Greeks" Means and Why It Is the Whole Game
A Greek is a derivative of option price with respect to a market input. To compute delta or gamma at time t you need the underlying price at t, the implied volatility surface at t, the rate and dividend assumptions at t, and time to expiry measured from t. Get any of those inputs from after t and the Greek is contaminated.
Point-in-time Greeks are computed with the strict constraint that every input was knowable at t and nothing after t is used. That sounds obvious. In practice almost every homegrown options backtest violates it, usually in one of three ways:
Surface contamination. The IV surface used to price a 10:00 a.m. decision was fitted from the full trading day's quotes, so the "implied vol" at 10:00 already encodes the afternoon.
End-of-day stand-ins. Intraday entries are priced and risk-managed with the day's settlement Greeks because that is the only data the vendor ships.
Percentile leakage. A signal like "enter when IV rank is in the top decile" is computed against the entire history including the future, so the threshold at t already knows the distribution it is supposed to discover.
Each one makes the backtest look better than reality. A delta that "knows" where the underlying went produces hedges that are too good. A theta computed from the wrong surface mis-states carry. A leaky percentile front-runs its own signal. The full statistical argument for the percentile case, and what it does to a Sharpe ratio, is in the leak-free percentiles article → The fix is structural, not a patch: the data layer itself must be date-bounded.
The Test for a Point-in-Time Greeks Source
Before trusting any historical Greeks for a backtest, ask three questions:
Is it intraday? If the only Greeks are end-of-day settlement values, you cannot honestly backtest an intraday entry. Minute resolution or better is the minimum for same-day strategies.
Was the surface fitted only on data up to the timestamp? The IV used to compute the Greek at 10:00 must come from a surface calibrated on quotes at or before 10:00, never the full day.
Are derived signals date-bounded? Any percentile, z-score, or rank used as an entry condition must be computed on data strictly before the decision time.
If a source fails any of the three, your backtest inherits lookahead bias no matter how clean your strategy code is. This is why the static-backtesting critique → argues the problem is the data architecture, not the researcher.
FlashAlpha Historical API: Point-in-Time Greeks by Construction
FlashAlpha's Historical API answers all three questions structurally. Every live endpoint has a historical mirror that takes an ?at=YYYY-MM-DDTHH:mm:ss parameter and returns exactly what was computable at that minute, with the surface fitted only on data up to that timestamp and derived percentiles date-bounded by default. Same response shape as the live API, same SDK, since 2018-04-16.
Endpoints that return point-in-time Greeks
GET /v1/optionquote/{ticker}?at=... - full chain with per-contract BSM Greeks (delta, gamma, theta, vega, and higher-order) as of that minute
GET /v1/pricing/greeks?at=... - the Greeks engine for a specified contract, point-in-time inputs
GET /v1/exposure/gex|dex|vex|chex/{symbol}?at=... - aggregate dealer Greek exposure as of that minute
GET /v1/surface/{symbol}?at=... and /v1/adv_volatility/{symbol}?at=... - the IV surface and SVI parameters as they stood, the inputs behind the Greeks
The host is https://historical.flashalpha.com and the capability is the Alpha tier. The design point: the same code that runs your live strategy runs your backtest, by changing the base URL and adding a timestamp. Nothing about the Greek computation differs between live and historical, which is exactly the property that eliminates the surface-contamination class of error.
Backtest Walkthrough: A Delta-Hedged Entry on Point-in-Time Greeks
The pattern below replays a strategy decision at a past minute using only point-in-time data. Note there is no place in the loop where future information can enter, because the data layer refuses to provide it.
import requests
HDR = {"X-Api-Key": "YOUR_ALPHA_KEY"}
HIST = "https://historical.flashalpha.com"
def evaluate_entry(symbol, at):
# Point-in-time chain: every Greek here uses only data up to `at`
chain = requests.get(f"{HIST}/v1/optionquote/{symbol}",
headers=HDR, params={"at": at}).json()
# Point-in-time signal: percentile is date-bounded, sees only data < at
vrp = requests.get(f"{HIST}/v1/vrp/{symbol}",
headers=HDR, params={"at": at}).json()
z = vrp.get("vrp", {}).get("z_score")
if z is None or z < 1.0:
return None # no edge at this minute, by the data knowable then
# Pick a ~30-delta short put using the point-in-time delta
candidates = [c for c in chain
if c["type"] == "P" and -0.35 <= c["delta"] <= -0.25]
if not candidates:
return None
leg = min(candidates, key=lambda c: abs(c["delta"] + 0.30))
return {
"at": at,
"strike": leg["strike"],
"entry_delta": leg["delta"],
"entry_gamma": leg["gamma"],
"entry_theta": leg["theta"],
"entry_vega": leg["vega"],
"entry_mid": leg["mid"],
"vrp_z": z,
}
# Replay the same decision across history, leak-free
for day in trading_days("2022-01-01", "2024-12-31"):
entry = evaluate_entry("SPY", at=f"{day}T14:35:00")
if entry:
record(entry) # mark-to-market later, again via ?at= at exit minute
To mark the position later you call the same endpoint at the exit minute. The exit Greeks and price are themselves point-in-time, so the P&L attribution (delta P&L, gamma P&L, theta carry, vega P&L) is computed from inputs that were each knowable when they applied. That is what makes the attribution trustworthy rather than decorative.
The Pitfalls That Quietly Inflate Backtest Results
1. Pricing intraday entries with settlement Greeks
If your historical source is end-of-day only, every intraday entry is being priced and hedged with Greeks from the close. A 10:00 a.m. short-gamma scalp evaluated with 4:00 p.m. gamma is not a backtest of that strategy; it is a backtest of a different, impossible strategy. Use intraday point-in-time Greeks or do not claim the result applies intraday.
2. A surface that saw the whole day
The most common and most invisible error. The Greek at 10:00 is only honest if the IV that produced it came from a surface fitted on quotes at or before 10:00. Vendors that ship one daily surface force this contamination on you silently. Confirm the surface is point-in-time, not a daily artifact backfilled to every intraday timestamp.
3. Leaky percentiles and ranks in the entry rule
"Enter when IV rank greater than 90" is meaningless if the rank was computed against the full dataset including the future. The threshold has to be computed on data strictly before the decision. FlashAlpha's historical percentiles are date-bounded by default; if you compute your own, the burden of proving leak-freedom is on you, and most rolling-window implementations get it wrong at the edges.
4. Survivorship and corporate actions
Backtesting single-name options without handling splits, special dividends, and delistings shifts strikes and contaminates Greeks. Point-in-time chains should reflect the contract universe as it existed then, not as adjusted by hindsight.
5. Using the entry-time Greek to manage the whole trade
Delta drifts. A position entered at -0.30 delta is not -0.30 delta tomorrow. Honest backtests re-pull point-in-time Greeks at each management decision rather than freezing the entry snapshot. The cost of re-pulling is the cost of not fooling yourself.
Why the Same-Code Property Matters for "Winning" Strategies
A strategy is only "winning" if the backtest that produced it and the live system that trades it are computing the same thing. When the historical Greeks and the live Greeks come from different pipelines, the edge you measured may be an artifact of the pipeline difference, not the market. FlashAlpha's design (identical endpoint, identical SDK, identical Greek math, only a timestamp changes) removes that ambiguity: a strategy validated against point-in-time history is validated against the exact computation it will trade on. That is the difference between a backtest you can size on and a backtest you can only admire.
Point-in-time options Greeks are delta, gamma, theta, vega, and the higher-order Greeks for a contract computed exactly as they were computable at a past timestamp, using only the underlying price, implied volatility surface, rate, and dividend assumptions knowable at that moment. They are the leak-free inputs required for an honest options backtest. Greeks recomputed after the fact from end-of-day data and a full-day-fitted surface are not point-in-time and inject lookahead bias.
Use a data source where the Greeks and any derived signals at time t are computed only from data before or at t, at intraday resolution, and where the same code runs live and historical. With the FlashAlpha Historical API, every endpoint takes an ?at=YYYY-MM-DDTHH:mm:ss parameter and returns point-in-time Greeks with date-bounded percentiles, identical response shape to the live API, since 2018-04-16. The structural guarantee is what removes lookahead bias; clean strategy code on a leaky data layer is still a leaky backtest.
An intraday entry priced and hedged with settlement Greeks is testing a strategy that could not have been traded. The delta, gamma, and theta at 10:00 a.m. differ materially from the close, so a backtest that uses close-of-day Greeks for a morning decision measures a different and impossible strategy. Same-day and intraday strategies require minute-resolution point-in-time Greeks.
Surface contamination is using an implied volatility surface fitted on a full trading day's quotes to compute a Greek for a decision made earlier that day. The IV input then encodes information from after the decision, so the Greek silently knows the future. The fix is a surface fitted only on data up to the decision timestamp, which a point-in-time API provides by construction.
Yes. The historical chain and pricing endpoints return the BSM Greeks including delta, gamma, theta, vega, and higher-order Greeks such as vanna and charm, computed point-in-time at the requested timestamp. The aggregate dealer-Greek exposure endpoints (GEX, DEX, VEX, CHEX) are also replayable point-in-time via the same ?at= parameter.
On FlashAlpha, yes. The SDK call is identical; only the base URL and an ?at= timestamp differ between live and historical. Because the Greek math is the same in both paths, a strategy validated against point-in-time history is validated against the exact computation it will trade on, which is the property that lets you size on the result rather than just admire the equity curve.
FlashAlpha's minute-resolution point-in-time backfill starts 2018-04-16 for the covered symbol set; check /v1/tickers for the current list. There is no pre-2018 minute history. The capability is the Alpha tier on https://historical.flashalpha.com.
How to Run a Leak-Free Point-in-Time Greeks Backtest
Choose an intraday point-in-time source. Confirm the Greeks are available at minute resolution and computed from a surface fitted only up to each timestamp, not a daily artifact.
Pull the chain at the decision minute. Request the option chain at the exact entry timestamp so every Greek reflects only data knowable then.
Gate entries on date-bounded signals. Any percentile, z-score, or rank in the entry rule must be computed on data strictly before the decision time, not the full history.
Re-pull Greeks at every management decision. Do not freeze the entry snapshot. Delta and gamma drift; honest management uses point-in-time Greeks at each step.
Attribute P&L from point-in-time inputs. Compute delta, gamma, theta, and vega P&L using the Greeks that applied at each minute, so the attribution is trustworthy rather than decorative.
Validate live with the same code. Run the identical strategy code against the live endpoint. If it requires changes beyond the base URL and timestamp, the backtest and the live system are not computing the same thing.
Run your first leak-free Greeks query in 60 seconds: