type
status
date
slug
summary
tags
category
icon
password

ai-hedge-fund 是一个 AI agent 应用于投资决策的开源项目,本文梳理其中各 agent 行为逻辑。
Ben Graham
基于本杰明·格雷厄姆(Benjamin Graham)价值投资原则 来分析股票,并生成一个 买入(bullish)、卖出(bearish)或中性(neutral) 的投资信号。以下是代码的详细解析:
1. 主要流程
代码的核心流程如下:
- 从 AgentState 获取股票数据
- 读取 state["data"] 里的 end_date 和 tickers(股票列表)。
- 获取股票的财务数据
- get_financial_metrics(ticker, end_date): 获取关键财务指标。
- search_line_items(ticker, [...]): 获取具体的财务报表项目,如 earnings_per_share、book_value_per_share、revenue、total_assets 等。
- get_market_cap(ticker, end_date): 获取市值。
- 进行财务分析
- analyze_earnings_stability(...): 评估盈利稳定性(是否长期保持盈利、EPS增长)。
- analyze_financial_strength(...): 评估财务稳健性(流动性、债务比例、股息历史)。
- analyze_valuation_graham(...): 计算估值(净流动资产 vs. 市值、Graham Number 计算)。
- 计算总评分,并确定信号
- 计算 总分 total_score,满分 15。
- 得分 ≥ 70% → bullish(看涨)
- 得分 ≤ 30% → bearish(看跌)
- 介于 30%-70% 之间 → neutral(中性)
- 调用 LLM 生成最终分析
- generate_graham_output(...) 结合 LLM 生成更详细的分析结果,包括信号、置信度、理由。
- 存储分析结果,并返回
- 将 ben_graham_agent 结果存入 state["data"]["analyst_signals"]。
- 以 JSON 格式返回 投资信号。
2. 关键功能模块解析
(1)分析盈利稳定性
- 目标: 判断 EPS(每股收益)是否长期稳定增长。
- 评分逻辑:
- EPS 全部为正(满分 3 分)。
- 80% 以上年份 EPS 为正(2 分)。
- 增长趋势(1 分)。
(2)分析财务稳健性
- 目标: 评估流动性、债务情况、股息历史。
- 评分逻辑:
- 流动比率(current ratio = current_assets / current_liabilities)
- ≥ 2.0 → +2 分
- ≥ 1.5 → +1 分
- 资产负债率(total_liabilities / total_assets)
- < 50% → +2 分
- < 80% → +1 分
- 是否有股息记录(+1 分)。
(3)格雷厄姆估值分析
- 目标: 使用 Graham Number 和净流动资产(Net-Net)原则计算股票估值。
- 评分逻辑:
- 净流动资产(Net-Net)
- 若 (Current Assets - Total Liabilities) > Market Cap → 4 分
- 若 $NCAV Per Share >= 2/3 * Price Per Share$ → 2 分
- Graham Number 计算
- $\text{Graham Number} = \sqrt{22.5 \times EPS \times BVPS}$
- 安全边际(Margin of Safety)
- 价格 ≤ Graham Number 的 50% → +3 分
- 价格 ≤ Graham Number 的 80% → +1 分
(4)生成最终投资信号
- 使用 LLM 生成投资信号
- LLM 模拟本杰明·格雷厄姆的投资风格,给出:
- signal(bullish、bearish、neutral)
- confidence(置信度)
- reasoning(分析理由)
3. 代码作用总结
- 基于格雷厄姆价值投资理论,分析股票的盈利稳定性、财务健康状况、估值。
- 获取 10 年财务数据(EPS、资产负债、市值等)。
- 评分系统 评估财务健康情况,总分 15 分。
- 基于得分判断信号(bullish、bearish、neutral)。
- 调用 LLM 生成分析报告,提供详细的投资理由。
4. 适用场景
- 价值投资者 想要找到被低估的公司。
- 量化投资 结合格雷厄姆原则自动筛选股票。
- 金融分析工具 可集成到投研系统,提供自动化投资建议。
Bill Ackman
这段 bill_ackman_agent 代码的核心功能是 基于比尔·阿克曼(Bill Ackman)的投资哲学 对股票进行分析,并生成一个 买入(bullish)、卖出(bearish)或中性(neutral) 的投资信号。其逻辑类似 ben_graham_agent,但核心分析框架不同,更注重 企业质量、财务纪律和内在价值评估。以下是代码的详细解析:
1. 代码主要流程
📌 1.1 获取股票数据
- 从 AgentState 读取分析所需的 tickers(股票列表)和 end_date(截止日期)。
📌 1.2 获取财务数据
- 获取财务指标 (get_financial_metrics),包括 ROE(净资产收益率)等关键数据。
- 获取财报明细 (search_line_items),涵盖收入、运营利润率、负债率、自由现金流等 8 个重要项目。
- 获取市场价值 (get_market_cap),用于估值计算。
📌 1.3 进行核心财务分析
- 企业质量分析
- 关注 收入增长、运营利润率、自由现金流稳定性、ROE,判断企业是否有 长期竞争优势(moat)。
- 财务纪律分析
- 关注 负债管理、资产负债比、股息支付、股票回购,评估企业是否 合理使用资本。
- 内在价值评估
- 估算 自由现金流贴现值(DCF),计算 内在价值(Intrinsic Value) 并对比市场价值,判断是否 有足够安全边际。
📌 1.4 计算总评分 & 生成交易信号
- 评分满分 15 分,根据总分确定信号:
- ≥ 70% 看涨 (bullish)
- ≤ 30% 看跌 (bearish)
- 30% ~ 70% 中性 (neutral)
📌 1.5 调用 LLM 生成最终分析
- 让 LLM 模仿比尔·阿克曼的风格,生成 交易信号、置信度和投资理由。
📌 1.6 存储并返回分析结果
- 存入 state["data"],供后续调用。
- 返回 JSON 结果,封装为 HumanMessage 以供 LLM 进一步处理。
2. 关键分析模块
(1)企业质量分析
- 目标: 判断公司是否具备长期竞争力(如护城河)。
- 核心指标:
- 收入增长:如果收入增长率 >50%,得 2 分,否则得 1 分。
- 运营利润率 (operating_margin):如果大部分年份 >15%,得 2 分。
- 自由现金流(FCF):如果多数年份 >0,得 1 分。
- ROE(净资产收益率):如果 ROE > 15%,得 2 分。
(2)财务纪律分析
- 目标: 评估企业 债务管理 和 资本分配 是否合理。
- 核心指标:
- 债务水平:
- 主要检查 debt_to_equity(债务股权比)是否 <1。
- 备选检查 liabilities/assets 是否 <50%。
- 股息支付 & 股票回购:
- 长期支付股息 → +1 分。
- 减少流通股数(回购) → +1 分。
(3)内在价值评估
- 目标: 使用 自由现金流贴现模型(DCF) 估算公司 内在价值。
- 计算方法:
- 假设:
- 自由现金流(FCF)增长率 = 6%
- 折现率 = 10%
- 终值倍数 = 15
- DCF 计算:
- 总内在价值 = PV + TV
- 与市值对比:
3. 生成投资信号
- 让 LLM 模拟阿克曼的投资风格:
- 是否具备竞争优势(如品牌、市场份额、商业模式)。
- 自由现金流稳定性。
- 财务纪律(债务、ROE、资本回报)。
- 估值是否合理,有无足够安全边际。
- 最终输出:
5. 代码作用总结
✅ 使用比尔·阿克曼的投资框架,分析企业质量、财务纪律和估值
✅ 采用量化评分系统(满分 15),综合评估投资信号
✅ 结合 LLM 生成 “bullish/bearish/neutral” 信号,提供详细投资理由
✅ 适用于长期投资者,寻找具备 持续增长潜力 的优质企业
Cathie Wood
这个 cathie_wood_agent 代码的核心目标是基于 Cathie Wood 的投资理念,利用 LLM(大型语言模型)和财务数据,对特定股票进行分析,并生成投资信号(bullish, bearish, neutral)。其主要逻辑如下:
1. 代码结构
代码主要由以下部分组成:
- CathieWoodSignal 数据模型:存储投资信号、置信度和分析理由。
- cathie_wood_agent 主体逻辑:
- 处理多个股票的财务数据,分析其破坏性创新潜力、增长能力、估值等。
- 计算最终得分,生成投资信号。
- 结合 LLM(大模型)生成类似 Cathie Wood 的分析理由。
- 三个分析函数:
- analyze_disruptive_potential(): 评估企业的破坏性创新潜力。
- analyze_innovation_growth(): 评估企业的创新驱动增长能力。
- analyze_cathie_wood_valuation(): 评估企业的长期估值合理性。
- generate_cathie_wood_output():
- 通过 LLM 生成最终投资信号(bullish/bearish/neutral)及解释。
2. 代码执行流程
代码的执行流程如下:
Step 1: 初始化数据
- 代码从 state["data"] 获取:
- 初始化两个字典:
Step 2: 遍历每只股票,进行分析
对于每一只股票 ticker,代码执行以下步骤:
- 获取财务数据
- get_financial_metrics(): 获取关键财务指标(年报/TTM)
- search_line_items(): 获取详细财务项(收入、毛利率、研发支出等)
- get_market_cap(): 获取市值信息
- 进行三大核心分析
- analyze_disruptive_potential(): 破坏性创新分析
- analyze_innovation_growth(): 创新增长分析
- analyze_cathie_wood_valuation(): 估值分析
- 每个分析都会返回 score(得分)和 details(细节说明)
- 计算最终得分
- total_score = disruptive_score + innovation_score + valuation_score
- 设定 max_possible_score = 15 作为满分基准
- 依据得分范围,确定投资信号:
- 调用 LLM 生成分析报告
- generate_cathie_wood_output() 结合 LLM 生成类似 Cathie Wood 风格的投资建议(信号 + 置信度 + 解释)
- 更新状态
- state["data"]["analyst_signals"]["cathie_wood_agent"] = cw_analysis
- 如果 show_reasoning 设为 True,则 show_agent_reasoning() 显示分析过程。
3. 详细分析逻辑
每个分析函数的逻辑如下:
1️⃣ 破坏性创新分析 analyze_disruptive_potential()
评估公司是否具备突破性的产品、技术或商业模式,考察:
- 收入增长加速(是否加速增长)
- 研发投入强度(是否持续高投入)
- 毛利率趋势(定价能力是否提升)
- 经营杠杆效应(收入增长是否快于开支)
- 市场占有率变化(竞争地位是否改善)
➡ 最终得分映射到 5 分制
2️⃣ 创新增长分析 analyze_innovation_growth()
评估公司是否具有创新驱动增长潜力,考察:
- 研发投入趋势(是否持续加大投入)
- 自由现金流生成能力(创新是否带来正向现金流)
- 经营效率(运营成本是否受控)
- 资本支出分配(资金是否用于创新)
- 增长再投资情况(是否优先扩张而非分红)
➡ 最终得分映射到 5 分制
3️⃣ 估值分析 analyze_cathie_wood_valuation()
评估企业是否具备长期成长性,考察:
- 基于自由现金流估值
- 采用 DCF(折现现金流)模型
- 设定较高增长率(20%)和终端倍数(25)
- 计算 内在价值
- 计算 安全边际(intrinsic value vs market cap)
- 最终得分基于安全边际
- 安全边际 > 50% → 3 分
- 安全边际 > 20% → 1 分
➡ 最终得分映射到 5 分制
4. 生成最终投资信号
函数 generate_cathie_wood_output() 通过 LLM 生成 Cathie Wood 风格的投资信号:
- 构建 ChatPromptTemplate:
- 说明 Cathie Wood 的投资理念
- 传入 ticker 和 analysis_data
- 让 LLM 生成 JSON 格式的 CathieWoodSignal
- 调用 call_llm()
- 选择 LLM 模型(state["metadata"]["model_name"])
- 若失败,返回默认 neutral 信号
总结
这段代码本质上是一个 AI 投资分析 Agent,结合财务数据和 LLM 进行股票评估:
- 获取数据(财报+市值)
- 分析三大核心维度(破坏性创新+增长潜力+估值)
- 计算得分,确定 bullish/bearish/neutral
- 用 LLM 生成投资建议,提供 信号+置信度+理由
- 更新 state,返回结果
Charlie Munger
以下是对上述 charlie_munger_agent 代码的完整处理逻辑的梳理与解释:
一、整体处理流程
该 agent 的作用是依据查理·芒格的投资原则,对指定股票进行分析,评估以下四个维度:
- 护城河(Moat Strength)
- 管理层质量(Management Quality)
- 业务可预测性(Predictability)
- 估值合理性(Valuation)
每个维度单独分析后,综合评分产生最终投资信号(看涨 bullish、看跌 bearish、中立 neutral),并通过 LLM 生成芒格式的投资建议和详细推理。
二、具体处理步骤
(1)数据获取
遍历输入股票清单,获取每只股票的:
- 财务指标(get_financial_metrics)
获取过去10年年度财务指标数据。
- 具体财务科目数据(search_line_items)
包括收入、净利润、经营利润、ROIC、毛利率、经营现金流、资本支出、现金储备、负债、股东权益、股本数量、研发投入、商誉等。
- 市值(get_market_cap)
- 内部交易情况(get_insider_trades)
关注管理层持股和交易情况,衡量管理层诚信。
- 公司新闻(get_company_news)
关注过去一年的新闻数据。
(2)指标分析(四大维度)
每个维度单独调用对应函数计算评分:
✅ 护城河分析(analyze_moat_strength)
- ROIC分析:ROIC长期稳定在15%以上视为优秀。
- 定价能力(毛利率):毛利率稳定或提升意味着定价权强。
- 资本密集度:资本支出占收入比例低的企业受偏爱。
- 无形资产(R&D、商誉):重视研发和品牌等无形资产。
返回评分(0~10分)和定性分析说明。
✅ 管理层质量分析(analyze_management_quality)
- 资本配置能力(自由现金流/净利润比):现金转换效率越高越好。
- 债务管理能力(债务/股东权益比):低负债企业更受青睐。
- 现金储备水平(现金/收入比):偏爱适中的现金储备。
- 内部交易(Insider trades):管理层买入行为体现对企业信心。
- 股本稀释情况(股本变化):股本稳定或回购优于不断稀释。
返回评分(0~10分)和定性分析说明。
✅ 业务可预测性分析(analyze_predictability)
- 收入稳定性与增长性:稳定、持续增长的收入受青睐。
- 经营利润稳定性:经营利润连续正值的企业更可预测。
- 经营利润率稳定性:利润率波动越小越好。
- 自由现金流稳定性:稳定产生正向现金流的企业优先。
返回评分(0~10分)和定性分析说明。
✅ 估值合理性分析(calculate_munger_valuation)
- 估算企业内在价值(通过最近几年自由现金流的均值估算)。
- FCF收益率(自由现金流除以市值)高的企业更具吸引力。
- 安全边际评估(合理估值与市值比较)越高越好。
- 现金流趋势(FCF趋势是否增长)偏爱持续增长企业。
返回评分(0~10分)、估值区间、定性分析说明。
(3)综合评分与信号生成
各维度评分按芒格的偏好赋予权重:
维度 | 权重 |
护城河 | 35% |
管理层质量 | 25% |
业务可预测性 | 25% |
估值合理性 | 15% |
加权得到总评分(0~10分)。
基于总评分给出信号:
(4)新闻情绪分析(analyze_news_sentiment)
简单定性处理过去一年公司新闻(未来可进一步扩展为NLP情绪分析)。
(5)LLM生成芒格式投资建议(generate_munger_output)
调用大语言模型(LLM),以芒格的投资哲学为Prompt输入上述分析数据,由LLM输出包含:
• 信号(bullish/bearish/neutral)
• 信心水平(0~100%)
• 详细推理说明
输出数据结构定义为CharlieMungerSignal类。
(6)最终结果更新与返回
- 将每只股票的分析与LLM输出存入整体数据状态 state["data"]["analyst_signals"]["charlie_munger_agent"]。
- 将所有结果封装在HumanMessage中返回。
- 如果请求展示推理过程(show_reasoning),则显示详细分析说明。
三、代码模块职责概览
函数名 | 功能作用 |
charlie_munger_agent | 主入口,协调数据获取、分析与LLM调用 |
analyze_moat_strength | 护城河强度分析 |
analyze_management_quality | 管理层质量分析 |
analyze_predictability | 业务可预测性分析 |
calculate_munger_valuation | 芒格式估值分析 |
analyze_news_sentiment | 新闻数据的简易定性分析 |
generate_munger_output | 利用LLM生成最终投资信号与说明 |
Fundamentals
📝 1. 总体目标
对多个股票 (tickers) 的财务基本面数据进行分析,并生成:
- 整体交易信号 (bullish / bearish / neutral)
- 对应的置信度(百分比)
- 每个具体维度的分析理由
⚙️ 2. 输入数据
- tickers:待分析股票代码列表
- end_date:分析使用的数据截止日期
🚧 3. 处理流程
对于列表中的每只股票(ticker),按以下流程进行处理:
3.1 获取财务数据
- 调用API函数:get_financial_metrics
- 参数: • ticker: 股票代码 • end_date: 数据截止日期 • period: 数据周期(ttm 表示最近十二个月) • limit: 数据点数量(取最近的10个数据) • 若未获取到数据,跳过该股票并记录失败状态。
3.2 分析维度
对每个股票的财务数据,从以下四个维度分析:
📍(1)盈利能力(Profitability)
指标 | 强势标准 |
ROE(净资产收益率) | ≥ 15% |
Net Margin(净利润率) | ≥ 20% |
Operating Margin(经营利润率) | ≥ 15% |
- 计算得分(满足条件数量):
- ≥ 2:bullish
- 1:neutral
- 0:bearish
📍(2)成长能力(Growth)
指标 | 强势标准 |
Revenue Growth(营收增长) | ≥ 10% |
Earnings Growth(利润增长) | ≥ 10% |
Book Value Growth(账面价值增长) | ≥ 10% |
- 计算得分(满足条件数量):
- ≥ 2:bullish
- 1:neutral
- 0:bearish
📍(3)财务健康度(Financial Health)
指标 | 强势标准 |
Current Ratio(流动比率) | > 1.5(高流动性) |
Debt-to-Equity Ratio(负债权益比) | < 0.5(低负债水平) |
FCF per share(每股自由现金流)与 EPS(每股收益)比例 | ≥ 0.8(强自由现金流转化) |
- 计算得分(满足条件数量):
- ≥ 2:bullish
- 1:neutral
- 0:bearish
📍(4)估值合理性(Valuation Ratios)
指标 | 合理标准 |
P/E(市盈率) | ≤ 25 |
P/B(市净率) | ≤ 3 |
P/S(市销率) | ≤ 5 |
注意:此处统计指标超出合理标准的数量:
- 超出≥2项:bearish
- 超出1项:neutral
- 未超出任何项:bullish
3.3 综合信号计算
- 将上述四个维度的信号进行汇总:
- 若 bullish 信号数 > bearish 信号数,整体信号为 bullish。
- 若 bearish 信号数 > bullish 信号数,整体信号为 bearish。
- 若两者相等,则整体信号为 neutral。
- 计算置信度:
3.4 输出数据结构
每个股票输出数据结构示例如下:
💬 4. 结果存储与反馈
- 构建消息对象 HumanMessage:
- content:上述分析结果的JSON字符串。
- name:fundamentals_agent
- 如果设置了show_reasoning标志:
- 调用函数:show_agent_reasoning,展示分析过程。
- 更新状态中的信号列表:
📤 5. 返回数据
Sentiment
一、总体目标:
- 基于公司内部人士交易数据(insider trades)和公司相关新闻情绪(company news sentiment),分析多只股票的市场情绪,给出投资信号(bullish、bearish、neutral)及对应的信心分数(confidence)。
二、输入数据:
AgentState 中获取:
- end_date:分析截止日期。
- tickers:需要分析的一组股票代码。
三、处理逻辑:
对于每个股票(ticker),分别进行以下步骤:
(1)获取和分析公司内部人士交易数据(insider trades):
- 调用 get_insider_trades 获取内部交易记录:
- 分析交易模式:
将每笔交易的股份数(transaction_shares)进行分析:
- 若交易股份数 < 0,则定义为 bearish(看跌)。
- 若交易股份数 ≥ 0,则定义为 bullish(看涨)。
得到内部交易情绪信号列表:
(2)获取和分析公司相关新闻情绪(company news sentiment):
- 调用 get_company_news 获取公司相关新闻:
- 分析新闻情绪:
根据每条新闻的情绪值(sentiment):
- "negative" 为 bearish(看跌)
- "positive" 为 bullish(看涨)
- 其他情绪则定义为 neutral(中性)
得到新闻情绪信号列表:
(3)整合内部交易与新闻的情绪信号:
- 内部人士交易信号权重:0.3
- 新闻情绪信号权重:0.7
计算带权重的 bullish 和 bearish 信号数量:
(4)生成最终情绪信号:
- bullish_signals > bearish_signals:overall_signal 为 "bullish"
- bullish_signals < bearish_signals:overall_signal 为 "bearish"
- 相等则为:overall_signal 为 "neutral"
(5)计算信号置信度(confidence):
- 信号置信度定义为:
\text{confidence} = \frac{\max(\text{bullish\_signals, bearish\_signals})}{\text{total\_weighted\_signals}} \times 100\%
- 若无任何信号,默认 confidence 为 0%。
(6)生成推理说明(reasoning):
给出清晰的信号推理说明:
四、输出结果:
针对每只股票,构建情绪分析结果字典:
最终以 JSON 格式存储在消息中:
五、附加操作:
- 若 AgentState 的元数据中设置了 "show_reasoning": True,则调用 show_agent_reasoning() 将推理过程可视化展示。
- 将情绪分析结果保存到 state["data"]["analyst_signals"]["sentiment_agent"]。
总体流程图示:
Charlie Munger
以下是对上述 charlie_munger_agent 代码的完整处理逻辑的梳理与解释:
一、整体处理流程
该 agent 的作用是依据查理·芒格的投资原则,对指定股票进行分析,评估以下四个维度:
- 护城河(Moat Strength)
- 管理层质量(Management Quality)
- 业务可预测性(Predictability)
- 估值合理性(Valuation)
每个维度单独分析后,综合评分产生最终投资信号(看涨 bullish、看跌 bearish、中立 neutral),并通过 LLM 生成芒格式的投资建议和详细推理。
二、具体处理步骤
(1)数据获取
遍历输入股票清单,获取每只股票的:
- 财务指标(get_financial_metrics)
获取过去10年年度财务指标数据。
- 具体财务科目数据(search_line_items)
包括收入、净利润、经营利润、ROIC、毛利率、经营现金流、资本支出、现金储备、负债、股东权益、股本数量、研发投入、商誉等。
- 市值(get_market_cap)
- 内部交易情况(get_insider_trades)
关注管理层持股和交易情况,衡量管理层诚信。
- 公司新闻(get_company_news)
关注过去一年的新闻数据。
(2)指标分析(四大维度)
每个维度单独调用对应函数计算评分:
✅ 护城河分析(analyze_moat_strength)
- ROIC分析:ROIC长期稳定在15%以上视为优秀。
- 定价能力(毛利率):毛利率稳定或提升意味着定价权强。
- 资本密集度:资本支出占收入比例低的企业受偏爱。
- 无形资产(R&D、商誉):重视研发和品牌等无形资产。
返回评分(0~10分)和定性分析说明。
✅ 管理层质量分析(analyze_management_quality)
- 资本配置能力(自由现金流/净利润比):现金转换效率越高越好。
- 债务管理能力(债务/股东权益比):低负债企业更受青睐。
- 现金储备水平(现金/收入比):偏爱适中的现金储备。
- 内部交易(Insider trades):管理层买入行为体现对企业信心。
- 股本稀释情况(股本变化):股本稳定或回购优于不断稀释。
返回评分(0~10分)和定性分析说明。
✅ 业务可预测性分析(analyze_predictability)
- 收入稳定性与增长性:稳定、持续增长的收入受青睐。
- 经营利润稳定性:经营利润连续正值的企业更可预测。
- 经营利润率稳定性:利润率波动越小越好。
- 自由现金流稳定性:稳定产生正向现金流的企业优先。
返回评分(0~10分)和定性分析说明。
✅ 估值合理性分析(calculate_munger_valuation)
- 估算企业内在价值(通过最近几年自由现金流的均值估算)。
- FCF收益率(自由现金流除以市值)高的企业更具吸引力。
- 安全边际评估(合理估值与市值比较)越高越好。
- 现金流趋势(FCF趋势是否增长)偏爱持续增长企业。
返回评分(0~10分)、估值区间、定性分析说明。
(3)综合评分与信号生成
各维度评分按芒格的偏好赋予权重:
维度 | 权重 |
护城河 | 35% |
管理层质量 | 25% |
业务可预测性 | 25% |
估值合理性 | 15% |
加权得到总评分(0~10分)。
基于总评分给出信号:
(4)新闻情绪分析(analyze_news_sentiment)
简单定性处理过去一年公司新闻(未来可进一步扩展为NLP情绪分析)。
(5)LLM生成芒格式投资建议(generate_munger_output)
调用大语言模型(LLM),以芒格的投资哲学为Prompt输入上述分析数据,由LLM输出包含:
• 信号(bullish/bearish/neutral)
• 信心水平(0~100%)
• 详细推理说明
输出数据结构定义为CharlieMungerSignal类。
(6)最终结果更新与返回
- 将每只股票的分析与LLM输出存入整体数据状态 state["data"]["analyst_signals"]["charlie_munger_agent"]。
- 将所有结果封装在HumanMessage中返回。
- 如果请求展示推理过程(show_reasoning),则显示详细分析说明。
三、代码模块职责概览
函数名 | 功能作用 |
charlie_munger_agent | 主入口,协调数据获取、分析与LLM调用 |
analyze_moat_strength | 护城河强度分析 |
analyze_management_quality | 管理层质量分析 |
analyze_predictability | 业务可预测性分析 |
calculate_munger_valuation | 芒格式估值分析 |
analyze_news_sentiment | 新闻数据的简易定性分析 |
generate_munger_output | 利用LLM生成最终投资信号与说明 |
ㅤ | ㅤ |
Fundamentals
📝 1. 总体目标
对多个股票 (tickers) 的财务基本面数据进行分析,并生成:
- 整体交易信号 (bullish / bearish / neutral)
- 对应的置信度(百分比)
- 每个具体维度的分析理由
⚙️ 2. 输入数据
- tickers:待分析股票代码列表
- end_date:分析使用的数据截止日期
🚧 3. 处理流程
对于列表中的每只股票(ticker),按以下流程进行处理:
3.1 获取财务数据
- 调用API函数:get_financial_metrics
- 参数: • ticker: 股票代码 • end_date: 数据截止日期 • period: 数据周期(ttm 表示最近十二个月) • limit: 数据点数量(取最近的10个数据) • 若未获取到数据,跳过该股票并记录失败状态。
3.2 分析维度
对每个股票的财务数据,从以下四个维度分析:
📍(1)盈利能力(Profitability)
指标 | 强势标准 |
ROE(净资产收益率) | ≥ 15% |
Net Margin(净利润率) | ≥ 20% |
Operating Margin(经营利润率) | ≥ 15% |
- 计算得分(满足条件数量):
- ≥ 2:bullish
- 1:neutral
- 0:bearish
📍(2)成长能力(Growth)
指标 | 强势标准 |
Revenue Growth(营收增长) | ≥ 10% |
Earnings Growth(利润增长) | ≥ 10% |
Book Value Growth(账面价值增长) | ≥ 10% |
- 计算得分(满足条件数量):
- ≥ 2:bullish
- 1:neutral
- 0:bearish
📍(3)财务健康度(Financial Health)
指标 | 强势标准 |
Current Ratio(流动比率) | > 1.5(高流动性) |
Debt-to-Equity Ratio(负债权益比) | < 0.5(低负债水平) |
FCF per share(每股自由现金流)与 EPS(每股收益)比例 | ≥ 0.8(强自由现金流转化) |
- 计算得分(满足条件数量):
- ≥ 2:bullish
- 1:neutral
- 0:bearish
📍(4)估值合理性(Valuation Ratios)
指标 | 合理标准 |
P/E(市盈率) | ≤ 25 |
P/B(市净率) | ≤ 3 |
P/S(市销率) | ≤ 5 |
注意:此处统计指标超出合理标准的数量:
- 超出≥2项:bearish
- 超出1项:neutral
- 未超出任何项:bullish
3.3 综合信号计算
- 将上述四个维度的信号进行汇总:
- 若 bullish 信号数 > bearish 信号数,整体信号为 bullish。
- 若 bearish 信号数 > bullish 信号数,整体信号为 bearish。
- 若两者相等,则整体信号为 neutral。
- 计算置信度:
3.4 输出数据结构
每个股票输出数据结构示例如下:
💬 4. 结果存储与反馈
- 构建消息对象 HumanMessage:
- content:上述分析结果的JSON字符串。
- name:fundamentals_agent
- 如果设置了show_reasoning标志:
- 调用函数:show_agent_reasoning,展示分析过程。
- 更新状态中的信号列表:
📤 5. 返回数据
Sentiment
一、总体目标:
- 基于公司内部人士交易数据(insider trades)和公司相关新闻情绪(company news sentiment),分析多只股票的市场情绪,给出投资信号(bullish、bearish、neutral)及对应的信心分数(confidence)。
二、输入数据:
AgentState 中获取:
- end_date:分析截止日期。
- tickers:需要分析的一组股票代码。
三、处理逻辑:
对于每个股票(ticker),分别进行以下步骤:
(1)获取和分析公司内部人士交易数据(insider trades):
- 调用 get_insider_trades 获取内部交易记录:
- 分析交易模式:
将每笔交易的股份数(transaction_shares)进行分析:
- 若交易股份数 < 0,则定义为 bearish(看跌)。
- 若交易股份数 ≥ 0,则定义为 bullish(看涨)。
得到内部交易情绪信号列表:
(2)获取和分析公司相关新闻情绪(company news sentiment):
- 调用 get_company_news 获取公司相关新闻:
- 分析新闻情绪:
根据每条新闻的情绪值(sentiment):
- "negative" 为 bearish(看跌)
- "positive" 为 bullish(看涨)
- 其他情绪则定义为 neutral(中性)
得到新闻情绪信号列表:
(3)整合内部交易与新闻的情绪信号:
- 内部人士交易信号权重:0.3
- 新闻情绪信号权重:0.7
计算带权重的 bullish 和 bearish 信号数量:
(4)生成最终情绪信号:
- bullish_signals > bearish_signals:overall_signal 为 "bullish"
- bullish_signals < bearish_signals:overall_signal 为 "bearish"
- 相等则为:overall_signal 为 "neutral"
(5)计算信号置信度(confidence):
- 信号置信度定义为:
\text{confidence} = \frac{\max(\text{bullish\_signals, bearish\_signals})}{\text{total\_weighted\_signals}} \times 100\%
- 若无任何信号,默认 confidence 为 0%。
(6)生成推理说明(reasoning):
给出清晰的信号推理说明:
四、输出结果:
针对每只股票,构建情绪分析结果字典:
最终以 JSON 格式存储在消息中:
五、附加操作:
- 若 AgentState 的元数据中设置了 "show_reasoning": True,则调用 show_agent_reasoning() 将推理过程可视化展示。
- 将情绪分析结果保存到 state["data"]["analyst_signals"]["sentiment_agent"]。
总体流程图示:
Warren Buffett
分析目标
- 以沃伦·巴菲特的投资原则为依据:
- 能力圈:投资熟悉且理解的业务。
- 安全边际:仅在内在价值有足够折扣(>30%)时买入。
- 经济护城河:优先考虑具有持久竞争优势的企业。
- 管理质量:偏爱保守且对股东友好的管理团队。
- 财务稳健:选择债务低、净资产收益率高的公司。
- 长期投资:关注企业本身,而非短期股价波动。
基础财务分析
- 净资产收益率(ROE):ROE稳定且高于15%,得分增加。
- 负债权益比:低于0.5的保守负债比率视为积极因素。
- 营业利润率:持续高于15%视为企业经营表现优秀。
- 流动比率:超过1.5表示公司短期偿债能力良好。
盈利一致性分析
- 检查净利润是否呈现稳定增长趋势:
- 连续4期以上净利润增长视为积极信号。
- 过去多个时期净利润波动较大或下降,得分减少。
经济护城河分析
- 检查历史ROE和营业利润率稳定性:
- 连续多年ROE稳定超过15%得分增加。
- 连续多年营业利润率超过15%,进一步增加得分。
- 两项指标皆稳定突出,则视为企业拥有明显经济护城河。
管理质量分析
- 检查是否存在股票回购或稀释行为:
- 最近时期公司持续股票回购,视为股东友好行为,得分增加。
- 最近时期明显发行新股,可能产生稀释效应,得分减少。
- 检查派息记录:
- 稳定的股息派发历史视为积极因素。
内在价值计算(DCF)
- 使用“所有者盈利”而非单纯净利润:
- 所有者盈利 = 净利润 + 折旧摊销 - 维护资本开支(约为资本开支的75%)。
- 使用DCF模型计算内在价值:
- 假设保守增长率(5%)和适中的贴现率(9%)。
- 采用10年预测期和合理终值倍数(12倍)。
安全边际分析
- 比较计算得到的内在价值与当前市值:
- 内在价值超出当前市值30%以上,视为具备充分安全边际。
- 内在价值明显低于市值,尤其低于-30%时,可能意味着估值过高,应谨慎或看跌。
综合决策逻辑
- 当综合得分较高(达到最大可能得分的70%以上),且安全边际超过30%,给出看涨信号。
- 当综合得分较低(低于最大可能得分的30%)或安全边际严重不足(<-30%),给出看跌信号。
- 其他情况则给出中性信号,以观望为主。
输出格式与结果说明
- 最终输出结果包括:
- 投资信号(看涨、看跌、中性)
- 信心指数(0-100)
- 详细的投资理由分析
Valuation
估值分析框架
- 该AI通过并行使用两种估值方法进行多股票分析:
- 巴菲特的自由主人收益法(Owner Earnings)
- 现金流贴现法(DCF)
- 每个估值方法都基于以下金融指标:
- 净收入
- 折旧和摊销
- 资本支出
- 营运资金变化
- 自由现金流
- 收益增长率
决策流程
- 数据获取流程
- 为每个股票获取财务指标和特定财务项目
- 获取当前和前一期间的财务数据,用于计算变化率
- 获取市值数据作为比较基准
- 分析计算
- 巴菲特方法:计算主人收益估值
- DCF方法:基于自由现金流计算内在价值
- 计算估值差距:(估算价值 - 市值) / 市值
- 信号生成逻辑
- 估值差距 > 15%:看涨信号(bullish)
- 估值差距 < -15%:看跌信号(bearish)
- 15% 至 15%之间:中性信号(neutral)
- 置信度计算
- 置信度 = 估值差距的绝对值(以百分比表示)
- 例:估值差距为20%,置信度为20
关键参数设置
- 自由主人收益法参数
- 要求回报率:15%(巴菲特通常使用)
- 安全边际:25%
- 预测年限:5年
- DCF估值参数
- 折现率:10%
- 终端增长率:3%(上限)
- 预测期间:5年
实用特点
- 稳健性设计
- 包含数据有效性检查,确保分析前有足够的财务指标
- 合并两种估值方法的结果,减少单一方法的偏差
- 透明的推理过程
- 每个方法都生成详细的分析说明
- 可通过show_reasoning标志显示详细分析过程
- 灵活的参数设置
- 所有关键参数可根据不同市场环境调整
- 预设了保守的增长率和较高的要求回报率,体现价值投资理念
这种投资AI模型采用了价值投资的核心原则,通过量化分析寻找市场中被低估的股票,同时保持适当的安全边际以降低风险。
Technicals
这段代码实现了一个复杂的技术分析系统,用于评估股票的交易信号。下面是其投资逻辑的梳理:
1. 整体架构
技术分析师代理(
technical_analyst_agent
)结合了5种不同的交易策略,每种策略分别计算交易信号,然后通过加权组合得出最终建议:- 趋势跟踪 (25% 权重)
- 均值回归 (20% 权重)
- 动量策略 (25% 权重)
- 波动率分析 (15% 权重)
- 统计套利信号 (15% 权重)
2. 各策略具体分析方法
2.1 趋势跟踪策略
- 计算多个时间框架的指数移动平均线(EMA):8日、21日和55日
- 使用平均方向指数(ADX)来衡量趋势强度
- 短期趋势:EMA8 > EMA21
- 中期趋势:EMA21 > EMA55
- 当短期和中期趋势同时向上时产生看涨信号,同时向下时产生看跌信号
- 信号的置信度取决于ADX指标的强度
2.2 均值回归策略
- 计算价格相对于50日移动平均线的Z分数(标准差距离)
- 使用布林带(Bollinger Bands)来确定价格偏离程度
- 计算14日和28日RSI(相对强弱指数)
- 当价格显著低于历史均值(Z分数<-2)且接近布林带下轨时产生看涨信号
- 当价格显著高于历史均值(Z分数>2)且接近布林带上轨时产生看跌信号
- 信号的置信度取决于价格偏离程度
2.3 动量策略
- 计算多个时间周期的价格动量:1个月、3个月和6个月
- 分析交易量动量(当前交易量与21日平均交易量的比值)
- 将短期、中期和长期动量按照不同权重(0.4、0.3、0.3)组合
- 当动量得分>0.05且交易量增加时产生看涨信号
- 当动量得分<-0.05且交易量增加时产生看跌信号
- 信号置信度基于动量得分的绝对值
2.4 波动率分析
- 计算历史波动率(21日收益标准差)
- 分析波动率状态(当前波动率与63日平均波动率的比值)
- 计算波动率的Z分数以检测异常值
- 分析ATR(真实波动幅度均值)与价格的比率
- 当波动率处于低位且有上升趋势时产生看涨信号
- 当波动率处于高位且可能回落时产生看跌信号
- 信号置信度基于波动率Z分数的绝对值
2.5 统计套利信号
- 计算收益分布的偏度(skewness)和峰度(kurtosis)
- 使用赫斯特指数(Hurst exponent)检测时间序列的均值回归特性
- H < 0.5 表示均值回归
- H = 0.5 表示随机游走
- H > 0.5 表示趋势系列
- 当赫斯特指数<0.4且偏度>1时产生看涨信号
- 当赫斯特指数<0.4且偏度<-1时产生看跌信号
- 信号置信度基于赫斯特指数与0.5的距离
3. 信号组合机制
多策略组合通过
weighted_signal_combination
函数实现:- 将不同信号(看涨、看跌、中性)转换为数值(+1, -1, 0)
- 考虑每个策略的预设权重和信号置信度
- 计算加权平均分数
- 基于最终分数生成总体信号:
- 分数 > 0.2: 看涨
- 分数 < -0.2: 看跌
- 其他情况: 中性
4. 特点与优势
- 多策略集成:结合不同投资思路,避免单一策略的缺陷
- 多时间框架:同时分析短期、中期和长期市场行为
- 自适应置信度:根据指标强度动态调整每个信号的权重
- 统计稳健性:使用偏度、峰度和赫斯特指数等统计指标增强分析深度
- 具有量化基础:每个决策都基于可测量的技术指标,而非主观判断
这种技术分析方法试图通过结合多种互补的分析技术,在市场中识别更可靠的交易信号,为投资决策提供技术层面的支持。
Stanley Druckenmiller
核心投资原则
Stanley Druckenmiller作为一位著名投资者,拥有独特的投资方法论。AI代理模拟了以下核心原则:
- 寻找非对称风险回报机会(高上行潜力,有限下行风险)
- 注重增长、势头和市场情绪
- 通过避免高风险和低回报投资保全资本
- 愿意为真正的成长领导者支付更高估值
- 在确信度高时采取积极行动
- 如果投资论点改变,迅速止损
决策结构
1. 数据收集与分析
对每个股票,AI代理收集以下数据:
- 财务指标与增长数据(收入、EPS等)
- 市值信息
- 相关财务条目(收入、每股收益、净收入等)
- 内部交易情况
- 公司新闻
- 价格数据(用于动量分析)
2. 五个关键维度分析
每项分析都会产生一个0-10分的评分:
a. 增长与动量分析 (35%权重)
- 评估收入增长(同比)
- 评估EPS增长(同比)
- 评估价格动量
- 对强劲增长(>30%)给予高分,微弱增长给予低分
- 价格动量强劲(>50%)给予高分
b. 风险回报分析 (20%权重)
- 通过债务股本比评估风险
- 通过价格波动性评估风险
- 低债务股本比(<0.3)和低波动性获得高分
c. 估值分析 (20%权重)
- 评估P/E
- 评估P/FCF
- 评估EV/EBIT
- 评估EV/EBITDA
- 对合理估值给予高分,但愿意为增长支付溢价
d. 市场情绪分析 (15%权重)
- 分析新闻标题的情绪
- 检测负面关键词
- 正面/中性新闻获得高分
e. 内部人活动分析 (10%权重)
- 分析内部人买卖活动比例
- 内部人大量买入(>70%)获得高分
- 内部人卖出获得低分
3. 加权评分计算
4. 信号生成
- 看涨信号:总分 ≥ 7.5
- 中性信号:总分介于4.5-7.5之间
- 看跌信号:总分 ≤ 4.5
5. 最终输出
生成包含以下内容的结构化信号:
- 方向(看涨/看跌/中性)
- 信心水平(0-100%)
- 详细推理解释
典型决策路径
- 数据收集 → 多维度分析 → 综合评分 → 生成信号与推理
- 高度重视增长和动量指标(35%权重),符合Druckenmiller强调成长的投资风格
- 平衡考虑风险与回报,寻找非对称机会(风险有限但上行空间大的投资)
- 对情绪信号敏感,利用市场情绪作为辅助因素
- 综合评估后给出明确信号,并附带详细推理过程
这种投资逻辑模拟了Stanley Druckenmiller擅长的宏观趋势把握和成长投资风格,强调资本保全但在高确信度情况下敢于下重注。
Portfolio Manager
📌 Agent 主要功能
Portfolio Management Agent 主要负责根据分析师信号和组合状态,生成最终的交易决策(买入、卖出、做空、平仓、持仓)。
🧩 逻辑流程
整体逻辑如下:
- 获取状态数据
- 从 AgentState 中提取:
- 当前投资组合(portfolio):包括现金、持仓、保证金要求等
- 分析师信号(analyst_signals):来自多个分析师的投资信号
- 涉及的股票列表(tickers)
- 分析处理信号
- 从分析师信号提取每只股票的信息:
- 风险管理数据(position_limits、current_prices)
- 计算每个股票允许交易的最大股份数(max_shares)
- 汇总各分析师对每只股票的信号和置信度(signals_by_ticker)
- 生成交易决策
- 调用
generate_trading_decision
方法,将整理后的信号数据、股票价格、最大允许股数、投资组合状态传入 - 使用指定的 LLM 模型生成交易决策:
- 模型输入包含严格定义的 prompt 和 JSON 数据结构
- 模型输出包含每只股票的交易决策(PortfolioDecision)
- 封装结果
- 创建一个 HumanMessage,将决策结果序列化为 JSON 格式后加入状态消息中
- 若设置
show_reasoning=True
,则打印交易决策和推理过程 - 返回更新后的 AgentState 数据
🚦 交易决策规则(Trading Rules)
🔹 多头(Long Positions)
- 买入(buy)条件:
- 必须有足够现金
- 买入数量 ≤ 该股票的最大允许交易数量(max_shares)
- 卖出(sell)条件:
- 当前持有股票的多头仓位
- 卖出数量 ≤ 当前持仓股份数
🔹 空头(Short Positions)
- 做空(short)条件:
- 有足够的保证金(需满足50%的保证金要求)
- 做空数量需符合保证金要求和最大股份限制
- 平仓(cover)条件:
- 当前持有股票的空头仓位
- 平仓数量 ≤ 当前空头持仓股份数
🔹 持仓(Hold)
- 若无明显信号或其他交易条件均不满足,默认持仓不动
🎯 输入输出结构
输入(Input)
- 股票列表(tickers)
- 分析师信号(signals_by_ticker)
- 当前价格(current_prices)
- 最大交易数量(max_shares)
- 投资组合现金、持仓、保证金要求
输出(Output)
严格的 JSON 格式:
🔄 容错处理机制
若调用 LLM 模型失败,则:
- 为所有股票默认生成一个「持仓(hold)」的 PortfolioDecision,并备注错误原因。
💡 核心函数说明
🔸 portfolio_management_agent(state: AgentState)
- 主要控制函数,整合数据、调用交易决策生成逻辑、处理状态更新。
🔸 generate_trading_decision(...)
- 调用 LLM 生成实际的 PortfolioManagerOutput 交易决策。
🛠 工具类函数说明
- call_llm:调用指定的 LLM 模型生成决策。
- progress.update_status:更新处理进度与状态。
- show_agent_reasoning:可选地展示详细的决策推理过程。
📚 数据模型(Data Model)
🔖 PortfolioDecision
🔖 PortfolioManagerOutput
Risk Manager
🌟 一、目的(Purpose)
风险管理 Agent 的核心职责是:
根据实时市场价格和组合情况,对每个股票标的计算合理的持仓规模,以控制组合风险。
- 限制单一标的仓位,防范集中风险。
- 确保资金安全,合理利用现金。
🛠️ 二、输入数据(Inputs)
Agent 从状态对象(AgentState)中获取:
- 投资组合信息 (portfolio):
- 现金余额 (cash)
- 各股票现有持仓成本 (cost_basis)
- 行情相关信息:
- 股票代码列表 (tickers)
- 价格数据区间 (start_date, end_date)
🔄 三、行为流程(Behavior Flow)
对每个股票标的 (ticker) 单独执行:
- 🔍 获取价格数据
- 调用 get_prices 获取指定日期范围内的价格数据。
- 若未获取到价格数据,跳过当前股票分析。
- 📈 计算最新价格
- 使用最新收盘价作为当前价格 (current_price)。
- 💰 计算组合价值
- 组合总价值 (total_portfolio_value) = 当前现金 + 所有股票的持仓成本之和。
- 📏 确定单一标的持仓上限
- 对单个股票设定不超过组合总价值的 20% 上限 (position_limit)。
- 🧮 计算剩余可增加仓位
- 剩余仓位额度 (remaining_position_limit) = 单一标的持仓上限 - 已持仓成本。
- 同时考虑账户现金余额,取两者中的较小值作为最终可加仓额度 (max_position_size)。
🧠 四、决策逻辑(Decision Logic)
对于每个标的,Agent 给出的风险评估结果为:
📤 五、输出内容(Outputs)
- 最终的风险管理结果(risk_analysis)封装在 JSON 中,以 HumanMessage 的形式传递给后续 Agent。
- 更新状态中的分析信号列表(analyst_signals["risk_management_agent"]),供后续分析。
🚧 六、风险管理规则(Rules)
- 单只股票持仓不超过组合总价值的 20%。
- 不允许超出账户当前可用现金进行交易。
- 已经持仓的股票,新增仓位不能超过剩余额度。
🖥️ 七、工具调用(External Calls)
工具函数 | 功能说明 |
get_prices | 从外部 API 获取股票历史价格数据 |
prices_to_df | 将价格数据转化为 DataFrame |
progress.update_status | 更新实时状态用于监控与展示进度 |
🎯 八、整体逻辑图示(Flowchart)

- Author:Ethan
- URL:https://zheyu.ink/article/1bcc00c0-aa6a-804b-aec0-c10121a40749
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!