内容
# 投资组合副驾驶
**基于 LangGraph 流程编排和多台专业MCP服务器的智能投资组合分析。**
投资组合副驾驶接受自然语言的投资查询和一组投资组合持仓,然后运行完整的 multi-agent 分析流程 — 市场数据检索、风险计算、投资组合优化、蒙特卡罗/GARCH 情景模拟和合规性检查 — 然后将所有内容综合成一个由 AI 生成的建议。
---
## 功能
给定一个投资组合(例如 `RELIANCE.NS: 25%, TCS.NS: 20%, ...`)和一个自然语言查询,投资组合副驾驶:
1. 解析意图并识别请求的分析类型
2. 获取所持证券的历史价格数据
3. 计算风险指标 — 波动率、夏普比率、VaR/CVaR、最大回撤
4. 运行下一个 10 个交易日的 GARCH(1,1)-t 波动率预测
5. 优化投资组合(均值-方差,SLSQP 求解器)并计算有效前沿
6. 通过蒙特卡罗和基于 GARCH 的路径生成模拟 1 年远期情景
7. 检查投资组合是否符合可配置的合规规则集(例如行业集中度限制、CVaR 阈值)
8. 使用 LLM 将上述所有内容综合成一个单一的、连贯的投资建议
所有这些都可以在一个 7 标签的仪表板中看到:**我的投资组合**,**AI 建议**,**合规性**,**重新平衡**,**有效前沿**,**情景**,和 **风险**。
所有 5 台 MCP 服务器和编排层均已通过 242 项测试。
<!-- 🎥 演示视频:添加 Loom 链接 -->
---
## 架构
```
React UI → FastAPI → LangGraph 编排器(7 个节点) → 5 台 MCP 服务器
├── 市场数据
├── 风险引擎
├── 投资组合优化器
├── 情景模拟
└── 合规性
LangGraph 还调用 → OpenAI(GPT-4o)进行最终合成
```
这 5 台 MCP 服务器中的每一台都是一个真正的、独立的 [模型上下文协议](https://modelcontextprotocol.io/) 服务器,通过 stdio 传输进行通信 — 而不是一组本地函数调用伪装成“代理”。LangGraph 编排器协调所有五个服务器的调用,处理它们之间的数据流,并将聚合结果交给 LLM 进行最终的叙述合成。
### 为什么是 MCP?
将领域逻辑分成独立的 MCP 服务器(而不是一个庞大的后端)可以使每个金融逻辑部分 — 数据检索、风险建模、优化、模拟、合规性 — 独立可测试、独立可部署,并且按关注点清晰分离。它还演示了一个真正的多代理架构,而不是一个具有附加工具使用的单一 LLM 调用。
---
## 技术栈
| 层 | 技术 |
|---|---|
| 前端 | React, Plotly.js, Axios |
| 后端 API | FastAPI, Uvicorn |
| 编排 | LangGraph |
| 代理协议 | 模型上下文协议(MCP),stdio 传输 |
| LLM | OpenAI GPT-4o |
| 风险建模 | `arch`(GARCH),`scipy`,`numpy`,`pandas` |
| 优化 | `scipy`(SLSQP 求解器) |
| 市场数据 | `yfinance`(v1 中的 CSV 固定件;计划在 v2/v3 中使用实时数据) |
| 部署 | AWS ECS Fargate, ECR, Secrets Manager, CloudWatch |
---
## 本地运行
**先决条件:** Python 3.10+,Node 18+,OpenAI API 密钥。
```bash
# 后端 — 安装每个服务的依赖项
cd api && python -m pip install -r requirements.txt && cd ..
cd orchestrator && python -m pip install -r requirements.txt && cd ..
for server in market_data risk_engine portfolio_optimiser scenario_simulation compliance; do
cd servers/$server && python -m pip install -r requirements.txt && cd ../..
done
# 添加您的 OpenAI 密钥
echo "OPENAI_API_KEY=your-key-here" > .env
# 运行 API
uvicorn api.main:app --reload --port 8900
```
```bash
# 前端
cd ui-react
npm install
npm start
```
访问 `http://localhost:3000`。
---
## AWS 部署
投资组合副驾驶部署在 **AWS ECS Fargate**(区域:`ap-south-1`),具有:
- 两个 Fargate 服务(API,UI),每个 0.5 vCPU / 1GB
- 为 `linux/amd64` 构建的镜像并推送到 **ECR**
- OpenAI API 密钥存储在 **AWS Secrets Manager** 中,在运行时注入容器
- 两个服务的 **CloudWatch 日志**
- 最小 IAM 设置:ECS 任务执行角色范围限定为 ECR 拉取、Secrets Manager 读取和 CloudWatch 日志写入
**已知的 v1 限制:** 在 Fargate 服务前面没有 Application Load Balancer。每个服务都可以通过直接公共 IP 访问,而该 IP **每次服务重启时都会更改**。这是一种刻意的成本权衡 — 持续运行的 ALB 大约每月 18-20 美元,而直接 Fargate IP 仅在实际运行的小时内成本(通常每月不到 2 美元)。权衡是每次重启后手动重新部署步骤(使用新的后端 IP 重新构建前端)。v2 完全用 AWS Lambda + API Gateway 替换了这一点,在接近零闲置成本的情况下提供了永久 URL。
可根据要求提供现场演示。
---
## 路线图
- **v2** — 无服务器重新平台:AWS Lambda(通过 Mangum 使用 FastAPI)+ API Gateway,S3 + CloudFront 用于前端。消除了上述 IP 变化限制;目标是接近零闲置成本。
- **v3** — 行业范围的符号宇宙,买卖新 ticker 建议(不仅限于重新加权持仓),用于较大搜索空间的差分进化求解器,实时市场数据,以及扩展到拟议 ticker 的合规规则。
---
## 项目结构
```
.
├── api/ FastAPI 应用程序
├── orchestrator/ LangGraph 编排层
├── servers/ 5 个独立的 MCP 服务器
│ ├── market_data/
│ ├── risk_engine/
│ ├── portfolio_optimiser/
│ ├── scenario_simulation/
│ └── compliance/
├── ui-react/ React 前端
├── data/fixtures/ 样本 NSE 价格数据(v1)
└── infra/
├── docker/ API 和 UI 的 Dockerfiles
└── ecs/ ECS 任务定义
```
---
## 许可证
MIT