Rot Trading Intelligence

by Mattbusel

12 stars
335 downloads
Not rated
GitHub Website

About

The first financial intelligence MCP server. Live AI-scored trading signals from Reddit, SEC filings, FDA approvals, Congressional trades, and 15+ sources. 7 tools, 2 resources, hosted remotely, free, no API key required.

Details

Author
Mattbusel
GitHub stars
12
Downloads
335
Categories
Finance, Other

- Real-time Reddit and RSS feed monitoring with ML/NLP pipeline.
- Options chain analysis with max pain, put/call ratio, and IV skew.
- Paper options trader with BSM mark-to-market and portfolio metrics.
- Signal strength ranking across sentiment, IV rank, volume, momentum, options flow.
- Sentiment aggregator combining Reddit, news, options flow, and technical indicators.
- Backtester for historical Reddit‑generated signals against price data.

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Rot Trading Intelligence
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

ROT can be started via Docker (docker compose up --build after copying .env.example and setting ROT_REDDIT_CLIENT_ID and ROT_REDDIT_CLIENT_SECRET) or manually with a virtualenv (pip install -e ".[dev]" then python -m rot.app.server). The web dashboard is available at http://localhost:8000/dashboard and API docs at http://localhost:8000/docs. No LLM API key is required — the system runs in stub‑reasoning mode and still generates trade ideas.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "rot trading intelligence": {
            "rot": {
                "command": "npx",
                "args": [
                    "mcp-remote",
                    "https://web-production-71423.up.railway.app/mcp/sse"
                ]
            }
        }
    }
}

McpServers

{
    "rot": {
        "command": "npx",
        "args": [
            "mcp-remote",
            "https://web-production-71423.up.railway.app/mcp/sse"
        ]
    }
}

Reddit Options Trader (ROT)

CI
Tests
Security
Python 3.10+
[Coverage: 75%+]()
[CodeQL: 0 alerts]()
License: MIT

> IMPORTANT DISCLAIMER -- READ BEFORE PROCEEDING
>
> ROT is a research and educational tool only. It is a signal intelligence platform, not a trading execution engine. Nothing in this repository constitutes financial advice, investment advice, or a recommendation to buy or sell any security or derivative. Options trading carries significant financial risk -- you can lose 100% of the premium paid. Signal scores and trade ideas are experimental and have not been independently validated. Never risk capital you cannot afford to lose. The authors accept no liability for financial losses arising from use of this software.

---

Round 7 Features

Options Paper Trader (src/rot/paper/options_paper.py)

Simulates options trades with full position tracking, BSM mark-to-market, and portfolio metrics — no real capital required.

| Class / Type | Role |
|---|---|
| OptionPosition | Open position: contract_id, ticker, strategy, strikes, expiry, quantity, entry_premium, current_value, delta, pnl |
| ClosedTrade | Closed trade record with realised_pnl and is_winner |
| PortfolioSummary | Snapshot: total_pnl, open_positions, closed_trades, win_rate, max_drawdown, cash |
| OptionsPaperTrader | open_trade(), close_trade(), mark_to_market(), get_summary() |

Signal Strength Ranker (src/rot/ranking.py)

Ranks tickers by composite signal strength across five dimensions with tiered labels and ASCII leaderboard output.

| Class / Type | Role |
|---|---|
| RankingDimension | SENTIMENT, IV_RANK, VOLUME_SURGE, MOMENTUM, OPTIONS_FLOW |
| TierRanking | ticker, score, tier (S/A/B/C/D), breakdown |
| SignalRanker | rank(tickers, dimension_scores), leaderboard(top_n=10), configurable weights |

---

Round 6 Features

Options Chain Analyzer (src/rot/analytics/chain_analyzer.py)

Fetches and analyses the full options chain for any ticker via yfinance.

| Class / Type | Role |
|---|---|
| OptionQuote | Single contract: strike, bid, ask, mid, iv, delta, gamma, theta, open_interest, volume |
| ChainSnapshot | Full chain for one expiry: ticker, spot_price, expiry, calls, puts, timestamp |
| ChainAnalyzer | fetch_chain(ticker, expiry_target_days=30), max_pain(snapshot), put_call_ratio(snapshot), skew(snapshot) |

API route: GET /api/v1/options/chain/{ticker}?expiry_days=30 — returns max-pain, PCR, IV skew, and the full call/put quote list.

from rot.analytics.chain_analyzer import ChainAnalyzer

analyzer = ChainAnalyzer()
snapshot = analyzer.fetch_chain("AAPL", expiry_target_days=30)
print(analyzer.max_pain(snapshot)) # e.g. 190.0
print(analyzer.put_call_ratio(snapshot)) # e.g. 1.2
print(analyzer.skew(snapshot)) # e.g. 0.05 (5 pp)

Watchlist Manager (src/rot/watchlist.py)

SQLite-backed persistent watchlist with async CRUD and price-alert detection.

| Class / Type | Role |
|---|---|
| WatchlistItem | Item: ticker, added_date, tags, notes, alert_price |
| Watchlist | add(item), remove(ticker), list(), get(ticker), tag_filter(tag), check_alerts(prices) |

API routes:
- GET /watchlist — HTML dashboard page
- GET /api/v1/watchlist — JSON list of all items
- POST /api/v1/watchlist — add an item
- DELETE /api/v1/watchlist/{ticker} — remove an item

from rot.watchlist import Watchlist, WatchlistItem

wl = Watchlist("watchlist.db")
await wl.init()
await wl.add(WatchlistItem(ticker="AAPL", tags=["tech"], alert_price=180.0))
alerts = await wl.check_alerts({"AAPL": 175.0}) # returns AAPL item

---

Round 5 Features

Reddit Signal Backtester (src/rot/backtest/options_backtest.py — Round 5 additions)

Replays historical Reddit-generated signals against price data and evaluates ATM options profitability.

| Class / Type | Role |
|---|---|
| HistoricalSignal | One Reddit signal: ticker, signal_type, date, predicted_direction, confidence |
| BacktestTrade | Simulated trade: entry_price, exit_price, strategy_pnl, holding_days, outcome |
| BacktestResult | Aggregate stats: win_rate, avg_pnl, total_pnl, sharpe, max_drawdown, best_trade, worst_trade |
| BacktestEngine | run(signals, price_data) — simulates ATM call/put entry, walks forward, exits on stop-loss (20%), take-profit (50%), or expiry (30 days) |

from rot.backtest.options_backtest import BacktestEngine, HistoricalSignal
import datetime

signals = [
HistoricalSignal(ticker="AAPL", signal_type="bull_call",
date=datetime.date(2024, 1, 2),
predicted_direction="bullish", confidence=0.75),
]
price_data = {"AAPL": {datetime.date(2024, 1, 2): 185.0, ...}}
result = BacktestEngine().run(signals, price_data)
print(result.win_rate, result.sharpe)

Sentiment Aggregator (src/rot/sentiment/aggregator.py)

Combines Reddit, news, options flow, and technical indicator sentiment into a single composite signal with confidence weighting and recency decay.

| Class / Type | Role |
|---|---|
| SentimentSource | Enum: REDDIT, NEWS, OPTIONS_FLOW, TECHNICAL_INDICATOR |
| SentimentScore | One source score: source, ticker, score [-1,1], confidence, timestamp |
| AggregatedSentiment | Output: composite_score, source_breakdown, signal_strength, n_sources |
| SentimentAggregator | aggregate(scores) — weighted average with per-source weights and exponential recency decay |

Signal strength thresholds: STRONG_BULL (>0.6), BULL (>0.2), NEUTRAL, BEAR (<-0.2), STRONG_BEAR (<-0.6).

from rot.sentiment.aggregator import SentimentAggregator, SentimentScore, SentimentSource
import datetime

scores = [
SentimentScore(SentimentSource.REDDIT, "AAPL", 0.65, 0.8, datetime.datetime.utcnow()),
SentimentScore(SentimentSource.OPTIONS_FLOW, "AAPL", 0.80, 0.9, datetime.datetime.utcnow()),
]
result = SentimentAggregator().aggregate(scores)
print(result.composite_score, result.signal_strength) # e.g. 0.74 STRONG_BULL

---

Round 4 Features

Options Position Tracker (src/rot/portfolio/positions.py)

Provides an in-memory ledger for multi-leg options positions with mark-to-market updates, portfolio Greeks aggregation, and expiry-risk detection.

| Class / Type | Role |
|---|---|
| OptionLeg | One contract leg: contract, side (Long/Short), strike, expiry, premium, quantity, Greeks |
| OptionsPosition | Full position: symbol, strategy, legs, entry_cost, current_value, theta_decay |
| PositionTracker | Ledger: add_position, close_position, mark_to_market, positions_at_risk, portfolio_greeks |
| PortfolioGreeks | Aggregated total_delta, total_gamma, total_theta, total_vega |
| render_positions_page | Renders GET /portfolio/positions as a dark-themed HTML page with position cards |

Delta-adjusted PnL: realized_pnl + unrealized_pnl + theta_decay_collected.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.