OutlierQInteractive demo

Options Trading Signal Engine

  • Python
  • FastAPI
  • React
  • TypeScript
  • yfinance
  • FinBERT
01 —

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.

02 —

What I Built

A multi-stage anomaly-detection pipeline: a z-score on each ticker's daily news-article count against a 14-day baseline, FinBERT sentiment filtering on the flagged tickers, 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.

03 —

Architecture

OutlierQ is a staged pipeline with a deliberately cheap-to-expensive ordering. Finnhub news and yfinance market data are ingested on a schedule. A z-score on each ticker's daily article count against its 14-day rolling baseline does the inexpensive first cut, so only tickers with unusual news coverage reach FinBERT sentiment scoring (a finance-tuned VADER is the fallback if the model can't load). Tickers that pass are checked for confirmation across independent sources, then a keyword event classifier drives the call/put direction and 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. Ingestion and detection run on their own APScheduler schedule, separate from the API process.

See it in action

latest signal
fetching latest signal
04 —

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 news-volume z-score discards most tickers before any FinBERT inference runs, so sentiment is only computed for tickers whose coverage actually spiked.

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.

05 —

Results

The published dashboard is a static build on synthetic fixtures, so it demonstrates the interface and the shape of a signal rather than live output. Running the real pipeline against Finnhub and yfinance requires the local quick start in the repository.

Because the stages are interpretable, every signal traces back to the evidence that produced it — the news-volume anomaly, the sentiment read, the event class — rather than appearing as an unexplained recommendation.

06 —

See It In Action

07 —

Links