Objective
Fetch 9 missing TradingView daily closes required for the Pine cumulative NH-NL breadth fidelity audit (qm-kdnj.4) and persist them to data/market.sqlite with provenance so offline repro succeeds. Acceptance: SELECT instruments shows 9 tickers with spans and n_rows; parquet caches present; pytest offline passes.
Approach
- Feasibility — Confirmed TradingView INDEX:* free WebSocket source via existing research.tv_scrape.client:fetch_tradingview_history, same class as already-tracked INDEX:HIGN/LOWN/S5FI, no credentials or license block, public redistribution via tracked market.sqlite (95MB soft limit), point-in-time provenance, idempotent upsert.
- Acquisition — Reused centralized client (fetch_tradingview_history + bars_to_ohlcv with Origin/User-Agent, pagination more_rounds=12). Verified live probe: MAHX/MALX 5440 rows 2005-01-03->2026-08-17, MAHN 5419, MALN 5376, MAHQ 5439, MALQ 5440, NADC 2530 2016-07-01->2026-08-17, MADP 2547, MADC 2548.
- Import — Transactional workflow with temp-DB pre-test: copied market.sqlite to /tmp/test_market_import.sqlite, upserted all 9 via backtest.datastore:upsert_ohlcv (DELETE+INSERT, source=tradingview), verified instruments+ohlcv counts, then repeated on real DB with backup rollback (104275968B, +3.4MB) and wrote 9 parquet caches via backtest.data:_cache_path (35-88KB each).
- Dependencies — No catalog/Meta regression (no published strategy listed these tickers); verified backtest.nhnl_breadth:cumu_nhnl_z50_components computes offline on nets (MAHX-MALX etc.) and singles with window=50 ddof0 sell=zs<0; 17 nhnl + 60 engine/datastore tests passed.
- Coverage — Rebuilt via canonical producer python3 -m research.reports coverage (139 strategies, 82 instruments, db_warm true, 139 patched) and fixed shared artifact drift via research.artifacts build --offline (11 artifacts).
Files changed
data/market.sqlite— 39179 rows added: INDEX:MAHX 5440, MALX 5440, MAHN 5419, MALN 5376, MAHQ 5439, MALQ 5440, NADC 2530, MADP 2547, MADC 2548; instruments start 2005-01-03 for MA* and 2016-07-01 for NADC/MADP/MADC, end 2026-08-17, source tradingview, updated_at 2026-08-18T13:33:04Z/05Z; 100786176 -> 104275968 bytesdata/cache/INDEX_MAHX.parquet(87764B),INDEX_MALX.parquet(88562B),INDEX_MAHN.parquet(81251B),INDEX_MALN.parquet(80574B),INDEX_MAHQ.parquet(80628B),INDEX_MALQ.parquet(82860B),INDEX_NADC.parquet(35898B),INDEX_MADP.parquet(39858B),INDEX_MADC.parquet(47428B) — gitignored but offline-promotable via _promote_ohlcv_parquetdocs/site-data/coverage.json+docs/coverage.html+docs/site-data/strategies/*.json— regenerated via research.reports coverage (generated_at 2026-08-18T13:35:14Z)docs/.shared-artifact-manifest.json+docs/research/catalog-canary/payloads/sixty-forty.json— regenerated via research.artifacts buildresearch/results/qm-spx0.md— this entry;docs/site-data/results.json+docs/results.htmlvia research.reports.results
Validation
SELECT ticker, source, start_date, end_date, n_rows FROM instruments WHERE ticker IN ('INDEX:MAHX',...)— 9 rows as above, verifiedls data/cache/INDEX_*.parquet— 11 files (9 new + HIGN/LOWN) presentPYTHONPATH=. python3 -c "from backtest.datastore import read_ohlcv; read_ohlcv('INDEX:MAHX')"— 5440 rows offline; parquet promote intactPYTHONPATH=. python3 -c "from backtest.datastore import read_ohlcv; from backtest.nhnl_breadth import cumu_nhnl_z50_components"— nets + singles compute cum/sma/stdev/zs/sell with 50-bar nan guard, last zs ~1.3-1.4 sell Falsepython3 -m pytest -q tests/test_engine.py tests/test_datastore.py tests/test_nhnl_breadth.py— 77 passed, 2 warningspython3 -m research.artifacts check --mode full --offline— passed after build (11 deterministic)python3 research/scripts/check_static_reports.py docs— local bundle OK: 1224 files; 182 canary routespython3 -m research.pipeline validate && python3 -m research.pipeline verify --offline— 28 nodes 38 edges, 10 scenarios passed
Results
9 Pine breadth tickers now fully materialized offline (2005-01-03 or 2016-07-01 -> 2026-08-17). Backtest.nhnl_breadth Pine fidelity no longer blocked — cumu z50 for all 6 Pine indexData branches (Total MAHX-MALX net, NYSE MAHN-MALN, NASDAQ MAHQ-MALQ, Russell MADC, S&P MADP, Nasdaq100 NADC) computes deterministically offline and matches TradingView-ta semantics. No catalog/Meta windows changed. Parent qm-kdnj.4 can resume full-span date-fidelity audit and qm-kdnj experiment republish. DB + parquet repro hashable and tracked.
Links
- Task:
qm-spx0 - Parent epic:
qm-kdnj.4(Re-audit cumulative NH-NL Pine fidelity) - Code:
research/tv_scrape/client.py,backtest/datastore.py,backtest/data.py,backtest/nhnl_breadth.py - Data:
data/market.sqlite,data/cache/INDEX_*.parquet - Reports:
docs/site-data/coverage.json,docs/coverage.html