forked from animatedread/Warrior_EA
POWER is the real find of the three: daily temperature -> degree days -> natural-gas demand is the textbook gas fundamental, numeric and daily. But it is point data needing construction into a national series (NOAA CPC ships that ready-made), and its target symbol is not traded yet - fetch code written for a chart nobody attaches first runs months later, unobserved, which is the silent-FRED failure shape. Queued for the AvaTrade expansion, not refused. FIRMS: re-raised, nothing changed since it was parked - point fire detections behind the same unproven proxy chain. GIBS: imagery tiles, not numbers; our CONV is 1D and NASA already sells the extracted products. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
106 lines
11 KiB
Markdown
106 lines
11 KiB
Markdown
# Alternative Data — Design & Source Adjudication
|
|
|
|
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/*)
|
|
│ writes observed,published,value CSVs
|
|
▼
|
|
c:\...\Workspaces\Market Data\altdata\{cot,fred,eia,...}\*.csv (research root)
|
|
│ python -m altdata.join (as-of join, per-symbol feature matrix)
|
|
▼
|
|
Common\Files\Warrior_EA\AltData\{SYMBOL}_D1.csv (EA-facing contract)
|
|
│ EA: FileOpen(...,FILE_READ|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_COMMON)
|
|
▼
|
|
feature window → NN input block (alt features appended like the meta descriptor)
|
|
```
|
|
|
|
EA contract (to implement): one CSV per symbol, rows `bar_time;f1;..;fn`,
|
|
header row names the features, sidecar `.meta` carries feature count + last
|
|
update stamp. Missing/stale file ⇒ features fed as "missing" flags, EA trades
|
|
on (degraded, never blocked). Tester reads the same files — history is fully
|
|
reproducible because every row was as-of joined.
|
|
|
|
## Feature derivation (join.py, next)
|
|
|
|
Per symbol from COT (the literature-standard set, deliberately small):
|
|
- net speculative position / open interest (Lev_Money or M_Money net ÷ OI)
|
|
- 1y and 3y COT index (percentile of net position) — positioning EXTREMES
|
|
- 4-week change in net position
|
|
- dealer/commercial net (the other side)
|
|
- USDJPY/USDCAD: sign flipped at this step; sidecar documents it
|
|
From FRED: level + 5-day change of VIX, T10Y2Y, DTWEXBGS, T5YIE; NFCI weekly.
|
|
From EIA (XTIUSD only): stocks level vs 5y seasonal norm, 1w change.
|
|
|
|
First measurement (before any NN touches this): the existing MI/permutation
|
|
harness over these features vs the excursion targets (RANGE first — the proven
|
|
predictable channel — then the barrier label), family-wise gated, on D1. Cheap,
|
|
uses only already-validated machinery, and tells us which families earn a slot
|
|
in the feature window.
|
|
|
|
## EA-side plan (staged, in order)
|
|
|
|
1. `join.py` + first MI measurement (offline only, no EA changes).
|
|
2. AltData reader module in the EA (mirrors MetaCorpus.mqh patterns; share
|
|
flags per the tester FileCopy lesson).
|
|
3. Classic-signal removal refactor (separate branch; the sweep/corpus and
|
|
signal-DB machinery is entangled with classic patterns — the candidate
|
|
stream they provided has to be replaced or retired in the same commit).
|
|
4. Wyckoff tuner optimization + input-menu pruning.
|
|
|
|
## Keys needed (all free registrations, user action)
|
|
|
|
Put in `Market Data\altdata\keys.json` as `{"fred": "...", "eia": "..."}`:
|
|
- FRED: https://fred.stlouisfed.org/docs/api/api_key.html
|
|
- EIA: https://www.eia.gov/opendata/register.php
|
|
- (later, optional) Finnhub, NASA FIRMS.
|