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)
- 129commits
- 1branches
- 0releases
- 24.7 MBon disk
- maindefault branch
- 1 mo agolast push
-
Sun, Sep 6, 2026 4
-
frd: row groups de 65 536 lignes pour l'intraday + script de réécriture reprenable du lac
…
- frd_downloader.csv_to_parquet : ROW_GROUP_SIZE 65536 pour 1min/5min/30min/1hour (déduit du chemin), 1 000 000 pour 1day/options - scripts/rewrite_row_groups.py : COPY (read_parquet) → tmp (ZSTD, ROW_GROUP_SIZE 65536) puis os.replace, fichier par fichier, manifeste JSON de reprise (state/row_groups.json), --dry-run, --asset, --timeframe, --workers, --max-files, --retry-failed ; ignore les fichiers déjà découpés ; vérifie le nombre de lignes avant le swap Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
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 5
-
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>
-
futures: tables SQLite (roots/contracts/gaps), index des fichiers du lac et backfill idempotent + CLI
…
- models.py : futures_roots, futures_contracts, futures_contract_gaps (plan §1.1–1.3 + expiration_source, aliases, timeframes JSON détaillé) - lake.py : découverte des fichiers futures_contracts/{tf}/{archive|update}, SQL de fusion dédupliquée sur datetime (update prioritaire) - backfill.py : un agrégat DuckDB par répertoire (filename=true), un scan 1day pour volume 20 séances / OI / trous > 3 jours ouvrés, statut, upserts ; modes --roots et --since (contrats touchés ré-agrégés sur tous leurs fichiers) - scripts/backfill_contracts.py : CLI (--roots, --since, --today, --json, -v) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> -
accounts: routes /v1/auth, /v1/me, /v1/limits, /v1/admin + CLI hfmd (users, keys, seed idempotent)
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>