Here's the full Devpost writeup:
Inspiration
stocks like AAPL, NVDA, TSM are among the most geopolitically exposed equities in the world. TSMC fabricates chips for both Apple and NVIDIA in Taiwan — a single island accounting for ~60% of global semiconductor manufacturing. When tensions spike, these stocks move. But by the time a trader reads the headline, the market has already priced it in. Traditional terminals show you price data. Nobody scores geopolitical events against actual supply chain dependencies and fires a trade signal. ORBIT does.
What It Does
ORBIT ingests global geopolitical events every 15 minutes, scores each one's relevance to AAPL, NVDA, and TSM using a supply-chain exposure model, and produces deterministic trading verdicts — ACT, WAIT, or IGNORE — with one-click paper trade execution. When Taiwan strait tensions spiked in our backtest, ORBIT hedged TSM before the drop. When China announced AI chip export controls, it shorted NVDA before the crash. Final score: ORBIT +$450, Buy & Hold -$80.
How We Built It
ORBIT's foundation is a six-feed alternative data ingestion engine running on intervals between 15 seconds and 15 minutes, built entirely in Python 3.11 with FastAPI and aiosqlite for fully async request handling. The primary signal source is GDELT v2 — a real-time global event database publishing 50,000+ daily events, each tagged with a CAMEO verb code (classifying event type: military conflict, diplomatic sanction, trade dispute, etc.) and a Goldstein scale score from –10 to +10 measuring geopolitical instability. Alongside GDELT, we ingest NewsAPI for unstructured article text, synthetic AIS maritime telemetry tracking vessel counts across 7 critical ports (Singapore, Shanghai, Rotterdam, LA/Long Beach, Busan, Hsinchu, Shenzhen), 13 semiconductor supply chain flight corridors, FRED macroeconomic indicators (VIX, DGS10, USD index), and Finnhub/Yahoo Finance for live OHLCV price bars. Every feed runs on an independent APScheduler background job with health monitoring, and all ingested data is persisted into SQLite running in WAL mode — 8 tables, 5 indexes, fully async via aiosqlite — giving us a complete queryable history of every event, score, verdict, trade, and outcome.
The scoring and verdict engine is fully deterministic — no black boxes. Exposure weights are calibrated from primary source research: SEC 10-K filings, TSMC annual reports, and post-export-control supply chain mapping. These are supply chain sensitivity scores, not revenue percentages — AAPL earns 0% revenue from Taiwan but carries a 0.85 Taiwan exposure weight because 100% of its chip fabrication flows through TSMC. For each incoming event, relevance is computed as: \( \text{relevance} = w_{\text{exposure}} \times \min(1, |G|/5) \times e^{-t/24} \times c_{\text{confidence}} \) — where \( G \) is the Goldstein score, \( t \) is hours since the event, and \( c_{\text{confidence}} \) is a Gemini-derived sentiment multiplier from our LLM tagging layer. The top 20 scored events per ticker are aggregated using \( S_{\text{final}} = \max(S_{\text{max}},\ \min(1,\ \sum_{i=1}^{3} S_i)) \), producing a final relevance score that feeds a three-tier verdict system: ACT (≥ 0.55), WAIT (0.30–0.55), or IGNORE (< 0.30). Trade direction is derived from majority Goldstein sentiment across the top events, with a contradicting signal flag triggered when disagreement exceeds 45% — preventing the model from acting on ambiguous geopolitical situations. On top of this, a quant enrichment layer runs Z-score abnormality detection (flagging 2σ+ events for a 1.2x confidence boost), Bayesian hit rate updating via Beta distribution, EWMA geopolitical stress accumulation with a 0.94 decay factor, and Kelly criterion position sizing clamped to [5%, 25%] of available capital.
The frontend is a React + Vite application interfacing with 16 FastAPI endpoints over a Node.js proxy layer that handles static file serving and Yahoo Finance chart proxying. Charts are rendered with lightweight-charts v5 for candlestick data with event marker overlays, a Three.js / WebGL 3D globe displays live event pins, port congestion indicators, and animated supply chain arcs across semiconductor corridors, and Howler.js drives a full sound design system — ACT verdict alarms, event scan sweeps, trade execution chimes — with a 3-second debounce. The LLM layer uses Gemini across three modules: tagger.py for news sentiment classification and country/sector extraction, renderer.py for human-readable verdict narrative generation with a 10-word hallucination blacklist and deterministic fallback, and parser.py for natural language command bar parsing. A replay engine (~700 lines) pre-fetches a full historical trading day — 26 GDELT ZIP files, Yahoo Finance 5-minute bars, NewsAPI articles — and replays it at 60x speed with timestamp rebasing so recency decay math operates identically to live mode. The entire backend ships with 274 passing tests (pytest-asyncio), mypy strict with 0 errors, and ruff with 0 violations — production-grade code quality, not hackathon code.
Challenges We Ran Into
GDELT is enormous and unfiltered. 50,000+ daily events sounds like an advantage until you're staring at a firehose of noise — diplomatic statements, minor protests, ceremonial visits, and routine press conferences all scoring alongside genuine market-moving events. The core challenge was that our scoring formula had to be simultaneously sensitive enough to catch a real supply chain threat and selective enough to not fire on every geopolitical footnote. Tuning the exposure weights, Goldstein magnitude thresholds, and recency decay constant required significant iteration across multiple replay days — running the full pipeline, inspecting which events were surfacing as ACT signals, identifying false positives, and adjusting weights before running again. The contradicting signal flag (>45% disagreement across top events triggers a verdict downgrade) was added specifically because early versions of the model would produce ACT verdicts during genuinely ambiguous situations where half the events pointed bearish and half pointed bullish. Getting the aggregation formula — \( S_{\text{final}} = \max(S_{\text{max}},\ \min(1,\ \sum_{i=1}^{3} S_i)) \) — to behave correctly across both single high-magnitude events and clusters of medium events required careful testing against days with known market outcomes, and the final recency decay constant of \( e^{-t/24} \) was chosen specifically because it preserves same-day signal strength while exponentially fading anything older than 48 hours, preventing stale geopolitical noise from contaminating live verdicts.
Accomplishments That We're Proud Of
We're proud of shipping a fully working geopolitical-to-trade pipeline — a live system ingesting real GDELT events, scoring them against original supply chain research, producing statistically validated verdicts, and tracking every outcome against real market prices. The backtest result speaks for itself: 57.1% directional accuracy across 316 trades, Wilson CI [52–62%], Sharpe 0.48 — a confidence interval that clears the 50% random baseline at 95% significance, computed honestly with no survivorship bias and no lookahead leakage. The equity curve isn't decorative — it's empirical proof that reading geopolitical signals faster than the market generates measurable alpha. On our best replay date, April 16 2026, the model processed 736 live geopolitical events driven by a US-China military tension spike and went 3 for 3 directionally correct: SHORT AAPL ✓, SHORT TSM ✓, LONG NVDA ✓, producing a net session P&L of +3.23%. That result wasn't tuned or cherry-picked after the fact — it came from running the same unmodified pipeline on the highest-event day we could find, and watching it work exactly as designed.
What We Learned
Geopolitical event data is rich and underused in retail trading tooling. The hardest part wasn't the scoring math — it was the data plumbing and making six async feeds play nicely together under load. Also: never underestimate what it takes to port an Electron app to a browser.
What's Next for ORBIT
Live brokerage execution (Alpaca paper → live) Expanded ticker coverage beyond the semiconductor trio LLM-powered event summarization layered on top of GDELT scores User-configurable exposure weights for custom supply chain profiles

Log in or sign up for Devpost to join the conversation.