Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

flashalpha-historical

Python SDK for the FlashAlpha Historical API — point-in-time replay of every live analytics endpoint. Ask what GEX, gamma flip, VRP, narrative, max pain, or the full stock summary looked like at any minute back to 2017-01-03, in the same response shape as the live API.

Coverage: SPY 2017-01-03 → today, with daily extensions; more symbols added on demand.

Point-in-time replay since 2017. Backtest dealer positioning (GEX, VRP, vanna/charm, max pain) at any minute since 2017-01-03, then trade the same endpoints live. No look-ahead, no training-serving skew. The Historical API is an Alpha tier capability.

pip install flashalpha-historical

Requires Python 3.10+. Same X-Api-Key you use for api.flashalpha.com. Alpha plan or higher on every endpoint.

Quickstart

from flashalpha_historical import FlashAlphaHistorical

hx = FlashAlphaHistorical("YOUR_API_KEY")

# One snapshot — what dealer positioning looked like during the COVID crash
snap = hx.exposure_summary("SPY", at="2020-03-16T15:30:00")
print(snap["regime"], snap["exposures"]["net_gex"])
# → 'negative_gamma' -2633970601

The at= parameter accepts strings ("2026-03-05T15:30:00" or "2026-03-05" → defaults to 16:00 ET), datetime objects, or date objects.

Backtesting

The SDK ships with replay utilities that turn any endpoint into an iterator over a date / minute range. Holiday calendar is built in (NYSE 2018-2026); gap days are skipped silently by default.

Daily replay

from flashalpha_historical import FlashAlphaHistorical, Backtester, iter_days

hx = FlashAlphaHistorical("YOUR_API_KEY")

def strategy(at, snap):
    """Short vol when VRP rich AND dealers long gamma."""
    vrp = snap["volatility"]["vrp"]
    regime = snap["exposure"]["regime"]
    return {
        "signal": "short_strangle" if vrp > 5 and regime == "positive_gamma" else None,
        "vrp": vrp,
        "regime": regime,
    }

bt = Backtester(hx, method="stock_summary", symbol="SPY")
results = bt.run(iter_days("2024-01-02", "2024-03-29"), strategy)

# Convert to DataFrame
import pandas as pd
df = pd.DataFrame(bt.to_records(results))

Minute-level replay

from flashalpha_historical import iter_minutes, replay

# Walk every 15 minutes through one trading day
for at, snap in replay(hx, "exposure_summary", "SPY",
                       iter_minutes("2025-01-15", "2025-01-15", step_minutes=15)):
    print(at, snap["regime"], snap["gamma_flip"], snap["exposures"]["net_gex"])

Quota note: every call counts against your daily plan quota (shared with the live API). 1-minute replay = 390 calls per analytic per day — coarsen with step_minutes=15 or step_minutes=30 for development loops.

API

Every analytics method takes a required at keyword argument.

Coverage

Method Endpoint
tickers() GET /v1/tickers
tickers(symbol="SPY") GET /v1/tickers?symbol=SPY

Market data

Method Endpoint
stock_quote(ticker, at=...) /v1/stockquote/{ticker}
option_quote(ticker, at=..., expiry=, strike=, type=) /v1/optionquote/{ticker}
surface(symbol, at=...) /v1/surface/{symbol}

Exposure analytics

Method Endpoint
gex(symbol, at=..., expiration=, min_oi=) /v1/exposure/gex/{symbol}
dex(symbol, at=..., expiration=) /v1/exposure/dex/{symbol}
vex(symbol, at=..., expiration=) /v1/exposure/vex/{symbol}
chex(symbol, at=..., expiration=) /v1/exposure/chex/{symbol}
exposure_summary(symbol, at=...) /v1/exposure/summary/{symbol}
exposure_levels(symbol, at=...) /v1/exposure/levels/{symbol}
narrative(symbol, at=...) /v1/exposure/narrative/{symbol}
zero_dte(symbol, at=..., strike_range=) /v1/exposure/zero-dte/{symbol}

Composite & vol

Method Endpoint
stock_summary(symbol, at=...) /v1/stock/{symbol}/summary
volatility(symbol, at=...) /v1/volatility/{symbol}
adv_volatility(symbol, at=...) /v1/adv_volatility/{symbol}
vrp(symbol, at=...) /v1/vrp/{symbol}
max_pain(symbol, at=..., expiration=) /v1/maxpain/{symbol}

Errors

from flashalpha_historical import (
    FlashAlphaHistoricalError,    # base
    AuthenticationError,          # 401
    TierRestrictedError,          # 403 — needs Alpha plan
    InvalidAtError,               # 400 — bad `at` format
    NoDataError,                  # 404 — outside coverage / inside gap
    SymbolNotFoundError,          # 404 — symbol not at this `at`
    NoCoverageError,              # 404 — symbol not in historical dataset
    InsufficientDataError,        # 404 — surface grid too sparse
    RateLimitError,               # 429
    ServerError,                  # 5xx
)

try:
    hx.exposure_summary("SPY", at="2017-01-01")  # before coverage starts
except NoDataError as e:
    print("gap:", e)

Known gaps from live (intentional, documented)

  • optionquote.bidSize / askSize — always 0 (minute table has no sizes)
  • optionquote.volume / gex.call_volume / put_volume — always 0
  • optionquote.svi_volnull with svi_vol_gated: "backtest_mode"
  • narrative.data.top_oi_changes — empty array (no prior-day OI diff yet)
  • gex.call_oi_change / put_oi_change — always null
  • stock_summary.macro.vix_futures / fear_and_greednull
  • vrp.macro.hy_spread — hard-coded 3.5
  • 0DTE intraday greeks (delta/gamma/theta/iv) often 0 / null — chain still listed for OI analysis

License

MIT

Get access

The Historical API requires the Alpha tier ($1,499/mo): the only public source of aggregate vanna/charm exposure and point-in-time replay since 2017.

Quant teams, prop desks, and vol funds: flashalpha.com/for-quant-teams

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flashalpha_historical-0.4.0rc12.tar.gz (31.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flashalpha_historical-0.4.0rc12-py3-none-any.whl (31.7 kB view details)

Uploaded Python 3

File details

Details for the file flashalpha_historical-0.4.0rc12.tar.gz.

File metadata

File hashes

Hashes for flashalpha_historical-0.4.0rc12.tar.gz
Algorithm Hash digest
SHA256 e11ed782abea1be77bb925b69153cd49b5209161ab67523b5dcc61096ce95336
MD5 22f62cfddb7b6b424bda517e9bce1a7c
BLAKE2b-256 f25deec80ae7d0259fc1eaa5478779f9064266a64e0168dad4ac0684803fd409

See more details on using hashes here.

File details

Details for the file flashalpha_historical-0.4.0rc12-py3-none-any.whl.

File metadata

File hashes

Hashes for flashalpha_historical-0.4.0rc12-py3-none-any.whl
Algorithm Hash digest
SHA256 8d8ec69b6d6c4e93470ca4969393d959bee40459834fed827ff1c59e97ae3850
MD5 d044885fb88bd33d01e528cb570a20ab
BLAKE2b-256 c11d660393377f4abcb9b058a2d171a433b5c43c68399fef6cd6b752ee96f1f1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page