FlashAlpha options-flow and dealer-positioning data as QuantConnect LEAN custom-data bars. GEX, DEX, VEX, vol surface, 0DTE, VRP, max-pain.
Project description
flashalpha-quantconnect
FlashAlpha options-flow and dealer-positioning data as native QuantConnect LEAN custom-data bars — C# (NuGet) and Python (PyPI).
Subscribe to GEX (gamma exposure), DEX, VEX, CHEX, the full exposure summary, a smoothed implied-vol surface, 0DTE pin-risk + dealer hedging flows, max-pain, VRP (variance risk premium), advanced volatility (SVI, variance swaps), narrative summaries, stock + option quote books, a coverage universe — seventeen endpoint families — and read them from OnData exactly like any other LEAN bar. Backtest dealer-flow strategies on QuantConnect Cloud or self-hosted LEAN with one AddData<…> line per data type.
What it does
flashalpha-quantconnect is the official QuantConnect LEAN bridge for the FlashAlpha historical API. It plumbs FlashAlpha's options-flow and dealer-positioning analytics into LEAN as first-class custom-data bars so a backtest just calls AddData<FlashAlphaGexBar>("SPY") (or algorithm.AddData(GexBar, "SPY") in Python) and the bars stream into OnData with full per-strike detail — gamma flips, pin probabilities, IV grids, 0DTE Greeks, VRP scores — all timestamped, all replayable, all version-pinned to the underlying SDK so schema drift dies at compile time.
| Family | Endpoint slug | C# bar class | Python bar class |
|---|---|---|---|
| GEX | exposure/gex |
FlashAlphaGexBar |
GexBar |
| DEX | exposure/dex |
FlashAlphaDexBar |
DexBar |
| VEX | exposure/vex |
FlashAlphaVexBar |
VexBar |
| CHEX | exposure/chex |
FlashAlphaChexBar |
ChexBar |
| Exposure summary | exposure/summary |
FlashAlphaExposureSummaryBar |
ExposureSummaryBar |
| Exposure levels | exposure/levels |
FlashAlphaExposureLevelsBar |
ExposureLevelsBar |
| Vol surface | surface |
FlashAlphaSurfaceBar |
SurfaceBar |
| Zero-DTE | exposure/zero-dte |
FlashAlphaZeroDteBar |
ZeroDteBar |
| Max pain | max-pain |
FlashAlphaMaxPainBar |
MaxPainBar |
| Volatility | volatility |
FlashAlphaVolatilityBar |
VolatilityBar |
| Advanced vol | adv-volatility |
FlashAlphaAdvVolatilityBar |
AdvVolatilityBar |
| VRP | vrp |
FlashAlphaVrpBar |
VrpBar |
| Narrative | narrative |
FlashAlphaNarrativeBar |
NarrativeBar |
| Stock summary | stock/summary |
FlashAlphaStockSummaryBar |
StockSummaryBar |
| Stock quote | stock/quote |
FlashAlphaStockQuoteBar |
StockQuoteBar |
| Option quote | option/quote |
FlashAlphaOptionQuoteBar |
OptionQuoteBar |
| Tickers (coverage) | tickers |
FlashAlphaTickersBar + universe |
TickersBar + universe |
Full reference: docs/data-types.md.
Install
QuantConnect Cloud (C# or Python)
Both packages are pre-installed in QC Cloud — no pip install or NuGet ceremony. Add your API key to Project → Parameters with the key flashalpha-api-key and paste the value (get one at flashalpha.com). The bridge resolves it via GetParameter on the first request.
Self-hosted LEAN — C# (NuGet)
dotnet add package FlashAlpha.QuantConnect
Or in .csproj:
<PackageReference Include="FlashAlpha.QuantConnect" Version="0.1.0" />
Set the key as an env var so LEAN picks it up:
export FLASHALPHA_API_KEY="fa_live_..."
Self-hosted LEAN — Python (PyPI)
pip install flashalpha-quantconnect
Same env var:
export FLASHALPHA_API_KEY="fa_live_..."
Full auth setup — including CI secrets and key resolution order — lives in docs/auth.md.
QuantConnect GEX — first algorithm
Long when the dealer gamma regime is positive, flat otherwise. Sixty seconds, both languages.
C#
using FlashAlpha.QuantConnect;
using FlashAlpha.QuantConnect.Data;
using QuantConnect;
using QuantConnect.Algorithm;
using QuantConnect.Data;
public class GexRegimeAlgorithm : QCAlgorithm
{
private Symbol _spy;
private Symbol _gex;
public override void Initialize()
{
SetStartDate(2024, 1, 1);
SetEndDate(2024, 12, 31);
SetCash(100_000);
_spy = AddEquity("SPY", Resolution.Daily).Symbol;
_gex = this.AddFlashAlphaGex("SPY").Symbol;
}
public override void OnData(Slice slice)
{
if (!slice.ContainsKey(_gex)) return;
var bar = slice.Get<FlashAlphaGexBar>(_gex);
if (bar == null) return;
var longRegime = bar.NetGexLabel == "positive";
SetHoldings(_spy, longRegime ? 1.0m : 0m);
}
}
Python
from AlgorithmImports import *
from flashalpha_quantconnect import GexBar, add_flashalpha_gex
class GexRegimeAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2024, 1, 1)
self.SetEndDate(2024, 12, 31)
self.SetCash(100_000)
self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol
self.gex = add_flashalpha_gex(self, "SPY").Symbol
def OnData(self, slice):
if self.gex not in slice:
return
bar = slice[self.gex]
long_regime = bar.NetGexLabel == "positive"
self.SetHoldings(self.spy, 1.0 if long_regime else 0.0)
Five more end-to-end recipes — pair-by-ticker with equity bars, 0DTE pin-risk gating, vol-surface snapshots, universe selection by GEX regime — are in docs/recipes/.
Data catalog
Every bar lives at https://historical.flashalpha.com/docs/<endpoint>. Full field tables and side-by-side OnData samples are in docs/data-types.md.
| Family | Endpoint | C# class | Python class |
|---|---|---|---|
| GEX | exposure/gex |
FlashAlphaGexBar |
GexBar |
| DEX | exposure/dex |
FlashAlphaDexBar |
DexBar |
| VEX | exposure/vex |
FlashAlphaVexBar |
VexBar |
| CHEX | exposure/chex |
FlashAlphaChexBar |
ChexBar |
| Exposure summary | exposure/summary |
FlashAlphaExposureSummaryBar |
ExposureSummaryBar |
| Exposure levels | exposure/levels |
FlashAlphaExposureLevelsBar |
ExposureLevelsBar |
| Vol surface | surface |
FlashAlphaSurfaceBar |
SurfaceBar |
| Zero-DTE | exposure/zero-dte |
FlashAlphaZeroDteBar |
ZeroDteBar |
| Max pain | max-pain |
FlashAlphaMaxPainBar |
MaxPainBar |
| Volatility | volatility |
FlashAlphaVolatilityBar |
VolatilityBar |
| Advanced vol | adv-volatility |
FlashAlphaAdvVolatilityBar |
AdvVolatilityBar |
| VRP | vrp |
FlashAlphaVrpBar |
VrpBar |
| Narrative | narrative |
FlashAlphaNarrativeBar |
NarrativeBar |
| Stock summary | stock/summary |
FlashAlphaStockSummaryBar |
StockSummaryBar |
| Stock quote | stock/quote |
FlashAlphaStockQuoteBar |
StockQuoteBar |
| Option quote | option/quote |
FlashAlphaOptionQuoteBar |
OptionQuoteBar |
| Tickers (coverage) | tickers |
FlashAlphaTickersBar |
TickersBar |
Sugar extensions: every bar has a one-liner — algo.AddFlashAlphaGex("SPY") in C#, add_flashalpha_gex(self, "SPY") in Python — that's equivalent to AddData<FlashAlphaGexBar>("SPY", Resolution.Daily) / self.AddData(GexBar, "SPY", Resolution.Daily) with the daily default already baked in.
Auth
Get an API key at flashalpha.com. The bridge resolves the key in this order:
- Explicit override —
FlashAlphaConfig.ApiKey = "fa_live_…"in C#,config.api_key = "fa_live_…"in Python. - QC Cloud parameter — set
flashalpha-api-keyunder Project → Parameters. - Environment variable —
FLASHALPHA_API_KEYfor self-hosted LEAN.
If all three miss the bridge throws FlashAlphaAuthMissingException (error code FA-AUTH-001). Full setup — including CI, dotenv, and secrets hygiene — in docs/auth.md.
Resolution → API cost
LEAN resolution drives how often the bridge calls the FlashAlpha API. Pick the lowest resolution that satisfies your strategy.
| LEAN resolution | FlashAlpha calls per ticker per trading day | Notes |
|---|---|---|
Resolution.Daily |
1 | Default. One end-of-day snapshot. Cheapest. |
Resolution.Hour |
~7 | RTH hourly bars (09:30, 10:30, … 15:30). |
Resolution.Minute |
~390 | Heavy. Use for research minute-of-the-day studies. |
Resolution.Tick |
not supported | The historical API isn't tick-granular. |
A 252-day daily backtest of GEX on SPY is 252 API calls. The same backtest at minute resolution is ~98k calls — same data, just more snapshots per session.
QuantConnect 0DTE — recipes
Five end-to-end recipes, each a copy-paste template:
- Subscribe to GEX in QuantConnect — basics.
- Filter universe by GEX regime —
FlashAlphaTickersUniverse+ per-name GEX gating. - Combine FlashAlpha with equity data — pair
AddEquityandAddData<…>by ticker string inOnData. - 0DTE pin-risk check in QuantConnect — gate 0DTE entries on dealer-pin score.
- Vol-surface snapshot in QuantConnect — read the IV grid, interpolate at a custom strike/tenor.
FAQ
Why does FlashAlpha use a separate custom-data Symbol from AddEquity?
QC's custom-data subscription system mints a fresh Symbol for each AddData<T>(ticker, …) call — distinct from the equity Symbol returned by AddEquity(ticker, …). The two are not interchangeable in Slice lookups. Typical algos hold both symbols as fields and pair them by ticker string in OnData. There's a worked example in docs/recipes/combine-flashalpha-with-equity-data.md and a deeper dive at docs/troubleshooting.md#why-two-symbols.
What's the API cost per backtest day?
One FlashAlpha API call per ticker per bar. At Resolution.Daily (the default) that's one call per ticker per trading day — a 252-day SPY-only GEX backtest is 252 calls. At Resolution.Minute it's ~390 calls per ticker per day. The bridge has an in-process cache so duplicate subscriptions on the same (endpoint, ticker, date) reuse the response.
Does this work in QC Cloud?
Yes. Both the NuGet and PyPI packages are available in the QC Cloud project environment. Add your API key under Project → Parameters with the key flashalpha-api-key and the bridge picks it up via GetParameter. No env-var setup needed.
How is this different from polygon/CBOE feeds?
Polygon and CBOE ship the raw chain — quotes, OI, Greeks. FlashAlpha ships the positioning analytics derived from that chain: net dealer GEX/DEX/VEX/CHEX, the gamma flip strike, call/put walls, 0DTE pin probability, dealer hedging-flow estimates, the smoothed IV surface and SVI parameters, VRP and harvest scores, plain-English narrative summaries. You can feed FlashAlpha and raw option data into the same algorithm — see docs/recipes/combine-flashalpha-with-equity-data.md.
Can I use this for live trading?
The current bar set targets the historical endpoint family — meant for backtests and research, not live signals. The same bars will work live in LEAN when the FlashAlpha realtime endpoints land; the subscription surface won't change. Track github.com/FlashAlpha-lab/flashalpha-quantconnect/issues for live-mode milestones.
What's the relationship to the flashalpha-historical SDK?
flashalpha-historical is the raw cross-language SDK for the FlashAlpha historical API — available for Python, .NET, Node, Go, and Java. flashalpha-quantconnect is the LEAN adapter on top of it. The bridge's C# bars depend on FlashAlpha.Historical's typed response models so any schema drift in the SDK breaks the build, never silently corrupts a bar. You generally don't import the SDK directly — AddData<…> is the user-facing surface.
Related
- historical.flashalpha.com — the underlying API.
- flashalpha-historical-python / -dotnet / -js / -go / -java — raw SDKs.
flashalpha-historical-examples(upcoming) — twenty-plus end-to-end backtest essays using this bridge.- LEAN custom data — QC's reference for how custom-data subscriptions work.
License
MIT. See LICENSE.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file flashalpha_quantconnect-0.1.0.tar.gz.
File metadata
- Download URL: flashalpha_quantconnect-0.1.0.tar.gz
- Upload date:
- Size: 35.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98cb211e8145da0a9e2e4a618cd9912ca0b2676bed0021e419f9d2aea77e526e
|
|
| MD5 |
c832ed70546340bce2c942c3f037901b
|
|
| BLAKE2b-256 |
6dbd781f730715e58806917279cad7a51db1569ed29ed8dfd22a623752be5fd3
|
File details
Details for the file flashalpha_quantconnect-0.1.0-py3-none-any.whl.
File metadata
- Download URL: flashalpha_quantconnect-0.1.0-py3-none-any.whl
- Upload date:
- Size: 32.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
682df5c1104e7b329b2cf7f9a523ab1bfec10a05861d85c8e6dd1279aa370a62
|
|
| MD5 |
f430de79e728a7cda89063fc8e5b13a0
|
|
| BLAKE2b-256 |
5acc3409666a14602a4bc25b9107ccfa0c68344c8eb8883afccefe741a7e1e11
|