Data Sources and Refresh

All data for the the project architecture dashboard flows through the medallion pipeline from yfinance API to the gold layer. This note documents every data source, its refresh cadence, and the pipeline schedule.

Data Sources

DataSourceRefresh
Price, volume, market capyfinance (via daily pipeline)3×/day (09:00, 17:00, 22:00 UTC)
Forward P/E, P/B, EV/EBITDAyfinance info dictDaily with signals
Analyst target, recommendationyfinance info dictDaily with signals
Dividend yield, betayfinance info dictDaily with signals
Quarterly financialsyfinance quarterly dataWhen new quarter reported
Governance risk scoresyfinance quarterly dataWhen new quarter reported
Ticker membershipIndex composition reference dataHourly refresh
Pulse (intraday price)yfinanceEvery 5 minutes

Pipeline Schedule

The Airflow DAGs orchestrate three daily pipeline runs timed to capture market closes across global regions:

Run Time (UTC)PurposeMarkets Captured
09:00Morning runAsia/Pacific index close
17:00Afternoon runEuropean equity index close
22:00Evening runUS equity index close

Why Three Runs

The three tracked indices — a European equity index, an Asia-Pacific equity index, and a US equity index — close at different times across different time zones. Running the pipeline three times per day ensures each index’s closing prices are captured promptly. See date-and-time-handling for timezone management in the pipeline.

Data Flow

yfinance API → JSON files → Bronze (raw) → Silver (cleaned) → Gold (scored) → Dashboard
  1. Bronze: Raw yfinance data lands as-is in bronze.* tables
  2. Silver: Deduplication, type casting, gap-filling in silver.* tables
  3. Gold: Z-scores, composite scores, rankings in gold.* tables

Refresh Impact on Scoring

Data TypeStaleness ToleranceImpact of Stale Data
Price/volumeMinutesMomentum scores lag, intraday pulse stale
Analyst consensusHoursSentiment scores slightly off
Quarterly financialsDaysQuality scores use prior quarter
Governance scoresWeeksSlow-moving, minimal impact
Index compositionHoursWrong constituents if not refreshed