RepoDaily · 2026-07-02 · Infrastructure / Runtime

Vibe-Trading: A Natural-Language Trading Agent with 450+ Quant Alphas, Swarm Orchestration, and Broker Connectors

#8 Infrastructure / Runtime Python +682 HKUDS/Vibe-Trading Open repository

HKUDS ships a Python-based finance research agent that combines LLM-driven signal engines, a 452-alpha factor zoo, MCP tooling, and IBKR/Robinhood connectors — with backtesting and multi-channel deployment built in.

Repo typeInfrastructure / Runtime
Best forQuant researchers and active traders who want a local AI agent for signal generation, backtesting, and broker-connected execution without writing glue code
Risk levelMedium — handles live trading via OAuth-gated connectors but ships guardrails (order guard, audit ledger, halt switch)
Time to evaluate2–4 hours for a local Docker deploy with paper trading; half-day to connect IBKR TWS read-only

Primary question: Does your team need an LLM-orchestrated finance agent that can generate, backtest, and route trading signals across multiple markets from one CLI or REST surface?

91/100

RepoDaily adoption score

RepoDaily rates this as 91/100 (strong) for adoption: evidence, installation path, production risk, differentiation, license clarity, and AI/agent fit are scored from the article sources and adoption notes.

Directional score from RepoDaily sources and adoption notes, not a benchmark.Risk: Medium
100Evidence quality

5 source(s) across 3 source category/categories, plus a RepoDaily-specific evidence module when available.

100Installability

6 workflow step(s), 5 next-action step(s), and 8 command/install signal(s) were detected.

65Maintenance confidence

Trending momentum is +682 stars, with maintenance/release/issue signals counted when present.

96Production readiness

Risk is marked medium, with 6 security note(s) and 4 explicit skip condition(s).

100Differentiation

3 opportunity lens item(s), 4 alternative(s), and 4 type-specific section(s) support differentiation.

68License clarity

License source or license wording is present.

84Agent / AI fit

6 AI/agent-related signal(s) were detected in the article text and metadata.

Project overview

Vibe-Trading (package name vibe-trading-ai, version 0.1.10, MIT license) is a Python ≥3.11 natural-language finance research agent from HKUDS. The project bundles a LangChain/LangGraph agent loop, a backtesting engine, 452 pre-built quant alphas ported from four established alpha zoos, a FastAPI server on port 8899, and a multi-stage Dockerfile with a Node.js-compiled frontend. It is not a thin wrapper — the CHANGELOG documents a 3216-LOC CLI refactor into the agent/cli/ package, 36 MCP tools, swarm orchestration with DAG-based task dependency management, and connector profiles for Interactive Brokers and Robinhood.

The project's core premise is that a user can describe a trading or research goal in natural language and the agent will decompose it into a pipeline: fetch OHLCV data from one of five market-data loaders (yfinance, tushare, akshare, mootdx/BaoStock TCP, or CCXT for crypto), generate or select a signal engine, backtest it with a mandatory random control in strict alpha-bench mode, and optionally route the result to a broker connector or a messaging channel. The Research Goal runtime added in v0.1.9 formalizes this as long-running, auditable checklists with budget tracking and evidence collection.

From an infrastructure standpoint, Vibe-Trading runs as a single container with named Docker volumes for runs, sessions, swarm state, and user-level configuration (persistent memory, sessions.db, shadow accounts, hypothesis registry, broker connector config). The Dockerfile runs as a non-root user named vibe, exposes a health check at /health, and compiles a WeasyPrint-capable environment for PDF report generation. docker-compose.yml binds port 8899 to 127.0.0.1 by default and configures Ollama access via host.docker.internal for local LLM inference.

Problem it solves

  • Most AI trading prototypes stop at 'generate a signal' — they lack backtesting rigor, broker connectivity, and the operational plumbing (audit logs, halt switches, session persistence) needed for anything beyond a demo
  • Quant researchers spend significant time wiring data loaders, factor libraries, and backtest harnesses together; Vibe-Trading ships a registry that AST-extracts metadata from each alpha module without importing it, rejecting ±inf and >95% NaN outputs
  • LLM-generated signal engines are error-prone; v0.1.9 added pre-flight validation with clean JSON errors and strict alpha-bench mode with a mandatory random control to catch spurious alpha
  • Cross-market analysis is tedious — crypto-vs-equity pairs have mismatched timestamps; v0.1.9 normalizes timestamps for correlation, and the mootdx loader adds native TDX TCP access for A-shares without requiring a token

How it works

  1. Install via pip (vibe-trading-ai on PyPI, Python ≥3.11) or run the multi-stage Dockerfile, which compiles a Node.js frontend and installs Python deps including WeasyPrint native libs (Pango, HarfBuzz, Cairo) for PDF report rendering
  2. Configure market data: the fallback chain covers yfinance, tushare, akshare, mootdx (native TDX TCP, no token), and CCXT (with proxy env support for restricted networks, fix #126)
  3. Select a connector profile via `vibe-trading connector list/use/check` — IBKR starts as a local read-only TWS/IB Gateway profile; the official IBKR remote MCP path is seeded as an OAuth mcp.read probe; Robinhood Agentic Trading operates behind OAuth with a committed mandate, order guard, audit ledger, and instant halt switch
  4. Define a Research Goal via the /goal CLI command or REST/MCP endpoints (start_research_goal, get_research_goal, add_goal_evidence, update_research_goal_status) with auditable checklist criteria and budgets
  5. Run swarm orchestration: the agent decomposes tasks into a DAG, blocks downstream tasks when upstream fails (#145), sends MCP progress heartbeats, and supports retry_run via POST /swarm/runs/{id}/retry or the MCP retry_run tool
  6. Generate reports: WeasyPrint renders PDF exports from HTML/CSS/Jinja2 templates in shadow_account/templates/; the Full Report link renders whenever a runId exists (#150)

Docker Deployment and Runtime Configuration

The Dockerfile uses a two-stage build: Stage 1 compiles the frontend with node:20-slim (npm ci --ignore-scripts, then npm run build); Stage 2 uses python:3.11-slim and installs build-essential plus WeasyPrint runtime libraries (libpango, libharfbuzz, libfontconfig, libcairo, libgdk-pixbuf, fonts-dejavu-core). Without these libraries, the lazy `from weasyprint import HTML` in reporter.py fails and PDF rendering silently downgrades to HTML-only.

The runtime runs as a non-root user named vibe (created via useradd with /usr/sbin/nologin shell). Named Docker volumes persist five directories: agent/runs, agent/sessions, agent/.swarm/runs, agent/uploads, and /home/vibe/.vibe-trading (persistent memory, sessions.db cross-session search index, user-created skills, shadow accounts, hypothesis registry, broker connector config, agent.json). docker-compose.yml comment references issue #197: without the vibe-home volume, a rebuild/recreate wipes all user-level state.

docker-compose.yml binds the API server to 127.0.0.1:8899 (not 0.0.0.0) and sets VIBE_TRADING_TRUST_DOCKER_LOOPBACK=1. Ollama access defaults to http://host.docker.internal:11434 via extra_hosts mapping (requires Docker Engine ≥20.10). The health check hits http://localhost:8899/health every 30s with a 5s timeout and 3 retries. The frontend dev server (optional profile) runs on 127.0.0.1:5899.

Broker Connectors, Market Data Loaders, and MCP Tooling

  • Broker connectors: IBKR (local read-only TWS/IB Gateway immediately usable; remote IBKR MCP seeded as OAuth mcp.read probe until stable read tool names ship) and Robinhood (OAuth, committed mandate, order guard, audit ledger, instant halt switch)
  • Market data fallback chain: yfinance → tushare → akshare → mootdx (native TDX TCP, no token) → CCXT (crypto, reads proxy env per #126); optional baostock extra for BaoStock TCP bypassing eastmoney CDN IP blocks
  • 36 MCP tools as of v0.1.9, including trading_* tools bound to the selected connector profile, start_research_goal / get_research_goal / add_goal_evidence / update_research_goal_status, run_swarm with MCP progress heartbeats, and retry_run
  • Operator-configured external MCP tools in swarm workers (#142) and remote MCP transports for the built-in agent allow extending the tool surface at deploy time
  • Channel integrations (15+ optional extras): telegram, discord, slack, dingtalk, feishu, matrix (with E2E via matrix-nio), wecom, weixin, whatsapp (neonize), msteams, qq, napcat, mochat, plus a meta 'channels' extra bundling the most common ones

CLI Entry Points and Key Commands

  • Two console_scripts: `vibe-trading` (cli:main) and `vibe-trading-mcp` (mcp_server:main)
  • CLI refactored from a 3216-LOC single file into the agent/cli/ package with a refreshed interactive terminal UI (figlet banner + activity rail) and a single cli/_version.py version source
  • Connector subcommands: `vibe-trading connector list/use/check/account/positions/orders/quote/history` — all share the selected profile, with paper/live as a property under the connector
  • Research Goal: `/goal` CLI command plus REST + MCP endpoints for start/get/add_evidence/update_status
  • Hypothesis Registry CLI: `list / show / invalidate` for managing research hypotheses
  • SSE idle timeout is configurable via VIBE_TRADING_SSE_TIMEOUT environment variable (#157); --version derives from package metadata with pyproject.toml fallback, no hardcoded constant (#156)

Adoption Checklist: What to Verify Before Connecting a Live Broker

  • Confirm Python ≥3.11 (classifiers list 3.11 and 3.12; Development Status is 4 - Beta)
  • Verify the connector profile is set to paper mode before any live mandate; Robinhood live requires a committed mandate and the order guard is active
  • Test the instant halt switch path before relying on it — the CHANGELOG describes it as a bounded connector safeguard
  • Check that the vibe-home Docker volume is mounted if running in Docker; without it, issue #197 documents that broker connector config and agent.json are lost on rebuild
  • Validate PDF report rendering by confirming WeasyPrint native libs are present (the Dockerfile installs them; bare-metal installs must do so manually) or reports silently fall back to HTML-only
  • Review strict alpha-bench mode with mandatory random control (#143) — this is the project's primary defense against spurious alpha from LLM-generated signal engines
  • If using Ollama for local inference, set OLLAMA_BASE_URL explicitly when Ollama is not on the host at port 11434

Who should pay attention?

Good fit if

  • Quant researchers who want 452 pre-built alphas with lookahead enforcement and operator-level sanity checks (rejects ±inf and >95% NaN) without building their own factor framework
  • Active traders running IBKR TWS or IB Gateway who want a local, read-only agent surface before committing to live execution
  • Teams building multi-market research pipelines (A-shares via mootdx/baostock, US equities via yfinance, crypto via CCXT) with timestamp-normalized cross-market correlation
  • Developers who need MCP-compatible tooling — the 36 MCP tools and operator-configured external MCP tools in swarm workers make Vibe-Trading composable with other MCP-aware agents

Skip for now if

  • Traders who need ultra-low-latency execution (sub-millisecond order routing) — this is an LLM-orchestrated research agent, not a co-located execution engine
  • Teams that require a stable, documented public API contract — the project is at 0.1.x with Development Status 4 - Beta, and the IBKR remote MCP path is explicitly seeded as an OAuth mcp.read probe until stable read tool names ship
  • Organizations with strict compliance requirements that prohibit audit-ledger-based trade logging or that need SOC 2 / regulated custody integrations not present in the current connector set
  • Anyone who needs a turnkey SaaS — Vibe-Trading is a self-hosted agent requiring LLM API keys or a local Ollama instance

Risks and cautions

Medium

The project ships meaningful operational guardrails (order guard, audit ledger, halt switch, paper/live profile separation) but is at version 0.1.x with a Beta development status and an IBKR remote MCP path explicitly marked as unstable.

  • Version 0.1.10 with classifiers set to Development Status :: 4 - Beta — breaking changes are possible before 1.0
  • IBKR remote MCP path is seeded as an OAuth mcp.read probe 'until stable read tool names ship' — the remote execution surface is not yet final
  • LLM-generated signal engines require the strict alpha-bench mode with mandatory random control (#143) to be meaningful; without it, spurious alpha is a real risk
  • Robinhood connector uses a 'committed mandate' model — once a live mandate is committed, the order guard and halt switch are the primary safeguards, and misconfiguration can result in real trades
  • Session persistence uses JSONL files with flush + fsync writes that skip corrupted lines on read (#147) — data durability depends on the vibe-home Docker volume being correctly mounted
  • CVE-2026-28277 patched by bumping langgraph (v0.1.9 changelog entry under Changed)
  • Docker runtime runs as non-root user vibe with /usr/sbin/nologin shell; port bound to 127.0.0.1 by default in docker-compose.yml
  • Robinhood connector: bounded behind OAuth, with a committed mandate, an order guard, an audit ledger, and an instant halt switch
  • IBKR: starts as a local read-only TWS/IB Gateway profile; remote path is OAuth mcp.read probe only until stable read tools ship
  • Pre-flight validation for LLM-generated signal engines with clean JSON errors (#149) prevents malformed engine definitions from reaching the backtester
  • Health check endpoint at /health allows orchestrators to detect agent process failures

Alternatives to compare

ApproachWhen to useTrade-off
Microsoft Qlib
When you need a mature, production-oriented quant research platform focused on alpha mining and model training rather than LLM-orchestrated natural-language interactionFree, open-source (MIT)
Freqtrade
When your focus is crypto-only strategy development with a mature backtesting and live trading loop, without the multi-market data loaders or alpha zooFree, open-source (GPL-3.0)
NautilusTrader
When you need a high-performance, event-driven algorithmic trading platform with institutional-grade execution and no LLM orchestration layerFree, open-source (LGPL-3.0)
OpenBB Terminal
When you want a comprehensive financial data terminal for analysis across asset classes without the agent loop or broker execution surfaceFree, open-source (AGPL-3.0); OpenBB Pro is commercial

What this trend reveals

Build a Custom Alpha Factor on the Registry

The agent/src/factors/ registry AST-extracts metadata from each alpha module without importing it, enforces lookahead at the operator level (delta(d>=1)), and rejects ±inf and >95% NaN outputs. A developer can add a custom factor YAML/Python module and have it auto-registered, backtested against the 452-alpha zoo, and validated via strict alpha-bench mode with a mandatory random control.

Clone the repo, place a factor module under agent/src/factors/zoo/, run `vibe-trading` CLI to confirm the registry discovers it, and backtest with alpha-bench mode enabled to verify the random control rejects spurious results.

Create a Channel Bot for Trade Alerts

With 15+ optional channel extras (telegram, discord, slack, feishu, matrix with E2E, whatsapp via neonize, and more), a team can wire the agent's Research Goal completion or swarm task results to a messaging channel. The Research Goal runtime emits evidence updates via add_goal_evidence, which can be forwarded to a channel bot.

Install the telegram extra (python-telegram-bot>=21.0), configure a bot token in agent/.env, define a Research Goal with checklist criteria, and verify that goal status changes produce channel messages.

Extend Swarm Workers with External MCP Tools

v0.1.9 added operator-configured external MCP tools in swarm workers (#142) and remote MCP transports for the built-in agent. This means a team can expose internal tools (custom data APIs, risk calculators, compliance checks) as MCP endpoints and have swarm tasks call them during multi-step research pipelines.

Define an MCP server endpoint, configure it as an operator-provided external tool in the swarm worker config, trigger a swarm run via POST /swarm/runs, and confirm the worker invokes the external tool during task execution.

Best next action

Deploy via Docker and Run a Paper-Mode Backtest

The fastest path to evaluating Vibe-Trading is the provided docker-compose.yml, which handles frontend compilation, Python dependency installation, WeasyPrint native libraries, volume persistence, and the health check. This avoids manual dependency resolution for WeasyPrint and ensures the vibe-home volume protects user state across rebuilds.

  1. Clone the repository and copy agent/.env.example to agent/.env; add your LLM API key (OpenAI, DeepSeek, or set OLLAMA_BASE_URL for local inference)
  2. Run `docker compose up -d --build` — the multi-stage Dockerfile compiles the frontend with node:20-slim and installs Python deps including Pango/HarfBuzz/Cairo for PDF rendering
  3. Verify the health check: `curl http://localhost:8899/health` should return 200 within 10 seconds of the start period
  4. Open the web UI at http://localhost:8899 (frontend served as static files from frontend/dist) or use the CLI: `docker compose exec vibe-trading vibe-trading connector list`
  5. Configure a paper-mode IBKR connector profile (read-only TWS/IB Gateway) or skip connectors and run a backtest using the built-in market data loaders with strict alpha-bench mode enabled

RepoDaily verdict

Vibe-Trading is one of the most complete open-source LLM-driven finance agents available: 452 pre-built alphas with lookahead enforcement, 36 MCP tools, swarm orchestration with DAG dependencies, broker connectors with operational guardrails, and a production-grade Docker deployment. The main caveats are its 0.1.x version, the explicitly unstable IBKR remote MCP path, and the fact that LLM-generated signal engines require strict alpha-bench mode to be trustworthy. For quant researchers and technically capable traders who want a self-hosted alternative to SaaS trading agents, it is worth a serious evaluation in paper mode before any live mandate.

Sources