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.0rc9.tar.gz (29.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.0rc9-py3-none-any.whl (30.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: flashalpha_historical-0.4.0rc9.tar.gz
  • Upload date:
  • Size: 29.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for flashalpha_historical-0.4.0rc9.tar.gz
Algorithm Hash digest
SHA256 06932adcce0e4f4529c1837fa003acba1fe6fcb8d916bb520f6ed890b32a382a
MD5 d94ba50aa20bb84c242bff844dcd19b9
BLAKE2b-256 18afda0e1d5742daaadb53c140397584053a916e9151719c93586197e1cfa58e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashalpha_historical-0.4.0rc9-py3-none-any.whl
Algorithm Hash digest
SHA256 512426932d1a69a98b9961bec08442adafb23d5924c2eda0cead81de76371b7c
MD5 bde8f4c9f4554689bd7ac1df24b1b6e8
BLAKE2b-256 ad7d121a8126b59d4e262e45c2c8824debee9548bd28707d12ebde7f73bff4ab

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