DeepFund:基于LLM多智能体的实时基金投资竞技场部署与实战指南
大语言模型(LLM)与多智能体系统正深刻变革金融科技领域,为量化投资和智能投顾带来新的可能性。其核心原理在于通过模块化智能体协作,模拟真实投资流程,实现信息获取、分析与决策的自动化。这一技术架构的价值在于提供了一个标准化、可复现的评估框架,能够系统性地检验AI在动态市场环境中的综合决策能力,而非仅仅进行静态预测。在应用场景上,它尤其适用于构建和评估自动化投资研究平台、进行策略回测与归因分析,以及探
1. 项目概述:一个为LLM打造的实时基金投资竞技场
如果你关注AI在金融领域的应用,尤其是大语言模型(LLM)的投资决策能力,那么DeepFund这个项目绝对值得你花时间深入研究。它不是一个简单的回测工具,而是一个设计精巧的“竞技场”,旨在公平、实时地评估不同LLM在真实市场环境下的主动投资管理能力。简单来说,DeepFund试图回答一个核心问题: LLM能成为专业的基金经理吗?
这个项目由香港科技大学(广州)数据智能分析实验室(DIAL)团队主导,其论文已被NeurIPS 2025接收,并获得了AI Agent 2025竞赛的最佳开源项目奖。它的价值在于提供了一个标准化的、可复现的评估框架,将LLM驱动的多智能体系统置于统一的交易环境中,让它们“同台竞技”。这解决了当前AI金融研究中的一个痛点:许多研究在孤立、静态的数据集上进行评估,缺乏对动态市场、信息处理和实时决策能力的综合考量。DeepFund通过模拟一个包含分析师、投资经理等角色的多智能体工作流,让LLM能够接入外部金融信息,进行推理,并最终做出买卖决策,其表现会从多个维度在“竞技场”视图中直观呈现。
对于研究者,DeepFund是一个绝佳的基准测试平台;对于开发者,它是一个构建金融AI Agent的坚实起点;而对于所有对AI+金融感兴趣的人,它提供了一个窥见未来智能投顾形态的窗口。接下来,我将带你深入拆解这个项目的设计思路、实操细节以及我在部署和实验过程中积累的一些关键经验。
2. 核心设计思路:为何是“竞技场”而非“回测器”?
DeepFund的设计哲学与传统量化回测平台有本质区别。理解这一点,是有效使用和扩展该项目的基础。
2.1 从静态评估到动态竞技
传统的金融AI评估,往往是在一个固定的历史数据集上,用一套固定的规则(如特征工程、模型预测)进行回测,最终给出夏普比率、最大回撤等指标。这种方式存在“信息泄露”的风险——模型可能无意中利用了未来的信息。更重要的是,它无法评估LLM这类生成式模型在 信息实时获取、理解、规划与协作 方面的能力。
DeepFund的“竞技场”模式,模拟了真实基金公司的日常运作流程。它设定了明确的“交易日”,系统在每一个交易日,都需要像真实的投资团队一样工作:
- 信息摄入 :从外部API获取当天的市场新闻、财报、行情数据。
- 分析与规划 :由不同的“分析师”智能体(也是LLM驱动)对信息进行加工,生成投资观点或信号。
- 决策与执行 :由“投资经理”智能体综合所有分析师的报告,结合当前持仓,做出具体的交易决策(买/卖/持有)。
- 记录与评估 :所有决策、信号、持仓变动都被实时记录到数据库中,用于后续的性能分析和归因。
这种设计迫使LLM必须在 时间序列 上严格操作,无法“偷看”未来。它评估的不是一个预测模型的准确性,而是一个 决策智能体系统 在持续变化环境下的综合表现。
2.2 多智能体工作流的设计考量
项目采用了多智能体架构,这并非为了炫技,而是基于对投资流程的深刻抽象。一个成熟的基金公司内部,本就存在行业研究员、宏观分析师、风险控制官、基金经理等不同角色的协作。
在DeepFund中,这种协作被抽象为可配置的 workflow_analysts 。例如,你可以配置一个“技术面分析师”、一个“基本面分析师”和一个“舆情分析师”。每个分析师智能体专注于自己的领域,生成结构化的分析报告( Signal )。然后,一个“投资经理”智能体(或称为 Planner )会审阅所有报告,进行权衡,最终做出交易 Decision 。
这种设计的优势在于:
- 模块化 :你可以轻松地增加、移除或替换某个分析师角色,观察其对整体投资组合的影响。
- 可解释性 :所有分析报告和决策理由都被记录在案,便于事后追溯和理解LLM的“思考过程”。
- 贴近现实 :模拟了真实世界中信息分散处理、集中决策的流程,更能检验LLM在复杂信息整合上的能力。
planner_mode 这个配置开关,进一步增加了灵活性。当设置为 False 时,所有分析师并行工作,投资经理直接综合所有报告;当设置为 True 时,会启用一个更高级的“规划者”智能体,由它来决定今天该调用哪些分析师(类似于基金经理晨会上决定今天重点讨论哪些议题)。这可以用来测试LLM的资源分配和规划能力。
2.3 数据库的核心作用:不只是存储
DeepFund强制要求使用数据库(Supabase或SQLite),这体现了其“可观测性”的设计理念。数据库在这里扮演了四个关键角色:
- 状态持久化 :记录每日的持仓(
Portfolio),确保系统在中断后能从正确的状态恢复,严格按时间顺序推进。 - 决策审计 :保存每一笔交易决策(
Decision)及其背后的LLM推理原文,满足金融领域对可追溯性的严苛要求。 - 信号仓库 :存储所有分析师生成的中间信号(
Signal),便于进行归因分析(例如,最终收益有多少来源于技术面信号?)。 - 实验管理 :通过唯一的
exp_name字段区分不同实验配置,使得在同一数据库中可以并行管理多个完全独立的策略回放,互不干扰。
注意 :务必重视
exp_name的唯一性。如果你修改了股票池、更换了LLM模型或调整了分析师组合,却使用了相同的exp_name,新实验的数据会覆盖或混淆旧实验的数据,导致分析失效。一个简单的命名习惯是{策略简述}_{模型}_{日期},例如tech_fund_gpt4o_20241027。
3. 环境配置与数据库部署实操详解
纸上得来终觉浅,我们直接上手部署。这里我会结合官方指南,补充一些实际操作中容易遇到的细节和选择建议。
3.1 环境搭建:Conda vs uv 的选择
项目提供了Conda和uv两种环境管理方案,两者各有优劣。
-
Conda :更适合数据科学和机器学习领域,对Python包与非Python依赖(如某些C++库)的管理能力更强。如果你之前的工作流一直基于Anaconda,选择它会很顺手。
# 使用Conda创建环境 conda env create -f environment.yml conda activate deepfund # 环境名称通常在environment.yml中定义 -
uv :是一个用Rust写的极速Python包安装器和项目管理器,速度非常快,并且
pyproject.toml是现代Python项目的标准配置。它更轻量,依赖解析和安装体验更流畅。 我个人更推荐uv ,特别是对于新项目。# 安装uv (如果未安装) curl -LsSf https://astral.sh/uv/install.sh | sh # 进入项目目录,同步依赖(会自动创建.venv虚拟环境) uv sync # 激活虚拟环境 # Linux/macOS source .venv/bin/activate # Windows .venv\Scripts\activate
实操心得 :在Windows系统上,如果使用PowerShell执行uv sync后激活环境失败,可以尝试先关闭当前PowerShell窗口,重新打开一个再进入项目目录激活。此外,确保你的Python版本是3.11或更高,这是项目明确要求的。
3.2 数据库选择与配置:Supabase vs SQLite
这是第一个关键决策点。数据库的选择直接影响部署复杂度和后期功能。
方案一:使用Supabase(推荐用于正式实验) Supabase是一个开源的Firebase替代品,提供托管的PostgreSQL数据库。DeepFund默认连接它。
- 注册与创建 :访问 Supabase官网 ,免费套餐足够个人研究使用。新建一个项目,获取
Project URL和API Key(在Settings -> API页面)。 - 初始化表结构 :在Supabase的SQL Editor中,运行项目提供的
src/database/supabase_setup.sql脚本。这个脚本会创建config,portfolio,decision,signal四张核心表。 - 配置环境变量 :复制
.env.example文件为.env,填入你的Supabase连接信息。SUPABASE_URL=你的Project URL SUPABASE_KEY=你的API Key(建议使用`service_role` key,权限较高,但注意保密) OPENAI_API_KEY=你的OpenAI Key # 或其他LLM提供商密钥
优势 :数据在云端,易于多机访问和团队协作;自带管理后台和可视化工具;便于未来扩展为Web应用展示层。 劣势 :需要网络连接;免费版有空间和请求限制。
方案二:使用SQLite(推荐用于快速本地验证) SQLite是单文件数据库,无需服务器,配置简单。
- 创建数据库 :运行项目提供的初始化脚本。
这会在cd src python database/sqlite_setup.pysrc/assets/目录下生成一个deepfund.db文件。 - 运行命令 :在运行主程序时, 必须 加上
--local-db参数,否则系统会尝试连接Supabase并报错。python main.py --config config/my_config.yaml --trading-date 2024-01-02 --local-db
优势 :绝对简单,零依赖,适合快速跑通流程、调试代码。 劣势 :缺乏高级的查询和管理功能;不适合大规模或长期实验;数据文件需要手动备份。
重要提示 :无论选择哪种数据库,首次运行前,请务必确认表已成功创建。对于Supabase,可以在Table Editor中查看;对于SQLite,可以使用VSCode的SQLite Viewer扩展或命令行工具
sqlite3 assets/deepfund.db进行查看。
3.3 配置文件解析与定制
配置文件是控制整个系统行为的核心。我们仔细拆解一下 src/config/ 下的模板。
# Deep Fund Configuration
exp_name: "demo_gpt4o_tech" # 实验唯一标识,必改!
# Trading settings
tickers:
- AAPL
- MSFT
- GOOGL
# - 000001.SZ # 如果需要A股,需确保数据API支持并正确映射
# Analysts to run, refer to graph.constants.py
planner_mode: false # 初始建议关闭,先理解基础流程
workflow_analysts:
- technical_analyst # 技术分析师
- sentiment_analyst # 情绪分析师
# - fundamental_analyst # 基本面分析师(可能需要额外数据源)
# LLM model settings, refer to llm/inference.py
llm:
provider: "openai" # 可选:openai, anthropic, deepseek等
model: "gpt-4o" # 根据provider选择对应模型,如"claude-3-5-sonnet-20241022"
temperature: 0.1 # 建议设置较低值,保证决策稳定性
request_timeout: 120
-
tickers:这是你的投资标的池。 你需要确保你使用的金融数据API支持这些标的的实时或历史数据 。项目默认可能集成了一些免费API(如Yahoo Finance),但对于更复杂的市场(如A股)或更丰富的数据(如深度财报),你需要自行在src/apis/目录下扩展或适配数据获取逻辑。 -
workflow_analysts:列表中的名字必须与src/graph/constants.py中定义的Analyst类型一致。你可以从这里开始,只启用一两个分析师,观察它们的工作输出。 -
llm:这是成本和质量的核心控制点。gpt-4o-mini成本较低适合大量实验,gpt-4o或claude-3.5-sonnet推理能力更强。temperature参数至关重要,在金融决策场景下,通常建议设置在0.1-0.3之间,以降低回答的随机性,使决策更可重复。
4. 运行系统与核心工作流拆解
环境就绪后,让我们启动系统,并深入看看各个组件是如何协同工作的。
4.1 首次运行与数据流观察
假设我们使用SQLite进行第一次试运行,命令如下:
cd src
python main.py --config config/demo_config.yaml --trading-date 2024-10-01 --local-db
如果一切顺利,你将在终端看到类似以下的日志输出,这清晰地展示了工作流的执行过程:
[INFO] Initializing DeepFund system for experiment: demo_gpt4o_tech
[INFO] Connected to local SQLite database.
[INFO] Fetching market data for ['AAPL', 'MSFT', 'GOOGL'] on 2024-10-01...
[INFO] Analyst `technical_analyst` is processing...
[INFO] Analyst `sentiment_analyst` is processing...
[INFO] Generated Signal: technical_analyst recommends BUY AAPL due to breakout pattern.
[INFO] Generated Signal: sentiment_analyst recommends HOLD MSFT, news sentiment neutral.
[INFO] Portfolio Manager is synthesizing signals...
[INFO] Decision: SELL 10 shares of GOOGL, BUY 15 shares of AAPL. Reasoning: ...
[INFO] Portfolio updated. Current value: $100,250.
[INFO] All data persisted to database.
这个过程对应了下图所示的框架:
- 数据获取层 :
apis/模块被调用,获取指定交易日的基础数据。 - 智能体分析层 :每个在
workflow_analysts中定义的分析师,会收到市场数据,并调用LLM(根据配置)生成一份结构化的分析报告(Signal)。这个过程是并行的。 - 决策整合层 :所有分析师的报告被汇总给“投资经理”智能体。该智能体同样调用LLM,综合所有信息、考虑当前持仓和风险,做出最终的交易决策(Decision)。
- 状态更新与持久化层 :根据决策,系统计算新的持仓,并更新
portfolio表。同时,所有的signal和decision记录都被写入数据库。
4.2 分析师智能体的内部机制
每个分析师(如 technical_analyst )都不是一个简单的函数,而是一个符合特定规范的LangGraph智能体。其核心位于 src/graph/ 目录下。一个典型的分析师包含:
- Prompt模板 :定义了给LLM的指令,告诉它扮演什么角色、分析哪些数据、输出什么格式。
- 状态模式 :定义了智能体内部的状态流转,例如
{"market_data": ..., "analysis": null}->{"market_data": ..., "analysis": "BUY ..."}。 - 输出模式 :通常是一个Pydantic模型,强制LLM以JSON格式输出,包含
action(BUY/SELL/HOLD)、ticker、confidence、reasoning等字段。这保证了输出的结构化,便于后续程序处理。
如果你想 自定义一个分析师 ,比如添加一个“宏观经济分析师”,你需要:
- 在
src/agents/下创建一个新的智能体类,继承基础类。 - 在
src/graph/下为其设计专用的Prompt和输出模式。 - 在
src/graph/constants.py中注册这个新的分析师类型。 - 最后,在你的配置文件的
workflow_analysts列表中加入它。
4.3 投资经理的决策逻辑
投资经理(Portfolio Manager)是系统的“大脑”。它接收的是一个 List[Signal] 。它的Prompt会更复杂,要求它:
- 评估每个信号的可信度和逻辑。
- 权衡不同信号之间的冲突(例如,技术面看涨,情绪面看跌)。
- 结合当前持仓的盈亏情况和风险集中度。
- 遵守潜在的交易规则(如单只股票最大仓位限制)。
- 最终输出一个
Decision列表,包含具体的交易指令。
这个环节最能体现LLM的复杂推理和权衡能力。你可以在 src/graph/portfolio_manager.py 中查看其默认实现,并根据自己的投资理念进行修改。
5. 结果分析与性能评估实战
系统运行一段时间(多个交易日)后,你的数据库里就积累了宝贵的实验数据。如何从中提取洞见?
5.1 使用Supabase Studio进行可视化分析(推荐)
如果你使用Supabase,这是最强大的分析工具。登录Supabase项目,进入 SQL Editor 或 Table Editor 。
-
查看每日决策 :
SELECT trading_date, ticker, action, quantity, reasoning FROM decision WHERE exp_name = 'demo_gpt4o_tech' ORDER BY trading_date DESC, created_at DESC;这能让你追溯LLM每一天的“思考过程”。
-
计算投资组合净值曲线 :
SELECT trading_date, total_value FROM portfolio WHERE exp_name = 'demo_gpt4o_tech' ORDER BY trading_date ASC;将结果导出到CSV,用Excel或Python的Matplotlib绘制净值曲线图,是评估策略表现的第一步。
-
信号与决策关联分析 :
SELECT s.trading_date, s.analyst_type, s.ticker as signal_ticker, s.action as signal_action, d.ticker as decision_ticker, d.action as decision_action FROM signal s LEFT JOIN decision d ON s.exp_name = d.exp_name AND s.trading_date = d.trading_date AND s.ticker = d.ticker WHERE s.exp_name = 'demo_gpt4o_tech' ORDER BY s.trading_date DESC;这个查询可以帮你分析投资经理在多大程度上采纳了各个分析师的建议。
5.2 使用Python进行本地化深度分析
对于更复杂的分析,可以编写Python脚本直接连接数据库。
import sqlite3
import pandas as pd
import matplotlib.pyplot as plt
# 连接SQLite数据库
conn = sqlite3.connect('assets/deepfund.db')
exp_name = 'demo_gpt4o_tech'
# 读取组合净值
portfolio_df = pd.read_sql_query(
f"SELECT * FROM portfolio WHERE exp_name = '{exp_name}' ORDER BY trading_date",
conn
)
portfolio_df['trading_date'] = pd.to_datetime(portfolio_df['trading_date'])
portfolio_df.set_index('trading_date', inplace=True)
# 绘制净值曲线
plt.figure(figsize=(12, 6))
plt.plot(portfolio_df.index, portfolio_df['total_value'], label='Portfolio Value', linewidth=2)
plt.title(f'Portfolio Performance for Experiment: {exp_name}')
plt.xlabel('Date')
plt.ylabel('Total Value ($)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.show()
# 分析交易频率
decision_df = pd.read_sql_query(
f"SELECT action, COUNT(*) as count FROM decision WHERE exp_name = '{exp_name}' GROUP BY action",
conn
)
print("交易行为统计:")
print(decision_df)
conn.close()
通过计算每日收益率、年化收益率、夏普比率、最大回撤等指标,你可以定量地比较不同LLM模型(如GPT-4o vs Claude-3.5-Sonnet)或不同分析师组合的策略表现。
5.3 理解“竞技场”视图
DeepFund论文和Demo网站中展示的“竞技场”视图,是其核心创新。它通常不是一个简单的排名,而是一个多维度的雷达图或平行坐标图,可能包含以下维度:
- 绝对收益 :策略的总回报率。
- 风险调整后收益 :如夏普比率。
- 换手率 :反映策略的交易活跃度,间接体现交易成本。
- 胜率 :盈利交易次数占总交易次数的比例。
- 最大回撤 :策略运行期间最大的峰值到谷值的跌幅。
- 与基准的相关性 :策略收益是否独立于市场大盘(如S&P 500)。
- 决策一致性 :LLM在相似市场状况下做出相同决策的概率,反映其稳定性。
要复现这样的分析,你需要运行多个实验(不同LLM、不同配置),收集它们的绩效指标,然后使用 plotly 或 matplotlib 库进行可视化。项目源码中可能包含了生成此类图表的基础工具,你可以在此基础上进行定制。
6. 常见问题、避坑指南与进阶技巧
在实际部署和实验过程中,我遇到了不少坑,也总结出一些提升效率的技巧。
6.1 常见问题排查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
运行 main.py 时报 ModuleNotFoundError |
虚拟环境未激活或依赖未安装 | 1. 确认已激活正确环境 ( conda activate deepfund 或 source .venv/bin/activate )。 2. 尝试重新安装依赖 ( uv sync 或 pip install -e . )。 |
| 连接Supabase失败,报SSL或连接超时错误 | 网络问题;环境变量配置错误 | 1. 检查网络连接,特别是代理设置。 2. 核对 .env 文件中的 SUPABASE_URL 和 SUPABASE_KEY 是否正确,确保没有多余空格。 3. 尝试在Supabase后台的Database -> Connection Pooling中调整连接参数。 |
运行时报错,提示 tickers 数据获取失败 |
数据API不可用、请求频率超限或股票代码格式不对 | 1. 检查 src/apis/ 下对应数据源模块的日志。 2. 确认股票代码在当前数据源中有效(如雅虎财经用 AAPL ,而非 AAPL.US )。 3. 考虑使用备用数据源或增加请求延迟。 |
| LLM调用长时间无响应或报超时错误 | API密钥无效;网络问题;模型名称错误;请求超时设置太短 | 1. 检查 .env 中的API密钥。 2. 将 llm 配置中的 request_timeout 调大(如设为300)。 3. 确认 provider 和 model 名称与官方文档一致(如OpenAI的 gpt-4o )。 |
| 数据库表不存在错误 | 未初始化数据库表 | 1. Supabase : 务必在SQL Editor中运行 supabase_setup.sql 。 2. SQLite : 确保运行了 python database/sqlite_setup.py 。 |
| 实验数据混乱,不同配置的结果混在一起 | 未更改 exp_name |
严格遵守 :任何配置的更改(股票池、LLM模型、分析师列表),都必须使用一个新的、唯一的 exp_name 。 |
6.2 成本控制与优化技巧
使用商用LLM API是主要成本来源。以下方法可以有效控制:
- 从轻量模型开始 :初期实验使用
gpt-3.5-turbo或gpt-4o-mini,验证流程是否通畅。 - 精简Prompt :审查
src/graph/prompts/下的Prompt模板,在保证指令清晰的前提下,移除不必要的背景描述和示例,缩短文本长度。 - 缓存LLM响应 :对于历史日期回测,相同的输入(市场数据)应该产生相同的输出。可以实现一个简单的缓存层,将
(model, prompt, date)的哈希值作为键,将LLM响应缓存到本地文件或Redis中,避免重复调用。 注意 :这仅适用于严格的历史回测,在实时交易中不可用。 - 限制分析师数量 :在
workflow_analysts中只启用最核心的分析师。每个分析师都是一次独立的LLM调用。 - 使用本地模型 :如果你有足够的GPU资源,可以参照
src/llm/inference.py中的接口,增加对本地部署的LLM(如Llama 3、Qwen等)的支持。这需要处理模型加载、推理加速等事宜,但长期来看成本最低。
6.3 扩展数据源与分析师
项目的默认数据源可能有限。要让它适应A股等市场,你需要:
- 新增数据API模块 :在
src/apis/下创建一个新文件,例如eastmoney_api.py,实现获取股票行情、财务数据等函数。确保返回的数据格式与系统内其他API模块兼容。 - 修改数据获取逻辑 :在
src/main.py或相关的数据聚合器中,加入对新数据源的支持,可能通过配置来切换。 - 创建定制化分析师 :如果你想基于市盈率(PE)做基本面分析,就需要创建一个
fundamental_analyst。这需要:- 在
src/agents/下定义新智能体。 - 在
src/graph/prompts/下编写专业的Prompt,例如“你是一名价值投资者,请根据以下股票的市盈率、市净率和营收增长率...”。 - 定义结构化的输出Pydantic模型。
- 在
constants.py中注册,并在配置中启用。
- 在
这个过程虽然需要一些开发工作,但DeepFund的模块化设计使其变得可行。这也是开源项目的魅力所在——你可以根据自身需求,将其改造成更强大的工具。
6.4 关于“实盘”的严肃提醒
项目README和论文中反复强调: This project is for research purposes only, it DOES NOT TRADE. 这是一个研究基准框架,而非生产级的交易系统。将其用于真实交易存在巨大风险:
- 延迟 :LLM API调用有网络延迟,不满足高频交易要求。
- 稳定性 :API服务可能不稳定,导致交易指令丢失。
- 风控缺失 :系统缺乏严格的下单前风控检查(如资金充足性、涨跌停限制、异常订单识别等)。
- 合规问题 :真实的基金交易涉及严格的合规流程,本系统未包含。
请始终将其视为一个 研究模拟器 和 想法试验场 。你可以用它来比较不同AI决策逻辑的优劣,验证新的投资想法,但切勿在未经过极其严格的评估和改造前,连接真实的券商账户。
我个人在使用DeepFund的过程中,最大的收获不是找到了一个“圣杯”策略,而是获得了一个结构化的思维框架,来系统地审视和评估AI在投资决策中的能力边界。它让我更清楚地认识到,当前LLM在信息整合和逻辑推理上的优势,以及在数值计算、严格风控和极端市场情绪下的局限性。这个框架本身,比任何一个用它跑出来的短期策略都有价值得多。
更多推荐




所有评论(0)