Robinhood 投资组合顾问
通过 robinhood-mcp 服务器以只读方式访问您的 Robinhood 投资组合。提供持仓、报价、基本面、新闻、财报、分析师评级、股息和期权的实时数据。
先决条件
1. Robinhood 账户
您需要一个 Robinhood 账户(免费注册于 robinhood.com)。
2. MCP 服务器安装
robinhood-mcp 包提供了 MCP 服务器。使用以下任一方式安装:
# 推荐方式——通过 uvx 运行(无需全局安装,自动管理)
# 只需添加到智能体配置即可使用。uvx 会在首次运行时自动安装。
# 替代方式——使用 pip 全局安装
pip install robinhood-mcp
注意:
uvx由 uv Python 包管理器提供。请先安装:curl -LsSf https://astral.sh/uv/install.sh | sh
3. 环境变量
在智能体的 .env 文件或 shell 配置文件中设置以下变量:
| 变量 | 是否必需 | 描述 |
|---|---|---|
ROBINHOOD_USERNAME | 是 | 您的 Robinhood 邮箱 |
ROBINHOOD_PASSWORD | 是 | 您的 Robinhood 密码 |
ROBINHOOD_TOTP_SECRET | 仅在使用身份验证器应用时需要 | 您的身份验证器设置中的 TOTP 密钥。如果使用短信验证,则不需要。 |
4. 智能体配置
请参阅 templates/ 目录中适用于您的智能体的复制粘贴配置片段。快速参考:
Hermes Agent (~/.hermes/config.yaml):
mcp_servers:
robinhood:
command: uvx
args:
- robinhood-mcp
env:
ROBINHOOD_USERNAME: "${ROBINHOOD_USERNAME}"
ROBINHOOD_PASSWORD: "${ROBINHOOD_PASSWORD}"
# ROBINHOOD_TOTP_SECRET: "${ROBINHOOD_TOTP_SECRET}" # 使用身份验证器应用时取消注释
timeout: 60
connect_timeout: 30
其他智能体 — 请参阅 templates/ 目录中的 Claude Desktop、Claude Code、Codex、OpenCode、Cline 和 Windsurf 配置。
添加配置后,重启您的智能体。使用 hermes mcp test robinhood(Hermes)或检查您智能体的 MCP 状态进行验证。
可用的 MCP 工具
这些工具在 Hermes Agent 中以 mcp_robinhood_* 注册(不同智能体前缀可能不同):
| 工具 | 描述 |
|---|---|
robinhood_get_portfolio | 投资组合价值、净资产、购买力、日变动 |
robinhood_get_positions | 所有持仓,含成本基础、当前价值和盈亏 |
robinhood_get_position | 单个持仓(按股票代码),针对单支股票更快 |
robinhood_get_watchlist | 您关注列表中的股票 |
robinhood_get_quote | 实时价格、买/卖价、成交量 |
robinhood_get_fundamentals | 市盈率、市值、股息收益率、52 周价格区间 |
robinhood_get_historicals | OHLCV 历史价格(5分钟、10分钟、小时、日、周) |
robinhood_get_news | 某支股票最近的相关新闻文章 |
robinhood_get_earnings | 财报日期、每股收益预估及实际值 |
robinhood_get_ratings | 分析师的买入/持有/卖出评级 |
robinhood_get_dividends | 股息支付历史记录 |
robinhood_get_options_positions | 当前期权持仓 |
robinhood_search_symbols | 按名称或股票代码搜索股票 |
本地缓存
投资组合数据本地缓存在 ~/.hermes/data/robinhood/portfolio_cache.json(Hermes)或 ~/.robinhood-mcp/cache.json(其他智能体)。
缓存优先策略
始终优先检查缓存。 仅在以下情况调用 MCP 工具:
- 缓存超过 15 分钟,且用户需要实时数据
- 用户明确要求刷新(如“刷新我的投资组合”、“获取最新价格”)
- 用户询问缓存中未包含的特定股票代码
- 用户询问快速变化的数据(新闻、实时报价)
更新缓存
# Hermes Agent 用户
python3 scripts/refresh_cache.py
# 使用自定义路径
python3 scripts/refresh_cache.py --cache-dir ~/my-data --vault-path ~/my-vault
# 仅输出 JSON(不写入 Obsidian)
python3 scripts/refresh_cache.py --json-only
# 强制刷新(即使缓存尚未过期)
python3 scripts/refresh_cache.py --force
智能体还可以在任何投资组合查询过程中通过调用 MCP 工具并将结果写入缓存文件来内联更新缓存。
投资组合查询工作流
当用户询问其投资组合时:
- 读取缓存以获取上下文(投资组合价值、持仓、资产配置)
- 如果数据过时(超过15分钟)或用户需要实时数据,则调用 MCP 工具
- 在获取 MCP 数据后更新缓存
- 根据用户的实际持仓进行回答——而非通用建议
- 在相关时引用其成本基础、未实现盈亏和资产配置
- 对于期权问题,交叉参考用户已知的策略
当用户询问特定股票代码时:
- 检查
wiki/entities/<股票代码>.md是否存在(如果使用 Obsidian) - 读取其中已有的投资论点及研究历史
- 通过 MCP 获取实时数据(报价、基本面、新闻、评级)
- 综合 wiki 知识与实时数据进行回答
- 在研究笔记中附加一条研究记录到实体页面(如果使用 Obsidian)
- 如果该股票代码不在投资组合中,则将其添加到研究队列中
何时使用 MCP 与缓存
| 场景 | 使用方式 |
|---|---|
| “我的投资组合值多少钱?” | 缓存(如果足够新) |
| “我的 NVDA 表现如何?” | 优先缓存,缓存过时或股票代码缺失时使用 MCP |
| “给我一份完整的投资组合更新” | MCP(始终获取实时数据) |
| “TSLA 有什么新闻吗?” | MCP(新闻不断变化) |
| “AAPL 的分析师评级如何?” | MCP(研究数据始终是实时的) |
| “显示我的期权持仓” | 优先缓存,缓存过时使用 MCP |
| “我收到了多少股息?” | 优先缓存 |
| “刷新我的数据” | MCP 然后更新缓存 |
研究到实体工作流(可选——需要 Obsidian)
问题: 关于股票的研究查询在聊天会话中容易丢失。 解决方案: 每个持仓或正在研究的股票代码都会获得一个持久化的实体页面。研究记录会被追加,而不是被遗忘。
实体页面结构
每个股票代码对应一个 wiki/entities/<股票代码>.md 页面:
---
title: 公司名称
created: YYYY-MM-DD
updated: YYYY-MM-DD
type: entity
tags: [股票代码, 行业, ...]
---
# 公司名称 (股票代码)
简要概述...
## 关键事实
...
## 投资论点
...
## 持仓历史
> 自动更新。请勿手动编辑。
### 当前持仓
| 指标 | 数值 |
|--------|-------|
| 数量 | 50 |
| 平均成本 | $40.69 |
| 当前价格 | $45.20 |
| 总回报 | +10.8% |
### 持仓更新
- **[2026-04-24]** 50 股 @ $40.69 平均成本
## 研究笔记
> 智能体在每次研究查询后追加带有日期的记录。
### [2026-04-24] 我是否应该在 30 美元时加仓 HIMS?
关键点:[摘要要点]
决定:[如果用户有陈述]
何时更新实体页面
- 每次拉取投资组合时——为每个持仓更新持仓数据
- 每次研究查询后——在研究笔记中追加一条带有日期的记录
- 创建新实体时——获取基本面数据、创建页面、添加到 wiki 索引
研究队列
wiki/concepts/research-queue.md 用于跟踪正在评估但尚未买入的股票代码:
| 股票代码 | 来源 | 论点(一行) | 状态 | 添加日期 | 备注 |
|---|---|---|---|---|---|
| ABC | YouTube 视频 | 电动汽车电池业务 | 研究中 | 2026-04-24 | MKBHD 提及 |
状态值: 研究中 → 准备买入 → (买入后移除)或 已放弃
Obsidian 笔记库集成(可选)
每次拉取投资组合时,可以将两个文件写入您的 Obsidian 笔记库:
| 文件 | 行为 |
|---|---|
_ephemeral/portfolio/snapshots/YYYY-MM-DD-HHMM.md | 不可变——每次拉取生成一个,包含完整数据 |
_ephemeral/portfolio/latest.md | 覆盖写入——当前状态及与上次快照的差异 |
用于 Dataview 的前置元数据
两个文件都包含 YAML 前置元数据:
---
snapshot_time: 2026-04-24T18:58:02Z
date: 2026-04-24
time: 14:58
total_equity: 42700.94
day_change: -834.73
day_change_pct: -1.92
positions_count: 16
options_count: 1
dividends_ytd: 1.68
type: portfolio-snapshot
---
这使得可以执行 Dataview 查询:
TABLE date, total_equity, day_change_pct
FROM "_ephemeral/portfolio/snapshots"
SORT snapshot_time DESC
差异计算
latest.md 与最近一次快照进行比较,并高亮显示:
- 🆕 新持仓(上次拉取后买入的)
- ❌ 已平仓持仓(上次拉取后卖出的)
- 📊 重大变动(价格变动超过 5% 或资产配置变动超过 1%)
- 自上次快照以来的权益变动
要启用 Obsidian 集成,请在运行 refresh_cache.py 时设置 --vault-path 参数,或设置 ROBINHOOD_VAULT_PATH 环境变量。
顾问指导原则
- 始终根据用户的实际持仓提供上下文相关的回答——而非通用建议
- 在相关时引用成本基础、未实现盈亏和资产配置百分比
- 对于期权问题,理解用户的策略(例如,0DTE 突破策略)
- 当推荐操作时,展示计算过程(当前配置、风险/回报)
- 除非用户明确要求,否则从不建议进行交易
- 当单个持仓超过投资组合的 20% 时,标记集中度风险
- 交叉参考新闻与基本面——不要仅凭标题做出反应
安全与隐私
- 技能中不存储任何凭证——认证通过 MCP 配置中的环境变量进行
- 只读访问——MCP 服务器无法执行交易或修改账户设置
- 本地处理——凭证在本地用于认证;会话令牌缓存在
~/.tokens/robinhood.pickle中 - 缓存仅存在于本地——
~/.hermes/data/robinhood/不会被传输 - Obsidian 笔记库——快照仅写入用户的本地笔记库
故障排除
| 问题 | 解决方案 |
|---|---|
| “未登录” | 检查 ROBINHOOD_USERNAME 和 ROBINHOOD_PASSWORD 环境变量是否正确设置 |
| “发现非 base32 字符” | ROBINHOOD_TOTP_SECRET 包含无效字符——仅允许 A-Z 和数字 2-7。如果使用短信验证,请删除此变量 |
| 速率限制(429 错误) | robin_stocks 没有内置速率限制。暂停活动数分钟后再试 |
| MCP 服务器无法启动 | 确保已安装 uvx(pip install uv 或 `curl -LsSf https://astral.sh/uv/install.sh |
| 缓存脚本失败 | 确保已安装 robin_stocks 和 pyotp:pip install robin_stocks pyotp |
| 报价过时 | Robinhood 报价是时间点数据,而非流式传输。通过 MCP 刷新获取最新数据 |
相关链接
- robinhood-mcp —— 底层的 MCP 服务器
- robin_stocks —— 非官方的 Robinhood API 封装
portfolio-obsidian-bridge—— 用于任何券商的通用 Obsidian 同步llm-wiki—— 用于持久化研究的 Wiki 架构obsidian—— Obsidian 库操作