TradingAgent
TradingAgent
MCP-нативный диалоговый агент для бумажной торговли с анализом тональности FinBERT.
«Купи 10 AAPL, если сегодня цена упадёт ниже $200» — введите это, агент сделает всё остальное.
Оглавление
Related MCP server: Alpaca API MCP Server
Архитектура
┌──────────────────────┐ ┌──────────────────────────────────────┐
│ CLI Agent (REPL) │ │ Web UI (FastAPI) │
│ claude-sonnet-4-6 │ │ Dark chat · WebSocket · marked.js │
│ agentic loop │ │ ngrok → shareable demo URL │
└──────────┬───────────┘ └──────────────────┬───────────────────┘
│ MCP (stdio) │ MCP (stdio, per session)
└──────────────────┬──────────────────┘
│
┌──────────────────▼──────────────────┐
│ FastMCP Server │
│ 20 tools · 4 modules │
└────┬──────────┬──────────┬──────────┘
│ │ │ │
trading market-data sentiment watchlist
8 tools 5 tools FinBERT 4 tools
│ │ │ │
└──────────┴──────────┴──────────┘
│
┌─────────────▼──────────────┐
│ 5-Layer Guardrail │
│ input·llm·tool·exec·output │
└─────────────┬──────────────┘
│
┌─────────────▼──────────────┐
│ Alpaca Paper API │
│ real quotes · fake money │
└─────────────┬──────────────┘
│
┌─────────────▼──────────────┐
│ Alert Daemon │
│ polls prices every 30s │
│ fires conditional orders │
└────────────────────────────┘Быстрый старт
Для mock-режима не нужна учётная запись Alpaca.
1 — Установка
# Clone and enter project
git clone https://github.com/cactus001/TRADE-AGENT.git
cd TRADE-AGENT
# Install dependencies (Apple Silicon — use Homebrew Python)
uv sync --python /opt/homebrew/bin/python3.12
# Install dev dependencies for tests
uv sync --extra dev2 — Настройка
cp .env.example .envОткройте .env и заполните:
ANTHROPIC_API_KEY=sk-ant-... # required — get from console.anthropic.com
ALPACA_API_KEY= # optional — paper trading keys from alpaca.markets
ALPACA_SECRET_KEY= # optional — leave blank to use --mock modeПримечание: mock-режим работает без ключей Alpaca и запускает FinBERT на настоящих фейковых новостных заголовках.
Запуск агента
Вариант A — CLI REPL (терминальный чат)
# Mock mode (no Alpaca keys needed)
uv run python -m agent.cli_agent --mock
# Live paper trading (requires Alpaca keys in .env)
uv run python -m agent.cli_agentВводите команды на естественном языке. Нажмите Ctrl+C для выхода — транскрипт сессии автоматически сохраняется в transcripts/.
Вариант B — веб-интерфейс (чат, которым можно поделиться)
# Mock mode
uv run python -m src.webapp --mock
# Live paper trading
uv run python -m src.webappОткройте в браузере http://localhost:8000 — вы увидите тёмный чат-интерфейс:
Живые чипы вызовов инструментов, показывающие, какие MCP-инструменты работают
Анимированный индикатор «размышления» во время инференса
Markdown-таблицы для данных портфеля и заказов
Водяной знак
PAPER TRADING — NO REAL MONEYна всех подтверждениях заказов
Вариант C — доступ через ngrok (живое демо откуда угодно)
Используйте это для собеседований, демонстраций или доступа через интернет для любого человека.
Шаг 1 — установите ngrok
brew install ngrokШаг 2 — аутентификация
Перейдите на dashboard.ngrok.com/get-started/your-authtoken
Скопируйте ваш личный authtoken
Выполните:
ngrok config add-authtoken YOUR_REAL_TOKEN_HEREШаг 3 — запустите веб-сервер
uv run python -m src.webapp --mockШаг 4 — откройте туннель (во втором терминале)
ngrok http 8000ngrok выведет публичный URL вида:
Forwarding https://oboe-routing-difficult.ngrok-free.app → http://localhost:8000Поделитесь этой ссылкой — любой, у кого она есть, сможет открыть чат-интерфейс и взаимодействовать с TradingAgent в реальном времени из любого браузера, без настройки.
Вариант D — Docker (Redis + веб-интерфейс)
Docker Compose поднимает два сервиса:
redis —
redis:7-alpine, сохраняет данные в именованном томе, проходит health-check перед запуском агентаtrading-agent — собирается из
Dockerfile, запускает веб-интерфейс на порту 8000, автоматически подключается к Redis
# Copy env file and add your Anthropic key
cp .env.example .env
# edit .env — add ANTHROPIC_API_KEY (REDIS_URL is set automatically by compose)
# Build and start both services
docker-compose up --build
# Or run detached
docker-compose up --build -dОткройте http://localhost:8000 — чат-интерфейс работает.
# Tail logs
docker-compose logs -f trading-agent
# Stop everything
docker-compose down
# Stop and wipe all volumes (resets state + Redis cache)
docker-compose down -vЗапустите CLI-агента вместо веб-интерфейса:
docker-compose run --rm trading-agent uv run python -m agent.cli_agent --mockПример диалога
You: what's my portfolio looking like
Agent: Portfolio — $101,432.20 total (+1.4% today)
TSLA 15 shares $248.20 +$190.50 (+5.4%)
NVDA 5 shares $134.50 -$43.00 (-6.0%)
Cash $94,890.50 available
You: what's the sentiment on NVDA right now
Agent: NVDA Sentiment (last 4h): BEARISH — score -0.41
Top drivers:
• "Analyst cuts NVDA target to $125" (negative, -0.81)
• "Nvidia faces rising competition" (negative, -0.62)
Recommendation: Consider waiting for stabilisation before adding.
You: buy 10 AAPL if it drops below $200 today
Agent: Day Limit Buy Preview [PAPER TRADING — NO REAL MONEY]
10 shares AAPL · Limit @ $200.00
AAPL currently: $212.95
Expires: 4:00 PM ET today · Max cost: $2,000.00
Confirm? (yes/no)
You: yes
Agent: ✅ Order placed (ID: abc-12345)
Limit buy active — AAPL will be purchased automatically if price hits $200.
[PAPER TRADING — NO REAL MONEY]
You: alert me when TSLA drops below 240
Agent: ✅ Alert set — will notify when TSLA < $240.00
Current price: $248.20 (monitoring every 30s)Инструменты
20 инструментов в 4 модулях:
Модуль | Инструменты |
trading |
|
market-data |
|
sentiment |
|
watchlist |
|
Безопасность
Конвейер из 5 уровней защиты срабатывает при каждом заказе:
Уровень | Что отсеивает |
Защита ввода | Паттерны промпт-инъекций в сообщениях пользователя |
Защита LLM | Внедрённые инструкции, скрытые в заголовках новостей; ужесточает системный промпт |
Защита инструментов | Некорректные форматы тикеров, отрицательное количество, отсутствие обязательных цен, общепринятые границы |
Защита исполнения | Один заказ > 20% портфеля, дневной убыток > 5%, > 10 заказов в час, wash-торги (< 5 мин), предохранитель (SPY упал > 5%) |
Защита вывода | Отказы брокера, предупреждения о концентрации после сделки |
place_order требует обязательный двухэтапный процесс: сначала нужно вызвать confirm=False (предпросмотр), затем confirm=True (исполнение). Ни один заказ не доходит до брокера без явного подтверждения пользователя в диалоге.
FinBERT как production-сервис
src/models/finbert.py превращает FinBERT (ProsusAI/finbert) из отдельного скрипта в production-вый сервис, вызываемый через MCP:
Паттерн | Реализация |
Синглтон | Модульный |
Ленивая загрузка | Модель не загружается до первого вызова |
Блокировка с двойной проверкой |
|
Автоопределение устройства | CUDA → Apple MPS → CPU, конфигурация окружения не требуется |
Пакетный инференс | Разбивает списки новостей на батчи по |
Нормализованный скор | Возвращает |
Кэш Redis | Ключ |
Паттерн частичного попадания | Поиск в кэше по каждому батчу; только промахи уходят в FinBERT, попадания отдаются за <1 мс |
Мягкая деградация | Redis недоступен → кэш не работает, инференс продолжает работать нормально |
На Apple Silicon инференс выполняется на MPS GPU (подтверждено: device: mps). При прогретом Redis повторные вызовы get_sentiment в том же цикле новостей возвращаются мгновенно.
Структура проекта
TRADE-AGENT/
├── agent/
│ └── cli_agent.py # REPL — manual agentic loop, auto-saves transcripts
├── src/
│ ├── server.py # FastMCP entry point — registers all 4 tool modules
│ ├── webapp.py # FastAPI + WebSocket web interface
│ ├── config.py # Pydantic settings — env vars with defaults
│ ├── state_manager.py # Persistent state (~/.trading-agent/state.json)
│ ├── alert_daemon.py # Background thread — polls prices every 30s
│ ├── models/
│ │ └── finbert.py # FinBERT singleton service (production ML pattern)
│ ├── cache/
│ │ └── redis_cache.py # Redis sentiment cache — partial-hit, 1h TTL, graceful degradation
│ ├── clients/
│ │ └── alpaca_client.py # Thin wrapper around alpaca-py SDK
│ ├── guardrails/
│ │ ├── input_guard.py # Regex injection pattern detection
│ │ ├── llm_guard.py # News sanitisation + system prompt hardening
│ │ ├── tool_guard.py # Symbol/qty/price validation
│ │ ├── execution_guard.py # Size, loss, velocity, wash-trade, circuit-breaker
│ │ ├── output_guard.py # Broker rejection + concentration check
│ │ └── guard_registry.py # Wires all 5 layers into one object
│ ├── tools/
│ │ ├── trading.py # 8 trading tools (place_order confirm gate)
│ │ ├── market_data.py # 5 market data tools
│ │ ├── sentiment.py # 3 FinBERT sentiment tools
│ │ └── watchlist.py # 4 alert/history tools
│ └── static/
│ └── index.html # Dark chat UI (WebSocket, marked.js, tool chips)
├── mock/
│ └── mock_provider.py # MockAlpacaClient — full demo without API keys
├── tests/
│ ├── test_guardrails.py # 15 tests across all 5 guardrail layers
│ └── test_sentiment.py # 7 tests — singleton, batch, device detection
├── transcripts/ # Auto-saved session logs (git-ignored)
├── pyproject.toml
├── docker-compose.yml
├── Dockerfile
└── .env.exampleТесты
uv run pytest tests/ -v
# 22 passedПеременные окружения
Переменная | Требуется | По умолчанию | Описание |
| Да | — | Ключ Claude API — console.anthropic.com |
| Нет | — | Ключ Alpaca для бумажной торговли — alpaca.markets |
| Нет | — | Секретный ключ Alpaca для бумажной торговли |
| Нет |
| Строка подключения Redis — автоматически задаётся docker-compose |
| Нет |
| Максимальный размер одного заказа как доля портфеля |
| Нет |
| Останавливает покупки, если дневной P&L опускается ниже этого значения |
| Нет |
| Максимум заказов в час |
Состояние персистентности
Агент хранит оповещения, историю сделок и счётчики скорости/ wash-торгов в:
~/.trading-agent/state.jsonЭтот файл находится вне каталога проекта и никогда не коммитится. Удалите его, чтобы сбросить всё состояние.
Технологический стек
Компонент | Технология |
Agent SDK | Anthropic Python SDK (claude-sonnet-4-6) |
Протокол инструментов | MCP (Model Context Protocol) через FastMCP |
Брокерский API | Alpaca Paper Trading (alpaca-py) |
Модельsentiment | ProsusAI/FinBERT (Hugging Face Transformers) |
ML-runtime | PyTorch 2.x — MPS / CUDA / CPU автоматически |
Кэш инференса | Redis 7 — ключ по sha256, TTL 1 час, мягкая деградация |
Веб-сервер | FastAPI + Uvicorn + WebSocket |
Фронтенд | Vanilla JS, marked.js, CSS custom properties |
Контейнеры | Docker + docker-compose (два сервиса: redis + trading-agent) |
Туннель | ngrok (бесплатный тариф) |
Менеджерпакетов | uv |
Тесты | pytest + pytest-asyncio |
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables large language models to interact with Alpaca's trading infrastructure using natural language, supporting stock/options trading, portfolio management, watchlist handling, and real-time market data access.MIT
- AlicenseNot gradedqualityDmaintenanceEnables trading and portfolio management through the Alpaca API, allowing users to place orders, manage positions and watchlists, access market data, and retrieve account information through natural language.543ISC
- AlicenseNot gradedqualityFmaintenanceEnables natural language trading operations through Alpaca's API, supporting stocks, options, crypto, portfolio management, and real-time market data with comprehensive order execution and account management capabilities.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to execute stock trading operations with built-in risk controls and human approval workflows. Supports paper trading simulation, real brokerage integration (Alpaca, Tradier), backtesting, sentiment analysis, and portfolio management while maintaining strict separation between AI intelligence and trade execution.MIT
Related MCP Connectors
Real-time news with bias scoring, live market data, and AI-powered options pricing
Build, backtest, and deploy quantitative trading strategies from your AI agent.
Real-time financial news for AI agents: search by ticker and source, with sentiment and entities.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cactus001/TRADE-AGENT'
If you have feedback or need assistance with the MCP directory API, please join our Discord server