内容
# 🤖 自主交易系统
> 一个基于人工智能的交易模拟系统,使用Python、OpenAI Agents SDK和MCP(模型上下文协议)构建。四个AI交易代理——每个都有独特的投资个性——自主研究市场、做出决策并执行模拟交易。
⚠️ **仅用于教育目的。非财务建议。请勿用于实际交易。**
---
## 📋 目录
- [概述](#概述)
- [功能](#功能)
- [架构](#架构)
- [技术](#技术)
- [工作原理](#工作原理)
- [设置](#设置)
- [使用](#使用)
- [项目结构](#项目结构)
- [面试解释](#面试解释)
---
## 概述
自主交易系统演示了如何构建一个**多代理AI系统**,其中:
- 多个AI代理并发运行,每个代理都有不同的个性和投资策略
- 代理使用 **MCP(模型上下文协议)** 与外部工具(账户、市场数据、通知)交互
- 一个 **子代理(研究者)** 被主 **交易代理** 用作工具——“代理即工具”模式
- 代理活动在 **实时跟踪和记录** ,可在Streamlit仪表盘上查看
四个交易者:
| 交易者 | 灵感来源 | 策略 |
|--------|-------------|----------|
| 沃伦 | 沃伦·巴菲特 | 价值投资,长期持有 |
| 乔治 | 乔治·索罗斯 | 激进宏观交易 |
| 瑞 | 瑞·达利奥 | 系统性风险对冲 |
| 凯西 | 凯西·伍德 | 创新 + 加密货币ETF |
---
## 功能
- ✅ **多代理架构** — 交易代理 + 研究者子代理
- ✅ **MCP集成** — 自定义MCP服务器用于账户、市场数据、通知
- ✅ **持久内存** — 每个研究者构建知识图谱,跨会话存储
- ✅ **多模型支持** — 在GPT、DeepSeek、Gemini或Grok上运行不同的交易者
- ✅ **实时仪表盘** — Streamlit UI,实时投资组合图表和活动日志
- ✅ **推送通知** — 代理通过Pushover向手机发送摘要
- ✅ **代理跟踪** — 每个工具调用和决策的完整审计轨迹
- ✅ **市场数据** — 通过Polygon.io(免费和付费层级)获取实时价格
- ✅ **交替模式** — 交易 → 再平衡 → 交易(代理随时间演变)
---
## 架构
```
┌─────────────────────────────────────────────────────────────┐
│ 用户界面 │
│ Streamlit仪表盘(app.py) │
│ 投资组合图表 · 持仓 · 日志 · 交易记录 │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ 调度器(main.py) │
│ 每N分钟并发运行所有4个交易者 │
└──────────────────────────┬──────────────────────────────────┘
│
┌─────────────────┼──────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 沃伦 │ │ 乔治 │ │ 凯西 │ ...
│ (代理) │ │ (代理) │ │ (代理) │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└────────────────┼─────────────────┘
│
┌───────────────┴────────────────┐
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────────┐
│ 研究者 │ │ 交易者MCP服务器 │
│ 子代理 │ │ │
│ (作为工具) │ │ accounts_server.py │
│ │ │ → 买卖/余额 │
│ MCP服务器: │ │ │
│ • mcp-fetch │ │ market_server.py │
│ • brave-search │ │ → 股票价格 │
│ • 内存 │ │ │
└─────────────────┘ │ notification_server │
│ → 推送警报 │
└──────────────────────┘
│
┌──────────▼──────────┐
│ 服务层 │
│ 投资组合服务 │
│ 市场服务 │
│ 数据库(SQLite) │
└─────────────────────┘
```
---
## 技术
| 技术 | 角色 |
|------------|------|
| **Python 3.12** | 核心语言 |
| **OpenAI Agents SDK** | 多代理框架(代理、工具、跟踪) |
| **MCP(模型上下文协议)** | 代理工具的标准协议 |
| **FastMCP** | 简化的MCP服务器创建 |
| **Streamlit** | 实时网页仪表盘 |
| **Plotly** | 交互式投资组合图表 |
| **Pydantic v2** | 数据验证和序列化 |
| **SQLite** | 持久存储(账户、日志、市场缓存) |
| **Polygon.io API** | 实时股票市场数据 |
| **Brave Search API** | 研究者代理的网络搜索 |
| **Pushover API** | 推送通知到手机 |
| **OpenAI GPT-4o-mini** | 代理的默认LLM |
| **DeepSeek / Gemini / Grok** | 可选的替代LLM |
---
## 工作原理
### 1. MCP服务器(“工具”)
MCP(模型上下文协议)服务器是 **独立进程** ,通过标准协议向AI代理公开工具。代理不直接调用硬编码的API调用,而是通过MCP服务器公开工具。
**我们的自定义MCP服务器:**
```python
# accounts_server.py — 将交易操作作为工具公开
@mcp.tool()
async def buy_shares(name: str, symbol: str, quantity: int, rationale: str) -> str:
"""执行给定股票的买入订单。"""
return Account.get(name).buy_shares(symbol, quantity, rationale)
```
代理不直接调用`buy_shares()` — 而是向MCP服务器发送JSON消息,服务器调用函数并返回结果。
### 2. 代理即工具模式
研究者代理不直接被用户调用 — 而是作为 **工具** 被交易者代理调用:
```python
# researcher_agent.py
researcher = Agent(name="Researcher", instructions=..., mcp_servers=research_servers)
# 转换为交易者可以调用的工具
researcher_tool = researcher.as_tool(
tool_name="Researcher",
tool_description="搜索金融新闻和机会。"
)
# trader_agent.py — 研究者只是另一个工具
trader = Agent(
name="Warren",
tools=[researcher_tool], # 研究者作为工具出现
mcp_servers=trader_mcp_servers, # 直接访问交易工具
)
```
这是 **代理即工具** 模式:当交易者需要市场情报时,它调用研究者工具,该工具启动具有网络搜索功能的完整代理会话,并返回综合研究摘要。
### 3. 交易者工作流程
每个交易者运行:
```
1. 通过MCP资源读取账户状态(余额、持仓、盈亏)
2. 从数据库读取投资策略
3. 调用研究者工具 → 获取市场新闻和机会
4. 使用市场数据工具 → 检查相关股票价格
5. 做出决定 → 通过buy_shares / sell_shares工具执行交易
6. 发送交易总结的推送通知
7. 切换模式(交易 → 再平衡下次)
```
### 4. 持久内存
研究者代理使用知识图谱(LibSQL/SQLite支持)来记住:
- 它以前研究过的公司
- 有用的金融数据网站URL
- 以前的会话中的市场条件和见解
这意味着研究者随着时间的推移变得更加智能 — 在会话中建立专业知识。
### 5. 跟踪
每个代理操作都使用OpenAI的跟踪系统跟踪,并通过自定义的`LogTracer`写入SQLite。Streamlit仪表盘轮询此表以显示实时活动日志。
```python
# ai_agents/tracer.py
class LogTracer(TracingProcessor):
def on_span_start(self, span):
# 写入SQLite → 在Streamlit仪表盘上可见
write_log(trader_name, span.type, f"Started: {span.name}")
```
---
## 设置
### 先决条件
- Python 3.12+
- Node.js 18+(用于使用`npx`的MCP服务器)
- `uv`包管理器(`pip install uv`)
### 1. 克隆仓库
```bash
git clone https://github.com/yourusername/autonomous-trader.git
cd autonomous-trader
```
### 2. 安装依赖
```bash
pip install -r requirements.txt
```
### 3. 配置环境
```bash
cp .env.example .env
```
编辑`.env`并添加您的API密钥:
```env
OPENAI_API_KEY=sk-your-key-here
POLYGON_API_KEY=your-polygon-key
POLYGON_PLAN=free
# 可选但推荐
BRAVE_API_KEY=your-brave-key
PUSHOVER_USER=your-pushover-user
PUSHOVER_TOKEN=your-pushover-token
```
### 4. 初始化交易者账户
```bash
python scripts/reset_accounts.py
```
### 5. 运行仪表盘
```bash
streamlit run app.py
```
### 6. 启动交易模拟
在单独的终端中:
```bash
python main.py
```
交易者默认每60分钟运行一次。要立即测试:
```bash
RUN_EVEN_WHEN_MARKET_CLOSED=true RUN_EVERY_N_MINUTES=1 python main.py
```
### 7. 运行测试
```bash
pytest tests/ -v
```
---
## 使用
### 仪表盘
在运行`streamlit run app.py`后打开`http://localhost:8501`。
仪表盘显示:
- 每个交易者的投资组合价值图表
- 当前持仓(符号 + 数量)
- 最近的交易记录和代理理由
- 实时活动日志(每30秒更新)
### 环境变量
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `RUN_EVERY_N_MINUTES` | `60` | 交易者运行频率 |
| `RUN_EVEN_WHEN_MARKET_CLOSED` | `false` | 在交易时间以外运行 |
| `USE_MANY_MODELS` | `false` | 为每个交易者使用不同的LLM |
| `POLYGON_PLAN` | `free` | `free` / `paid` / `realtime` |
---
## 项目结构
```
autonomous-trader/
│
├── app.py # Streamlit仪表盘
├── main.py # 应用程序运行器/调度器
├── requirements.txt
├── .env.example
│
├── ai_agents/ # AI代理定义
│ ├── trader_agent.py # 主交易代理(决策)
│ ├── researcher_agent.py # 研究者子代理(网络研究)
│ ├── prompts.py # 所有系统提示和用户消息
│ └── tracer.py # 自定义跟踪 → SQLite日志记录
│
├── mcp_servers/ # MCP服务器实现
│ ├── accounts_server.py # 买卖/余额工具 + 账户资源
│ ├── market_server.py # 股票价格查询工具
│ └── notification_server.py # 推送通知工具
│
├── mcp_client/ # MCP客户端实用程序
│ └── client.py # 读取MCP资源(账户、策略)
│
├── services/ # 业务逻辑层
│ ├── portfolio_service.py # 账户模型、交易操作
│ ├── market_service.py # Polygon API + 价格缓存
│ └── database.py # SQLite读写操作
│
├── config/
│ └── mcp_config.py # MCP服务器连接参数
│
├── scripts/
│ └── reset_accounts.py # 初始化交易者账户
│
├── tests/
│ └── test_portfolio.py # 投资组合逻辑单元测试
│
└── memory/ # 自动创建:代理知识图谱
├── warren.db
├── george.db
├── ray.db
└── cathie.db
```
---
## 面试解释
### “给我讲一个你构建过的项目”
> 我构建了一个名为自主交易系统的AI交易模拟器。它有四个AI代理,每个代理都有不同的投资个性——一个是价值导向型的,像巴菲特,另一个是激进宏观型的,像索罗斯。每个代理自主研究市场新闻,做出交易决策,并针对10,000美元的起始投资组合执行模拟交易。
### 主要技术谈话要点
**为什么使用MCP(模型上下文协议)?**
> MCP就像一个AI代理的插件系统。代替在代理内部硬编码工具调用,我将交易操作(买卖/检查余额)作为MCP工具公开在单独的进程中运行。这遵循MCP标准,这意味着任何MCP兼容的代理或框架都可以使用这些工具而无需更改服务器代码。它也更安全——代理不能直接访问数据库;它必须通过MCP服务器。
**为什么使用多代理架构?**
> 交易代理擅长推理和决策,但网络研究是一项不同的任务。我创建了一个专门的研究者代理,适用于信息收集——它具有网络搜索和内存工具。交易者将研究者作为工具调用(“代理作为工具”模式来自OpenAI Agents SDK)。这种关注点的分离使每个代理更容易测试、调试和独立改进。
**为什么使用持久内存?**
> 在运行之间,代理会忘记所有内容。我为研究者添加了一个知识图谱(使用LibSQL,它与SQLite兼容)。它存储了研究者了解的公司、有用的URL和市场条件。在会话之间,研究者会建立专业知识——就像一个记住以前研究的初级分析师。
**为什么要跟踪?**
> 在生产AI系统中,您需要审计代理执行的操作和原因,尤其是对于财务决策。OpenAI的跟踪捕获每个工具调用、LLM响应和决策。我通过自定义的LogTracer扩展了此功能,将事件写入SQLite,Streamlit仪表盘会显示实时活动日志。
**您会改进什么?**
> 对于一个真实的系统,我会添加:(1)通过Alpaca等真实经纪API进行纸质交易,(2)风险管理规则(仓位限制、止损),(3)上线前更好的回测,以及(4)使用PostgreSQL代替SQLite,以便在大规模上并发访问。
---
## 许可证
MIT — 您可以自由使用此项目用于学习和投资组合目的。
*构建为学习项目,以探索多代理AI系统、MCP工具和自主决策。*