Provide reproducible, point-in-time market, macro, membership, sector, and text inputs without silently replacing missing real observations with synthetic data. Network calls are cached so historical data is reused and only missing tails are requested.
market_data.pyandmacro_data.pyload yfinance data into incremental Parquet caches.point_in_time_universe.pyandliquid_universe.pyapply dated membership and lagged 63-session dollar-volume eligibility.fama_french.pydownloads the official daily research-factor ZIP once and reuses a decimal- return Parquet cache for beta estimation and attribution.fnspid.py,finmultitime.py, andremote_zip.pyimport historical text selectively and resumably. FinMultiTime ZIP members are fetched with HTTP byte ranges rather than downloading the full archive.text_store.pynormalizes and deduplicates all sources indata/raw/nlp_posts.parquet.confirmation_inputs.pyaudits prices, sectors, and news before confirmation can run.feature_store.pyaligns the audited inputs for feature engineering.sector_history.pyperforms backward as-of joins and incrementally extends trailing sector-ETF classifications without copying future sectors into earlier rows.corporate_actions.pycaches yfinance split dates/ratios and supports a pre-activation 1/5/20-session event study.
Synthetic data is allowed only for an explicit demo workflow. The public-confirmation manifest
sets market.use_demo_fallback: false, and both market and macro loaders fail closed.
- Public 2024 through 2025 Q1 confirmation requested 527 point-in-time stocks.
- Non-synthetic price and inferred-sector coverage: 505 stocks, or 95.8%.
- The 22 unavailable symbols were excluded before scoring with no substitutions.
- FinMultiTime import: 79,364 ticker-linked news rows.
- News coverage: 94.8% of confirmation business days.
- Incremental price caches and resumable news caches avoid repeated network and model work.
- Official daily Fama-French factors are cached locally with source URL, retrieval time, date range, row count, and a warning that the current research file is not a vintage archive.
- FinMultiTime market data ends on 2025-03-28, so the original full 2024-2025 confirmation contract remains unavailable.
- Inferred sectors use trailing relationships with sector ETFs rather than official historical GICS classifications.
- Split history is cached for the current live universe from 2024 onward; older delisted-symbol corporate actions remain incomplete.
- Most historical news provides only a publication date, not a tradable intraday timestamp.
- The public Fama-French file can be revised as source data and construction methods change; it is not a perfect point-in-time factor vintage.
python -m src.cli collect-news
python -m src.cli import-fnspid --help
python -m src.cli import-finmultitime --help
python -m src.cli prepare-confirmation-inputs --help
python -m src.cli download-fama-french --help
python -m src.cli run-split-event-study --help
python -m src.cli build-dataset --help- Add licensed or reproducible delisted-security prices and official effective-dated sectors.
- Record source, retrieval time, checksum, row count, and coverage with every dataset artifact.
- Acquire genuine publication timestamps before evaluating event-triggered execution.
- Keep all real-data paths fail closed and retain synthetic data only for tests and demos.