OutlierQLive demo
Options Trading Signal Engine
- Python
- FastAPI
- React
- TypeScript
- yfinance
- VADER
Overview & Problem
Options markets react to news in seconds, but the signal-to-noise ratio is brutal. OutlierQ tries to surface statistically meaningful events early enough to act on, while filtering out the noise that makes most retail signals useless.
What I Built
A multi-stage anomaly-detection pipeline: z-score-based volume analysis, sentiment filtering on news text, and keyword-driven event classification.
A FastAPI backend serving signals and model metrics to a React/TypeScript dashboard that visualizes live recommendations.
155+ passing tests across the pipeline and API surface.
Architecture
OutlierQ is a linear pipeline with a deliberately cheap-to-expensive ordering. yfinance minute bars and news headlines are ingested first; a rolling volume z-score does the inexpensive initial filtering so only statistically unusual tickers proceed to the heavier stages. Flagged tickers then pass through VADER sentiment scoring and a keyword event classifier, which together set the strike-price and expiry heuristics for the emitted signal.
A FastAPI backend serves the resulting signals and model metrics to a React/TypeScript dashboard. FastAPI was chosen for its async I/O, which suits fanning out to multiple data sources each cycle; the dashboard polls the API on an interval rather than holding an open subscription, keeping the client simple and the backend stateless.
See it in action
Key Technical Decisions & Tradeoffs
OutlierQ is a staged, rules-augmented pipeline rather than a single end-to-end model — a choice driven by interpretability and data reality. With limited labelled data and a need to explain why a signal fired, a transparent chain (z-score → sentiment → event class) is far easier to debug, justify, and tune than an opaque model that emits a recommendation with no traceable reasoning.
The pipeline is ordered cheapest-filter-first on purpose: the volume z-score discards the overwhelming majority of tickers before any sentiment or classification work runs. That keeps per-cycle latency dominated by data ingestion — the network-bound yfinance and news calls — rather than by model inference, which is why the backend leans on async I/O.
The 155+ tests concentrate on the pipeline's deterministic logic: z-score maths, sentiment thresholds, event-classification rules, and the API contract. They deliberately don't test signal profitability, which depends on live market behaviour — the tests guarantee the system computes what it claims, not that the market cooperates.
Results
The live demo runs the full pipeline end-to-end and surfaces a representative signal — ticker, score, strike, expiry, and the drivers behind it — served through the same FastAPI surface the dashboard consumes.
Because the stages are interpretable, every signal traces back to the evidence that produced it — the volume anomaly, the sentiment read, the event class — rather than appearing as an unexplained recommendation.