AlphaDrift

Data Status

Every pipeline — what it produces, where the data comes from, when it last ran, and how to refresh it. Refresh buttons only work when running locally.

API Dependencies

Anthropic (Claude)Haiku: market narrative + movement summaries · Sonnet: macro scoring
FRED8 macro indicator series (C2)
FinnhubPrimary news source for L2 + L4 movement summaries · Google News RSS used as fallback when no headlines found
Supabase URLDatabase endpoint
Supabase KeyService role (write access)
CNN Fear & Greedpublic API, no key
yfinancelocal Python library, no key
Google News RSSfallback headlines when Finnhub/yfinance return nothing · public, no key

Automated Refresh Schedule

cron-job.org
TriggerRefreshesSydney / AEST *New York / EST *
Premarket (US bot input)Full refresh (all AI + scores)(L1 → L2 → L3 → L4)6:40 PM4:40 AM🔒
Market open (US bot input)Yahoo-only prices(L2 + L4)11:30 PM9:30 AM🔒
Midday (US bot input)Full refresh (all AI + scores)(L1 → L2 → L3 → L4)2:40 AM12:40 PM🔒
Sydney morning reviewYahoo-only prices(L2 + L4)10:30 AM🔒8:30 PM
Sydney afternoon reviewYahoo-only prices(L2 + L4)4:15 PM🔒2:15 AM

Weekdays only · no weekend runs · manual trigger via GitHub Actions workflow_dispatch

🔒 marks the timezone each job is anchored to — that column stays fixed year-round; the other column's time shifts by an hour whenever DST kicks in on either side.

* Times adjust automatically for daylight saving. View current timezones here

Triggers are dispatched externally by cron-job.org, which calls the GitHub workflow_dispatch API. Worst-case delay is typically under 1 minute.

Yahoo Data Only (L2 + L4)
yfinance

Refreshes prices, returns, momentum/dip scores, RSI, and valuation metrics from Yahoo Finance for both GICS ETFs and personal holdings. Skips all AI costs — no Finnhub, no Google News, no Claude calls. Existing AI movement summaries are preserved.

FreshLast run: 3h ago(11 Jun, 00:31)
.venv/bin/python -m pipeline.refresh_yahoo
Only available on local

Macro Outlook

/macro
25 GICS Macro Scores
yfinanceFREDFinnhubClaude SonnetClaude Haiku

Scores all 25 GICS industry groups on their 6–12 month fundamental outlook (0–100). C1 Analyst Consensus (40%): yfinance analyst recommendations + EPS revisions for the top 5 constituents — also stores buy% and EPS revision%. C2 Structural Tailwinds (35%): one Claude Sonnet call scores all groups simultaneously using 8 universal FRED macro series + Finnhub macro news — also stores tailwinds, headwinds, and cyclical/structural flag. C3 Expert Sentiment (25%): Claude Haiku reads Finnhub news headlines for each group over the last 14 days.

FreshLast run: 11h ago(10 Jun, 16:43)
.venv/bin/python -m pipeline.layer1.refresh
Only available on local
AI Market Overviewnarrative paragraph · generated as part of macro refresh · stored in market_context
Claude Sonnet11h ago (10 Jun, 16:43)
Database
industry_group_scores 25 rows
market_context 1 row

What's Moving

/latest
Market Pulse — Speedometer, Asset Tiles & AI Narrative
yfinanceCNN F&GClaude Haiku

Cross-asset daily snapshot. CNN Fear & Greed score drives the speedometer. Six expandable tiles cover US equity, global equity, rates, commodities, FX, and crypto — 24 instruments total via yfinance (batch download). Claude Haiku generates a 2–3 sentence AI narrative. All data upserted to the market_pulse table as a single row (id=1).

FreshLast run: 11h ago(10 Jun, 16:40)
.venv/bin/python -m pipeline.layer2.market_pulse
Only available on local
Sector Heatmap + Momentum Table
yfinanceFinnhubGoogle News RSSClaude Haiku

Downloads 1 year of daily close prices for the primary ETF of each of the 25 GICS industry groups via yfinance. Computes four return windows (1D, 5D, 1M, 3M), 52-week high/low, % from 52w high, 21-day annualised volatility, RSI (14-day), forward P/E, and PEG ratio. Blends returns into a weighted momentum score — 1D×15% + 5D×20% + 1M×40% + 3M×25% — scaled 0–100. Also generates a 1–2 sentence AI movement summary for each group: Finnhub headlines for the primary ETF plus top 3 GICS constituents are fetched first; if no headlines are found, Google News RSS is queried as a fallback.

FreshLast run: 3h ago(11 Jun, 00:30)
.venv/bin/python -m pipeline.layer2.momentum
Only available on local
Database
market_pulse 1 row
momentum_scores 25 rows
opportunity_scores — Dip Score column — refreshed by ③ Opportunity Signal below

Opportunity Signal

/opportunity
25 GICS Opportunity Scores
Supabase (L1 + L2)Claude Sonnet

Combines Layer 1 macro scores with Layer 2 price returns to compute an Opportunity Score for each of the 25 GICS industry groups. The Dip Signal inverts recent price momentum (bigger pullback = higher signal). Final score = Macro×50% + Dip×50%. A Panic Bonus (+15 pts) fires when a group drops ≥5% in a single day and its macro score is ≥60. Claude Sonnet generates a 3-sentence rationale for the top 5 and bottom 5 groups. Also feeds the Dip Score column on ② What's Moving.

FreshLast run: 11h ago(10 Jun, 16:44)
.venv/bin/python -m pipeline.layer3.opportunity
Only available on local
Macro Scenario Lens
Supabase (L1 + L2 + L3 Opportunity)FREDGoogle News RSSPolymarket GammaClaude HaikuClaude Sonnet

AI-generated sector verdicts, chained across four Layer-3 jobs. (1) broad_polymarket_events — Haiku generates macro search terms per run and discovers ~15 high-volume Polymarket events. (2) themes_scenarios — Sonnet identifies 2-3 dominant themes + scenario maps, now with Polymarket probabilities, enriched sector data, and cross-asset context. (3) prediction_signals — per-theme dimension search on Polymarket. (4) verdicts — Sonnet emits buy/caution/avoid buckets citing Polymarket probabilities, opportunity_score, and movement_summary context, and may patch priced_in assessments.

FreshLast run: 11h ago(10 Jun, 16:49)
.venv/bin/python -m pipeline.layer3.{broad_polymarket_events,themes_scenarios,prediction_signals,verdicts}
Only available on local
Database
opportunity_scores 25 rows
macro_scenarios 1 row

My Holdings

/holdings
Ticker Momentum & Dip Scores
yfinanceFinnhubGoogle News RSSClaude Haiku

Downloads up to 6 months of daily close prices for every ticker in the watchlist via yfinance. Computes four return windows (1D, 5D, 1M, 3M) and scores each ticker using the same weighted momentum formula as Layer 2 (1D×15% + 5D×20% + 1M×40% + 3M×25%) and the same dip signal formula as Layer 3 (1D×20% + 5D×50% + 1M×30%). Both formulas are sourced from the shared pipeline.utils.scoring module. US and ASX tickers are supported. Also generates a 1–2 sentence AI movement summary per ticker: US tickers use Finnhub headlines, ASX tickers use yfinance news — if either returns nothing, Google News RSS is queried as a fallback using the company name (ASX queries append 'ASX' for disambiguation). All headlines are passed to Claude Haiku in a single batched call.

FreshLast run: 3h ago(11 Jun, 00:31)
.venv/bin/python -m pipeline.layer4.ticker_momentum
Only available on local
AI Movement Summaries only
yfinanceFinnhubGoogle News RSSClaude Haiku

Re-generates movement_summary for all watchlist tickers without re-downloading price history. Reads existing scores from the DB, fetches fresh headlines per ticker (Finnhub → yfinance → Google News RSS fallback), calls Claude Haiku, and updates only the movement_summary column. Run this when you want to refresh AI summaries without running the full price/score pipeline (which takes much longer due to yfinance downloads).

Never runLast run: Never
.venv/bin/python -m pipeline.layer4.refresh_summaries
Only available on local
Database
watchlist_tickers 137 rows
ticker_scores 137 rows