2026-08-16. Context: the private-use pivot (marketplace variant dropped; DLLs,
Python, WebRequest all permitted). Motivation: every price-derived signal
family measured to date is real-but-priced-to-cost (see the cost-boundary
verdicts). Alternative data is information the retail cost boundary has not
consumed — but only if the lookahead discipline below is followed exactly.
## Decisions taken (user, 2026-08-16)
- MQL5 Marketplace variant **dropped**. Private bot; any future sale is via the
user's own site, unrestricted. Consequences: DLL import restrictions gone,
WebRequest whitelisting is our own choice, the OpenCL-as-client-tier
constraint is obsolete, The5ers copy-trading collision dissolved.
- Classic signals: to be **removed** for codebase hygiene (staged, separate
refactor — see "EA-side plan").
- Wyckoff: **keep** (only feature family with replicated context value);
optimize the auto-tuner instead of deleting; prune input-menu surface.
- Bridge preference: MQL5 + files/DLLs. Python is an external collector only;
the EA must never block on Python at trade time.
## The two rules that keep alt data honest
1.**Vintage rule.** Every row carries `observed` (the period described) and
`published` (when it became publicly knowable, UTC). All joins to price bars
use `published <= bar_open`. Revised series (FRED, EIA) must be fetched as
FIRST PRINTS (ALFRED vintages), never current values — the calendar
recorder's post-revision trap generalizes to every macro source.
2.**Family-wise rule.** Every feature family added here multiplies the
best-of-N space. Any "this alt feature clears" claim goes under the null of
the maximum, same as always. Alt data changes the information set, not the
statistics discipline.
## Source adjudication (the pasted list, corrected)
| Source | Verdict | Notes |
|---|---|---|
| **CFTC COT** (not in the list!) | **BUILT, no key, 2010→now on disk** | Weekly positioning: TFF (ES, VIX, BTC, EUR/JPY/CAD/GBP futures) + Disaggregated (GC, CL). The best free source for this project: 16y of history = trainable TODAY, documented literature (positioning extremes / COT index), weekly cadence fits D1. Sign flip needed for USDJPY/USDCAD (futures are JPY/USD, CAD/USD). |
| **FRED/ALFRED** | **BUILT, needs free key** | 800k series, but the value is ALFRED vintages (first prints). Daily: VIX, yields, breakevens, dollar index, WTI spot; weekly: NFCI, Fed balance sheet. |
| **EIA weekly petroleum** | **BUILT, needs free key** | Crude stocks/production/refinery utilization for XTIUSD. Weekly, Wednesday 10:30 ET release. The *surprise* vs consensus is the tradeable object; consensus history is the hard part (record forward). |
| Options OI / GEX — **CBOE delayed-quotes CDN** | **BUILT (recorder), no key** | `cdn.cboe.com/api/global/delayed_quotes/options/{TICKER}.json` — supersedes the yfinance route and the earlier "CBOE is UA-gated" note, which was about a *different* CBOE path: this CDN returns 200 with no User-Agent at all (verified 2026-08-16, four UA variants), so MQL5 `WebRequest` reaches it unaided. Ships per-contract **gamma and open interest**, so no pricing model — and no model risk — enters the recorded data. Validated on `_SPX`: 29,362 rows, 20,993 with nonzero gamma, 54 expiries, 13 MB, total GEX +90.7 Bn/1%. Still SNAPSHOT-ONLY: the EA records one row per trading day (`gex_{CANONICAL}.csv`) and feeds nothing until the file is long enough to screen. |
| **FlashAlpha** | **NOT BUYING — history is paywalled at $1,499/mo** | Sells point-in-time chain replay since 2018-04 with per-strike OI + gamma, which would have let us compute *our own* GEX construction on their history and screen years early. Killed by pricing (checked 2026-08-16): **the Historical API is Alpha-tier exclusive at $1,499/month**; Basic ($79, 250 req/day) and Growth ($299) are LIVE only. The archive was the only thing we wanted, so no affordable tier helps — Basic would buy 15-second freshness for a once-a-day snapshot, worth nothing. **Free tier probed 2026-08-16 (3 requests), tier gates now known empirically:** ETFs (SPY/QQQ/IWM) need Basic; full-chain all-expirations needs Growth; historical needs Alpha — so free/Basic are single-expiry-per-request. The one 200 response (`AAPL?expiration=2026-09-18`) had the right schema but a **nearly empty payload**: 13 of 93 strikes with any OI, total call OI 4,296 vs CBOE's 373,253 for the same expiry, put OI zero, every near-money strike blank. **No validation was possible** — nothing to compare against, and from outside we cannot separate free-tier degradation from their flow-signed methodology (strikes without classified tape may simply not appear). Net: **the free CBOE CDN is strictly better than Basic here** — complete chains, all expiries and strikes, gamma + OI populated, unlimited, $0. Note `github.com/FlashAlpha-lab/awesome-options-analytics` is this vendor's own list, not a neutral survey. |
| Historical option-chain archives (if we ever want to skip the wait) | **Price-check bulk sellers, not analytics APIs** | The distinction that matters: analytics APIs charge for *live convenience* and meter requests; bulk vendors sell the *archive* as files, which is what a one-off backfill actually needs. Candidates to price: CBOE DataShop (one-time dataset purchase), historicaloptiondata.com, Thetadata, Polygon, ORATS. But note the EV: the recorder banks this history for free in ~12 months, and on this project's own base rate most alt-data families die at the incremental gate (EIA null, tick-flow direction null, drift dead to financing). Paying four figures to test GEX a year early is a poor trade; waiting costs nothing. |
| Finnhub news/sentiment | Deferred | Free tier is real but news sentiment history is shallow; social sentiment endpoints have moved tiers repeatedly. Forward-record if used; never backfill from a "historical sentiment" endpoint whose values were computed retroactively. |
| Stocktwits | Deferred | API locked down significantly; scraping ToS-fragile. Low priority. |
| NASA FIRMS (flares) | Parked | Reachable, free key. Creative but unproven proxy chain (thermal anomaly → refinery outage → CL price) with no cheap validation path. Revisit after COT/EIA prove or disprove the pipeline. Re-raised by the user 2026-08-16 — nothing changed: still point detections needing aggregation through the same proxy chain. |
| **NASA POWER** (daily weather, no key) | **QUEUED behind NATGAS becoming a traded symbol** | The one NASA API with a mechanism-bearing, numeric, daily series for a catalog instrument: temperature → heating/cooling degree days → natural-gas demand is the textbook gas fundamental. But it is per-lat/lon point data, so the feature (US population-weighted HDD/CDD) must be CONSTRUCTED from ~10 city points — and NOAA CPC publishes ready-made national degree-day series, likely the better source for the same object. Neither of the currently traded symbols (SP500/EURUSD/USDJPY/XAUUSD) is weather-linked at range horizon (weather→equities is the Hirshleifer sunshine literature: direction, tiny, sentiment-based — not range). Wire when a NATGAS/agri chart exists, WITH bars to screen against; writing fetch code today for a symbol nobody attaches means it first runs months from now, unobserved — the silent-FRED incident's exact shape. |
| NASA GIBS (satellite imagery) | Not consumable | Imagery tile layers, not numeric series. Extracting a tradeable number needs a CV pipeline; our CONV is 1D by design (see the satellite adjudication — NASA's own CNNs already ship EXTRACTED point products, which is what FIRMS is). If imagery-derived data ever matters, buy the extracted product, don't rebuild the extractor. |
| Binance/CoinGecko (BTC) | Parked until broker BTC confirmed | Binance Vision does have deep free history (trades, funding, OI) — genuinely good if BTCUSD becomes a traded symbol. COT Bitcoin already collected (2017→now). |
| `PythonExecute()` from MQL5 | **Does not exist** | MT5's Python support is the `MetaTrader5` package: an external Python process connecting TO the terminal. The EA-side bridge is files (chosen) or a DLL; WebRequest is available for live-time pulls if ever needed. |
## Architecture
```
[scheduled task, e.g. hourly]
python -m altdata.cot / fred / eia / recorder (research/altdata/*)