Project
Outlier Detector
Outlier Detector is a live crypto momentum detector built to surface unusual strength early. It watches a manual universe of Bybit USDT futures in real time, ranks them against each other, and highlights the names that keep showing up stronger than the rest.
The point was to reduce the lag between noticing movement and understanding whether it matters. Instead of watching dozens of charts, I wanted one system that could keep score continuously and make the market easier to read.
It pushes that view into Telegram and gives me a cleaner read on what is leading, what is weakening, and what still looks strong by the close. The technical side is below, but the simple version is that it helps me spot momentum outliers earlier and follow them with more structure.
More details
Under the hood, the engine keeps a rolling 15-minute view of the market and re-ranks the full universe every cycle. The key idea is simple: early movement and confirmed strength are not the same thing, so the system does not treat them like they are.
The runtime is event-driven. It bootstraps state from REST, stays live over WebSocket candle updates, and splits processing into two paths: one for intrabar reads and one for confirmed closes. That sounds like a small detail, but it changes the character of the whole system. A lot of market tools blur those together and end up either too noisy or too late.
- Bootstraps 15-minute history for a manual universe of Bybit linear USDT contracts, plus BTC macro state over REST.
- Stays live over Bybit WebSocket `kline.15` streams and processes both provisional intrabar updates and confirmed candle closes.
- Keeps confirmed and provisional price state separate so early reads do not contaminate the close-confirmed path.
- Uses BTC daily closes from Bybit for regime scoring and Binance futures `BTCDOMUSDT` as a practical dominance proxy.
The ranking model is cross-sectional. Every cycle, each valid ticker gets scored on momentum, curvature, and Hurst. Those signals are then normalized across the whole universe, clipped, and combined into one ranking. I wanted the engine to care about relative strength, not just isolated price movement.
- Computes log-return-based volatility-adjusted momentum, return curvature, and Hurst for every valid ticker.
- Turns momentum and curvature into clipped cross-sectional z-scores before combining them into the composite rank.
- Uses BTC regime floors plus BTCDOM state adjustments to modulate the threshold instead of relying on one fixed cutoff.
- Keeps Hurst as a hard filter and adds a confirmed persistence bonus so one-bar spikes do not dominate the close-confirmed view.
- Promotes intrabar signals through `watchlist` and `emerging` only when rank and composite score are strengthening across recent observations.
- Upgrades confirmed signals to `confirmed_strong` when leadership survives the close and recent confirmed persistence backs it up.
The part I care about most is that it is not just a signal script. I built the support layer around it too: SQLite logging for every evaluated row, Telegram alerts and confirmed summaries, replay and smoke tooling, benchmarking, reporting, and universe validation. The repo currently has 26 passing tests. That matters because I wanted it to be inspectable and testable, not just something that looks clever in a screenshot.
It is still a work in progress. Right now this is the first step: building a detector I trust. Once I feel I have really got that layer right, the next step is building further toward a fuller trading system on top of it.
I wrote more about the philosophy behind it, the compromises, and the decisions that shaped the build in Philosophy and Design Choices .