spb/hfmarketdata
Public
Open high-frequency market data platform — FirstRate full-history downloader, DuckDB/Parquet lake, open REST API and React docs platform (www.hfmarketdata.io)
JavaScript 53.7%
Python 38.3%
CSS 4.6%
TypeScript 3.1%
-
Sun, Sep 6, 2026 1
-
fundamentals: co-déclarants (clé (cik, accn)), poller borné, dictionnaire de couverture
…
E1 — edgar_filings : clé primaire composite (cik, accn) + index sur accn. Un numéro d'accession est partagé par les co-déclarants (famille Entergy 65984/66901/…) : la PK sur accn seule faisait échouer tout _upsert_filings (IntegrityError, 18 entreprises jamais ingérées). Migration idempotente (fundamentals/migrations.py) : inline au démarrage si ≤ 300 k lignes, sinon avertissement + scripts/migrate_edgar_filings.py à lancer avant le déploiement ; l'upsert passe par INSERT … ON CONFLICT DO NOTHING et tolère l'ancien schéma pendant la transition. _known_pairs raisonne en paires (cik, accn) sans balayer la table ; publish_filing_event produit un événement par co-déclarant. E2 — poller incrémental : filtre des entrées Atom par TRACKED_FORMS (le flux type=8-K renvoie des 8-K/A : Genasys ré-ingéré à chaque cycle pendant 41 h) ; TRACKED_FORMS étendu aux amendements et rapports de transition ; garde-fou Redis edgar:seen_accn (TTL 7 j) + edgar:failed_accn (3 tentatives) ; companyfacts_404 enregistre quand même les dépôts et n'est plus compté comme échec (1 671 « failures » venaient de deux CIK sans facts retentés à chaque cycle) ; failure_samples désormais cumulés (plus écrasés par un cycle sain) ; index quotidien : jours ouvrables seulement, 403/404 = non publié (les master.idx de fin de semaine n'existent pas) ; bulk rebuild seulement si des lignes ont changé ; httpx en WARNING dans le script. E3 — fund_statements.coverage (1,17 Ko × 1,22 M lignes = 1,9 Go) → dictionnaire fund_coverage_blob(id, sha1, json) référencé par coverage_id ; lecture hybride (JSON inline hérité OU référence) dans service._rows et bulk.build ; _replace_statements ne réécrit que si l'empreinte des lignes a changé ; scripts/migrate_coverage.py convertit l'existant par lots avec reprise (--vacuum optionnel) ; auto_vacuum=INCREMENTAL sur une base jeune + incremental_vacuum dans edgar_reconcile. Tests : tests/test_fundamentals_ingest.py (co-déclarants, boucle du poller, retries, échantillons, 403 index, réécriture conditionnelle, dictionnaire, migration). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
-
Fri, Sep 4, 2026 1
-
fundamentals: scripts edgar_backfill (manifeste reprenable, --from-zip), edgar_incremental (cycle 2 min, événements Redis) et edgar_reconcile (échantillon de 20 sociétés)
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-