Skip to main content
Glama
cactus001

TradingAgent

by cactus001

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 dev

2 — Настройка

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 — аутентификация

  1. Перейдите на dashboard.ngrok.com/get-started/your-authtoken

  2. Скопируйте ваш личный authtoken

  3. Выполните:

ngrok config add-authtoken YOUR_REAL_TOKEN_HERE

Шаг 3 — запустите веб-сервер

uv run python -m src.webapp --mock

Шаг 4 — откройте туннель (во втором терминале)

ngrok http 8000

ngrok выведет публичный URL вида:

Forwarding  https://oboe-routing-difficult.ngrok-free.app → http://localhost:8000

Поделитесь этой ссылкой — любой, у кого она есть, сможет открыть чат-интерфейс и взаимодействовать с TradingAgent в реальном времени из любого браузера, без настройки.

Вариант D — Docker (Redis + веб-интерфейс)

Docker Compose поднимает два сервиса:

  • redisredis: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

get_account, get_positions, get_orders, place_order, cancel_order, cancel_all_orders, get_portfolio_history, get_asset_info

market-data

get_quote, get_bars, get_news, get_market_status, search_symbol

sentiment

get_sentiment, get_market_mood, explain_sentiment

watchlist

set_price_alert, get_active_alerts, cancel_alert, get_trade_history


Безопасность

Конвейер из 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:

Паттерн

Реализация

Синглтон

Модульный _instance, одна модель на процесс

Ленивая загрузка

Модель не загружается до первого вызова analyze()

Блокировка с двойной проверкой

threading.Lock с проверкой if self._loaded внутри блокировки

Автоопределение устройства

CUDA → Apple MPS → CPU, конфигурация окружения не требуется

Пакетный инференс

Разбивает списки новостей на батчи по BATCH_SIZE=16, чтобы избежать OOM

Нормализованный скор

Возвращает pos_prob − neg_prob в диапазоне [-1.0, +1.0]

Кэш Redis

Ключ sha256(headline), TTL 1 час — одинаковые заголовки не попадают на GPU дважды

Паттерн частичного попадания

Поиск в кэше по каждому батчу; только промахи уходят в 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

Переменные окружения

Переменная

Требуется

По умолчанию

Описание

ANTHROPIC_API_KEY

Да

Ключ Claude API — console.anthropic.com

ALPACA_API_KEY

Нет

Ключ Alpaca для бумажной торговли — alpaca.markets

ALPACA_SECRET_KEY

Нет

Секретный ключ Alpaca для бумажной торговли

REDIS_URL

Нет

redis://localhost:6379

Строка подключения Redis — автоматически задаётся docker-compose

MAX_ORDER_PCT

Нет

0.05

Максимальный размер одного заказа как доля портфеля

DAILY_LOSS_LIMIT

Нет

-0.05

Останавливает покупки, если дневной P&L опускается ниже этого значения

VELOCITY_LIMIT

Нет

10

Максимум заказов в час


Состояние персистентности

Агент хранит оповещения, историю сделок и счётчики скорости/ 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

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    54
    3
    ISC
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

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