这是一个基于人工智能的投资系统概念验证项目。项目目标是探索如何使用 AI 来辅助投资决策,通过多 Agent 协同工作,结合大型语言模型 (LLM) 的分析能力,提供多角度的市场解读和投资建议。
系统通过模拟不同角色的研究员(多头、空头)和分析师,进行信息收集、分析、辩论,最终形成投资决策。最新的“辩论室智能增强”机制引入 LLM 作为独立第三方,进一步提升决策的客观性和全面性。
多智能体协同 |
LLM 深度分析 |
辩论室机制 |
模块化架构 |
在多分析师基础上,引入多空研究员,从不同视角分析市场 | 引入大型语言模型进行客观评估和洞察生成 | 通过多方辩论达成更全面的决策 | 各 Agent 独立运作,易于扩展和维护 |
新版本的架构做出了以下改进:
- 引入了多头研究员(Researcher Bull)和空头研究员(Researcher Bear),让系统能够从不同角度分析市场
- 增加了辩论室(Debate Room)环节,通过多空双方的辩论来达成更全面的决策
- 优化了数据流向,使决策过程更加系统化和完整
另外,优化了终端输出,减少了不必要的详细数据显示,使输出更加清晰易读。
我们对新闻获取系统进行了重大升级,显著提升了新闻数据的质量和获取效率:
- 智能搜索引擎:集成了先进的搜索功能,能够更精准地获取相关财经新闻
- 多源新闻整合:支持从多个主流财经网站获取新闻,包括新浪财经、网易财经、东方财富等
- 智能缓存系统:
- 增量缓存:当请求更多新闻时,系统会智能地利用已有缓存,只获取差额部分
- 去重机制:基于新闻标题自动去重,避免重复内容
- 时效性管理:自动检查缓存有效性,确保数据时效性
- 缓存统计:详细记录缓存使用情况,包括原缓存数量、新获取数量等
- 优化的查询策略:
- 针对 A 股市场特点优化搜索关键词
- 支持时间范围限制,可获取特定日期前的新闻
- 智能过滤无关内容,提高新闻质量
我们最新升级了辩论室(Debate Room)模块的决策机制:
- LLM 第三方分析:引入大型语言模型作为独立的第三方分析师,对多空观点进行客观评估
- 混合置信度计算:将传统的多空置信度差异与 LLM 评分进行加权融合,形成更全面的决策依据
- 增强的辩论机制:系统现在能够自动汇总所有研究员的观点,生成结构化分析,并整合进最终决策
这一改进使决策过程更加平衡客观,特别适合在市场信息复杂、多方观点存在分歧的情况下提供更可靠的投资建议。未来我们将持续优化这一机制,进一步提升决策质量。
首先,克隆本仓库到您的本地:
git clone [https://github.com/24mlight/A_Share_investment_Agent.git](https://github.com/24mlight/A_Share_investment_Agent.git)
cd A_Share_investment_Agent
Poetry 是一个用于 Python 依赖管理和打包的工具。
Windows (PowerShell):
(Invoke-WebRequest -Uri [https://install.python-poetry.org](https://install.python-poetry.org) -UseBasicParsing).Content | py -
Unix/macOS:
curl -sSL [https://install.python-poetry.org](https://install.python-poetry.org) | python3 -
使用 Poetry 安装项目所需的依赖包:
poetry lock --no-update
poetry install
环境变量用于存储 API 密钥等敏感信息。
首先,复制示例环境变量文件:
# Create .env file for your API keys
cp .env.example .env
然后,您可以获取您的 Gemini API 密钥:Google AI Studio
您可以通过以下两种方式设置环境变量:
a. 直接修改 .env
文件 (推荐)
打开项目根目录下的 .env
文件, 填入您的 API key:
# Gemini API 配置
GEMINI_API_KEY=your-gemini-api-key
GEMINI_MODEL=gemini-1.5-flash
# OpenAI Compatible API 配置(可选)
OPENAI_COMPATIBLE_API_KEY=your-openai-compatible-api-key
OPENAI_COMPATIBLE_BASE_URL=https://your-api-endpoint.com/v1
OPENAI_COMPATIBLE_MODEL=your-model-name
注意: 系统会优先使用 OpenAI Compatible API(如果配置了),否则会使用 Gemini API。
b. 通过命令行设置
Unix/macOS:
# Gemini API 配置
export GEMINI_API_KEY='your-gemini-api-key'
export GEMINI_MODEL='gemini-1.5-flash'
# OpenAI Compatible API 配置(可选)
export OPENAI_COMPATIBLE_API_KEY='your-openai-compatible-api-key'
export OPENAI_COMPATIBLE_BASE_URL='https://your-api-endpoint.com/v1'
export OPENAI_COMPATIBLE_MODEL='your-model-name'
Windows PowerShell:
# Gemini API 配置
$env:GEMINI_API_KEY='your-gemini-api-key'
$env:GEMINI_MODEL='gemini-1.5-flash'
# OpenAI Compatible API 配置(可选)
$env:OPENAI_COMPATIBLE_API_KEY='your-openai-compatible-api-key'
$env:OPENAI_COMPATIBLE_BASE_URL='https://your-api-endpoint.com/v1'
$env:OPENAI_COMPATIBLE_MODEL='your-model-name'
系统支持多种运行方式:
这是直接与系统交互进行股票分析的主要方式。
基本运行 (只显示关键决策信息):
poetry run python src/main.py --ticker 000000 #修改成你想要测试的股票代码
例如,分析股票代码为 301155
的情况:
poetry run python src/main.py --ticker 301155
显示详细推理过程 (查看每个智能体的分析过程):
poetry run python src/main.py --ticker 000000 --show-reasoning #修改成你想要测试的股票代码
例如:
poetry run python src/main.py --ticker 301155 --show-reasoning
回测功能
poetry run python src/backtester.py --ticker 301157 --start-date 2024-12-11 --end-date 2025-01-07 --num-of-news 20
回测功能支持以下参数:
ticker
: 股票代码start-date
: 回测开始日期(YYYY-MM-DD
)end-date
: 回测结束日期(YYYY-MM-DD
)initial-capital
: 初始资金(可选,默认为100,000
)num-of-news
: 情绪分析使用的新闻数量(可选,默认为5
,最大为100
)
--ticker
: 股票代码(必需)--show-reasoning
: 显示分析推理过程(可选,默认为false
)--initial-capital
: 初始现金金额(可选,默认为100,000
)--num-of-news
: 情绪分析使用的新闻数量(可选,默认为5
,最大为100
)--start-date
: 开始日期,格式YYYY-MM-DD
(可选)--end-date
: 结束日期,格式YYYY-MM-DD
(可选)
此模式会启动一个 FastAPI 后端服务,允许通过 API 与系统交互,适合希望基于此后端开发自定义前端界面的用户。
# 启动API服务
poetry run python run_with_backend.py
启动后,可以通过浏览器访问 http://localhost:8000/docs
使用交互式 API 界面 (Swagger UI)。
常用 API 端点包括:
- 开始新的分析:
POST /analysis/start
(请求体中提供股票代码、初始资金等) - 查看当前工作流状态:
GET /api/workflow/status
(获取当前运行 ID 和活跃 Agent 状态) - 列出历史运行:
GET /runs/
(获取已完成运行列表) - 查看特定运行的流程图:
GET /runs/{run_id}/flow
- 查看特定 Agent 的详细执行日志:
GET /runs/{run_id}/agents/{agent_name}
- 查看 LLM 交互日志:
GET /logs/
(具体路径可能需根据实现确认)
API 服务模式的优势:
- 分析任务在后台异步执行。
- 所有结果均可通过 API 查询。
- 无需为每次分析重启程序。
- 可作为开发自定义前端的基础。
详细的后端 API 文档请参阅:查看详细的后端 API 文档
--ticker
: 股票代码 (必需)--show-reasoning
: 显示分析推理过程 (可选, 默认为false
)--initial-capital
: 初始现金金额 (可选, 默认为100,000
)--num-of-news
: 情绪分析使用的新闻数量 (可选, 默认为5
)
系统会输出以下信息:
- 基本面分析结果
- 估值分析结果
- 技术分析结果
- 情绪分析结果
- 风险管理评估
- 最终交易决策
如果使用了--show-reasoning
参数,还会显示每个智能体的详细分析过程。
示例输出 (Example Output):
正在获取 301157 的历史行情数据...
开始日期:2024-12-11
结束日期:2024-12-11
成功获取历史行情数据,共 242 条记录
警告:以下指标存在NaN值:
- momentum_1m: 20条
- momentum_3m: 60条
- momentum_6m: 120条
...(这些警告是正常的,是由于某些技术指标需要更长的历史数据才能计算)
正在获取 301157 的财务指标数据...
获取实时行情...
成功获取实时行情数据
获取新浪财务指标...
成功获取新浪财务指标数据,共 3 条记录
最新数据日期:2024-09-30 00:00:00
获取利润表数据...
成功获取利润表数据
构建指标数据...
成功构建指标数据
Final Result:
{
"action": "buy",
"quantity": 12500,
"confidence": 0.42,
"agent_signals": [
{
"agent": "Technical Analysis",
"signal": "bullish",
"confidence": 0.6
},
{
"agent": "Fundamental Analysis",
"signal": "neutral",
"confidence": 0.5
},
{
"agent": "Sentiment Analysis",
"signal": "neutral",
"confidence": 0.8
},
{
"agent": "Valuation Analysis",
"signal": "bearish",
"confidence": 0.99
},
{
"agent": "Risk Management",
"signal": "buy",
"confidence": 1.0
}
],
"reasoning": "Risk Management allows a buy action with a maximum quantity of 12500..."
}
系统会在 logs/
目录下生成以下类型的日志文件:
-
回测日志
- 文件名格式:
backtest_{股票代码}_{当前日期}_{回测开始日期}_{回测结束日期}.log
- 示例:
backtest_301157_20250107_20241201_20241230.log
- 包含:每个交易日的分析结果、交易决策和投资组合状态
- 文件名格式:
-
API 调用日志
- 文件名格式:
api_calls_{当前日期}.log
- 示例:
api_calls_20250107.log
- 包含:所有 API 调用的详细信息和响应
- 文件名格式:
所有日期格式均为 YYYY-MM-DD。如果使用了 --show-reasoning
参数,详细的分析过程也会记录在日志文件中。
A_Share_investment_Agent/
├── backend/ # 后端 API 和服务
│ ├── dependencies.py # 依赖注入 (如 LogStorage)
│ ├── main.py # FastAPI 应用实例
│ ├── models/ # API 请求/响应模型 (Pydantic)
│ │ ├── analysis.py # /analysis/ 相关路由
│ │ ├── api_runs.py # /api/runs/ 相关路由 (基于 api_state)
│ │ ├── logs.py # /logs/ 相关路由
│ │ ├── runs.py # /runs/ 相关路由 (基于 BaseLogStorage)
│ │ └── workflow.py # /api/workflow/ 相关路由
│ ├── schemas.py # 内部数据结构/日志模型 (Pydantic)
│ ├── services/ # 业务逻辑服务
│ │ └── analysis.py # 股票分析服务
│ ├── state.py # 内存状态管理 (api_state)
│ ├── storage/ # 日志存储实现
│ │ ├── base.py # BaseLogStorage 接口定义
│ │ └── memory.py # InMemoryLogStorage 实现
│ └── utils/ # 后端工具函数
│ ├── api_utils.py # API 相关工具
│ └── context_managers.py # 上下文管理器 (如 workflow_run)
├── src/ # Agent 核心逻辑和工具
│ ├── agents/ # Agent 定义和工作流
│ │ ├── __init__.py
│ │ ├── debate_room.py
│ │ ├── fundamentals.py
│ │ ├── macro_analyst.py # 宏观分析师Agent
│ │ ├── market_data.py
│ │ ├── portfolio_manager.py
│ │ ├── researcher_bear.py
│ │ ├── researcher_bull.py
│ │ ├── risk_manager.py
│ │ ├── sentiment.py
│ │ ├── state.py
│ │ ├── technicals.py
│ │ └── valuation.py
│ ├── data/ # 数据存储目录 (本地缓存等)
│ │ ├── img/ # 项目图片
│ │ ├── sentiment_cache.json # 情感分析结果缓存
│ │ ├── macro_analysis_cache.json # 宏观分析结果缓存
│ │ └── stock_news/ # 股票新闻数据
│ ├── tools/ # 工具和功能模块 (LLM, 数据获取)
│ │ ├── __init__.py
│ │ ├── api.py
│ │ ├── data_analyzer.py
│ │ ├── news_crawler.py
│ │ └── openrouter_config.py
│ ├── utils/ # 通用工具函数 (日志, LLM客户端, 序列化)
│ │ ├── __init__.py
│ │ ├── api_utils.py # Agent 共享的API工具 (逐步迁移至 backend)
│ │ ├── llm_clients.py
│ │ ├── llm_interaction_logger.py
│ │ ├── logging_config.py
│ │ ├── output_logger.py
│ │ ├── serialization.py
│ │ ├── structured_terminal.py # 结构化终端输出
│ │ └── summary_report.py # 汇总报告生成
│ ├── backtester.py # 回测系统 (可能需要检查状态)
│ └── main.py # Agent 工作流定义和命令行入口
├── logs/ # 日志文件目录 (主要由 OutputLogger 生成)
├── .env # 环境变量配置
├── .env.example # 环境变量示例
├── poetry.lock # Poetry依赖锁定文件
├── pyproject.toml # Poetry项目配置
├── run_with_backend.py # 启动后端并可选执行分析的脚本
└── README.md # 项目文档
我们欢迎各种形式的贡献!
- Fork 本仓库
- 创建您的特性分支 (
git checkout -b feature/AmazingFeature
) - 提交您的更改 (
git commit -m 'Add some AmazingFeature'
) - 推送到分支 (
git push origin feature/AmazingFeature
) - 创建 Pull Request
如果这个项目对你有帮助,欢迎请我喝杯咖啡 ❤️
同时也欢迎关注我们的公众号【空指针指向量化 Agent】(原文为:空指针指向了量化 Agent,根据上下文推测可能笔误),获取更多量化投资和 AI 智能交易相关的干货内容!
本项目是一个基于多个 agent 的 AI 投资系统,采用模块化设计,每个 agent 都有其专门的职责。系统的架构如下:
Market Data Analyst → [Technical/Fundamentals/Sentiment/Valuation Analyst & Researcher Bull/Bear & Debate Room] → Risk Manager → Portfolio Manager → Trading Decision
(架构图已在前面展示)
-
Market Data Analyst
- 作为系统的入口点
- 负责收集和预处理所有必要的市场数据
- 通过 akshare API 获取 A 股市场数据
- 数据来源:东方财富、新浪财经等
-
Technical Analyst
- 分析价格趋势、成交量、动量等技术指标
- 生成基于技术分析的交易信号
- 关注短期市场走势和交易机会
-
Fundamentals Analyst
- 分析公司财务指标和经营状况
- 评估公司的长期发展潜力
- 生成基于基本面的交易信号
-
Sentiment Analyst
- 分析市场新闻和舆论数据
- 评估市场情绪和投资者行为
- 生成基于情绪的交易信号
-
Valuation Analyst
- 进行公司估值分析
- 评估股票的内在价值
- 生成基于估值的交易信号
-
Researcher Bull / Researcher Bear (新增)
- 分别从多头和空头角度进行深入研究和分析,提供对立观点。
-
Debate Room (新增与增强)
- 多空研究员在此陈述观点并进行辩论。
- 引入 LLM 作为第三方分析师,对辩论内容和观点进行客观评估。
- 综合各方观点和 LLM 评分,形成更全面的决策依据。
-
Risk Manager
- 整合所有 agent 的交易信号和辩论结果
- 评估潜在风险
- 设定交易限制和风险控制参数
- 生成风险管理信号
-
Portfolio Manager
- 作为最终决策者
- 综合考虑所有信号、辩论结果和风险因素
- 做出最终的交易决策(买入/卖出/持有)
- 确保决策符合风险管理要求
-
市场数据 (Market Data)
{ "market_cap": float, # 总市值 "volume": float, # 成交量 "average_volume": float, # 平均成交量 "fifty_two_week_high": float, # 52周最高价 "fifty_two_week_low": float # 52周最低价 }
-
财务指标数据 (Financial Metrics)
{ # 市场数据 "market_cap": float, # 总市值 "float_market_cap": float, # 流通市值 # 盈利数据 "revenue": float, # 营业总收入 "net_income": float, # 净利润 "return_on_equity": float, # 净资产收益率 "net_margin": float, # 销售净利率 "operating_margin": float, # 营业利润率 # 增长指标 "revenue_growth": float, # 主营业务收入增长率 "earnings_growth": float, # 净利润增长率 "book_value_growth": float, # 净资产增长率 # 财务健康指标 "current_ratio": float, # 流动比率 "debt_to_equity": float, # 资产负债率 "free_cash_flow_per_share": float, # 每股经营性现金流 "earnings_per_share": float, # 每股收益 # 估值比率 "pe_ratio": float, # 市盈率(动态) "price_to_book": float, # 市净率 "price_to_sales": float # 市销率 }
-
财务报表数据 (Financial Statements)
{ "net_income": float, # 净利润 "operating_revenue": float, # 营业总收入 "operating_profit": float, # 营业利润 "working_capital": float, # 营运资金 "depreciation_and_amortization": float, # 折旧和摊销 "capital_expenditure": float, # 资本支出 "free_cash_flow": float # 自由现金流 }
-
交易信号 (Trading Signals)
{ "action": str, # "buy", "sell", "hold" "quantity": int, # 交易数量 "confidence": float, # 置信度 (0-1) (可能是混合置信度) "agent_signals": [ # 各个 agent 的信号 { "agent": str, # agent 名称 "signal": str, # "bullish", "bearish", "neutral" "confidence": float # 置信度 (0-1) } ], "reasoning": str # 决策理由 (可能包含辩论摘要和LLM评估) }
-
数据采集阶段
- Market Data Agent 通过 akshare API 获取实时市场数据:
- 股票实时行情 (
stock_zh_a_spot_em
) - 历史行情数据 (
stock_zh_a_hist
) - 财务指标数据 (
stock_financial_analysis_indicator
) - 财务报表数据 (
stock_financial_report_sina
)
- 股票实时行情 (
- 新闻数据通过新浪财经 API 获取
- 所有数据经过标准化处理和格式化
- Market Data Agent 通过 akshare API 获取实时市场数据:
-
分析阶段
- Technical Analyst:计算技术指标,分析价格模式,生成技术分析评分和建议。
- Fundamentals Analyst:分析财务报表,评估基本面,生成基本面分析评分。
- Sentiment Analyst:分析市场新闻,使用 AI 模型评估情感,生成市场情绪评分。
- Valuation Analyst:计算估值指标,进行 DCF 估值,评估内在价值。
- Researcher Bull/Bear:从各自立场出发,进行深入分析,准备辩论材料。
-
辩论与评估阶段 (Debate Room)
- 多空研究员提交观点。
- 系统汇总观点,可能由 LLM 辅助生成结构化分析。
- LLM 作为第三方对观点进行客观评估,给出评分。
- 计算混合置信度。
-
风险评估阶段 Risk Manager 综合考虑多个维度:
- 市场风险评估(波动率、Beta 等)
- 头寸规模限制计算
- 止损止盈水平设定
- 投资组合风险控制
- 整合来自辩论室的增强信号。
-
决策阶段 Portfolio Manager 基于以下因素做出决策:
- 各 Agent 的信号强度和置信度。
- 辩论室的综合结论和混合置信度。
- 当前市场状况和风险水平。
- 投资组合状态和现金水平。
- 交易成本和流动性考虑。
-
数据存储和缓存
- 情绪分析结果缓存在
data/sentiment_cache.json
- 新闻数据保存在
data/stock_news/
目录 - 日志文件按类型存储在
logs/
目录 - API 调用记录实时写入日志
- 情绪分析结果缓存在
-
监控和反馈
- 所有 API 调用都有详细的日志记录
- 每个 Agent 的分析过程可追踪
- 系统决策过程(包括辩论环节)透明可查
- 回测结果提供性能评估
-
信息共享
- 所有代理共享同一个状态对象 (AgentState) 或通过明确定义的数据结构传递信息。
- 通过消息传递机制或顺序调用进行通信。
- 每个代理都可以访问必要的历史数据和前序分析结果。
-
决策权重与融合 Portfolio Manager 在做决策时考虑不同信号的权重,并结合辩论室的混合置信度:
- 估值分析:(示例权重) 35%
- 基本面分析:(示例权重) 30%
- 技术分析:(示例权重) 25%
- 情绪分析:(示例权重) 10%
- 辩论室结论:可能作为最终决策的重要调整因子或独立置信度来源。
-
风险控制
- 强制性风险限制
- 最大持仓限制
- 交易规模限制
- 止损和止盈设置
-
多 LLM 支持
- 支持 Google Gemini API
- 支持任何兼容 OpenAI API 格式的 LLM 服务(如华为云方舟、OpenRouter 等)
- 智能切换功能:自动选择可用的 LLM 服务
-
模块化设计
- 每个代理都是独立的模块
- 易于维护和升级
- 可以单独测试和优化
-
可扩展性
- 可以轻松添加新的分析师或研究员角色
- 支持添加新的数据源
- 可以扩展决策策略和辩论机制
-
风险管理
- 多层次的风险控制
- 实时风险评估
- 自动止损机制 (规划中或部分实现)
-
智能决策与解释性
- 基于多维度分析和多方观点博弈
- 考虑多个市场因素
- 动态调整策略
- 通过
--show-reasoning
和辩论室机制增强决策过程的透明度和可解释性
-
数据源扩展
- 添加更多 A 股数据源 (如财报、公告的结构化数据)
- 接入更多财经数据平台
- 增加社交媒体情绪数据、行业研报等另类数据
- 扩展到港股、美股市场
-
功能增强
- 添加更多复杂技术指标和量化策略因子
- 实现更完善和自动化的回测系统,支持参数优化
- 支持多股票组合管理和动态调仓
- 增强 LLM 在策略生成、代码解释、市场总结等方面的应用
-
性能优化
- 提高数据处理效率,优化 Agent 间通信
- 优化决策算法和 LLM 调用效率
- 增加并行处理能力,支持更大规模的分析任务
情感分析代理(Sentiment Agent)是系统中的关键组件之一,负责分析市场新闻和舆论对股票的潜在影响。
-
新闻数据采集
- 自动抓取最新的股票相关新闻
- 支持多个新闻源 (当前主要为新浪财经)
- 实时更新新闻数据 (根据调用频率)
-
情感分析处理
- 使用先进的 AI 模型 (LLM) 分析新闻情感
- 情感分数范围:-1(极其消极)到 1(极其积极)
- 考虑新闻的重要性和时效性 (隐式或显式)
-
交易信号生成
- 基于情感分析结果生成交易信号
- 包含信号类型(看涨/看跌/中性)
- 提供置信度评估
- 附带详细的分析理由 (可能由 LLM 生成摘要)
- 1.0: 极其积极(重大利好消息、超预期业绩、行业政策支持)
- 0.5 到 0.9: 积极(业绩增长、新项目落地、获得订单)
- 0.1 到 0.4: 轻微积极(小额合同签订、日常经营正常)
- 0.0: 中性(日常公告、人事变动、无重大影响的新闻)
- -0.1 到 -0.4: 轻微消极(小额诉讼、非核心业务亏损)
- -0.5 到 -0.9: 消极(业绩下滑、重要客户流失、行业政策收紧)
- -1.0: 极其消极(重大违规、核心业务严重亏损、被监管处罚)
本项目修改自 ai-hedge-fund。我们衷心感谢原作者的出色工作和启发。原项目为我们针对 A 股市场的适配和改进提供了坚实的基础。
本项目使用双重许可证:
This project is dual-licensed:
- 原始代码(来自 ai-hedge-fund)采用 MIT 许可证。
- 允许商业和非商业使用、修改和分发。
- 由
24mlight
创建的所有修改和新增代码采用 GNU General Public License v3 (GPL v3),并附加非商业条款。 - 允许非商业使用、修改和分发,需提供源代码。
- 严格禁止任何商业用途(如商业产品、服务、销售或获取商业利益)。
- 必须保留原始版权声明和许可证声明。
- 衍生作品必须以相同许可证(GPL v3 with Non-Commercial Clause)分发。
详细信息请参阅 LICENSE
文件。