Skip to main content

Python SDK for the FlashAlpha Historical API — point-in-time replay of GEX, gamma flip, VRP, narrative, max pain, and the full stock summary at any minute back to 2018-04-16. Backtest options strategies against 6.7B+ option rows.

Project description

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 2018-04-16, in the same response shape as the live API.

Coverage: SPY 2018-04-16 → today, with daily extensions; more symbols added on demand.

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

Project details


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.0rc10.tar.gz (30.3 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.0rc10-py3-none-any.whl (31.4 kB view details)

Uploaded Python 3

File details

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

File metadata

File hashes

Hashes for flashalpha_historical-0.4.0rc10.tar.gz
Algorithm Hash digest
SHA256 6cd49e87927fe923b945133e45bcb797d5bcb5785659ce8dcb3bd32b5d658d07
MD5 2e00673b0d72a321cc4286964e36bbcd
BLAKE2b-256 e583777bfd104533552b06eaafce1fef831513f36b30fd766078ba1914d2c39a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashalpha_historical-0.4.0rc10-py3-none-any.whl
Algorithm Hash digest
SHA256 67697811ac94f44691c3e20386dd7494830e84d82e75b59a02de727dc149dd8e
MD5 3d1f37a6abf76544a2b44ee1ea495e1a
BLAKE2b-256 5ec2f9122491c639f37a8b745ada9e4366abab1d2ce5ec79d3638a4352e9f352

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 Pingdom Monitoring Sentry Error logging StatusPage Status page