内容
一款可自行托管的AI交易聊天工具,适用于Robinhood代理账户。你可以通过本地聊天界面与Claude交流;Claude可以拉取市场数据,在内联中渲染蜡烛图,通过官方Trading MCP读取你的Robinhood投资组合,并提出交易建议。每条交易建议都必须经过强制确认卡。在你点击确认之前,任何交易都不会到达券商。
https://github.com/user-attachments/assets/52eb0f8c-7432-489f-aa26-9338a546d7fe
## 免责声明,请先阅读
本应用连接到一个真实的券商账户,并在您确认后可以下达真实的订单。您负责通过该应用进行的每笔交易。在使用之前:
- 审查Robinhood的代理账户控制,包括支出限制和终止开关,并将它们设置为您舒适的水平。
- 了解AI可能会出错。它解释和提出建议;它不了解未来,其推理可能有缺陷。
- 将应用保留在本地。它没有自己的身份验证,并且由于这个原因拒绝绑定到非回环地址。
- 这里没有任何投资建议。该软件在MIT许可证下提供,不提供任何保证。
## 工作原理
```mermaid
flowchart TD
UI["聊天界面 · React"]
LOOP["聊天循环<br/>Anthropic 工具使用"]
UI <-->|"SSE"| LOOP
LOOP -->|"报价 · 图表 · 读取"| REG["分层工具注册表<br/>读取自动运行"]
LOOP -->|"深度研究"| ORCH
subgraph 研究["多代理研究 · 只读"]
direction LR
ORCH["协调器"] --> SPEC["专家<br/>并行"] --> SYN["合成"] --> SKEP["风险怀疑者"]
end
REG --> DATA[("Robinhood MCP · Polygon<br/>市场和账户数据")]
SPEC --> DATA
SYN -->|"模拟订单"| DATA
REG -->|"执行工具"| GATE
SYN -->|"提案"| GATE
SKEP -->|"看跌理由"| GATE
GATE[["确认门<br/>待定订单 · 5分钟过期"]]
GATE --> CARD["确认卡<br/>论文 · 看跌理由 · 券商警告"]
CARD ==>|"确认"| BROKER["Robinhood 券商<br/>下单 / 取消"]
CARD -.->|"拒绝 / 过期"| X(["丢弃"])
SQLITE[("SQLite<br/>审计 · 订单 · 记忆 · 使用情况")]
LOOP -.- SQLITE
GATE -.- SQLITE
```
图表编码的一条硬规则:除了您在卡片上批准的已确认`待定订单`(粗体确认边)之外,没有任何路径可以到达券商。专家、合成和怀疑者读取和模拟工具。
核心原则:LLM解释和决定,确定性代码计算和执行。
- Claude从不生成价格数据。图表和指标(SMA,EMA,VWAP)从并在TypeScript中计算;Claude只选择请求的内容。
- Claude从没有直接路径到订单执行。每个工具都注册在分层注册表中:
| 层级 | 示例 | 行为 |
|------|----------|----------|
| `market_data` | get_quote, get_ohlcv, render_chart, deep_research | 自动运行 |
| `portfolio_read` | positions, balances, P fundamentals, watchlists | 自动运行 |
| `account_write` | edit watchlists, edit scanners | 自动运行(可逆,不移动资金);在设置中关闭 |
| `execution` | place_equity_order, cancel_equity_order | 从不直接运行。需要确认门 |
- 执行工具调用仅创建一个待定订单(一个放置或取消)并具有5分钟的过期时间。UI渲染一个确认卡;确认将确切存储的参数转发给Robinhood,拒绝则丢弃它们。唯一可以到达Robinhood执行工具的代码路径需要一个已确认状态的存储订单。没有绕过标志。
- 如果链接的Robinhood MCP公开了一个订单审查工具,则在发送之前会使用它预览放置,并且审查失败会中止放置。
- 对于交易想法或是否购买的问题,Claude可以运行一个`deep_research`过程,而不是自己收集所有信息。协调器计划需要哪些专家并将它们并行展开,每个专家都是一个狭窄的子代理,只能看到自己的读取工具集群,并且必须返回类型化的发现,而不返回任何描述:
- **筛选器** 用于想法生成,**技术** 用于价格结构,**基本面和收益** 用于估值和收益设置,**投资组合和风险** 用于暴露和税收批次,以及一个默认关闭的**选项** 专家。
- **合成** 步骤将发现结果合并为一个论文和最多一个具体建议。**风险怀疑者** 然后反对该建议。
- 在任何建议成为待定订单之前,它会使用的订单审查工具进行模拟,并捕获券商的预交易警告。如果模拟失败,则不会创建建议。
确认卡对于研究提案、看跌理由和券商的预交易警告,并,以便您在完整的图片下进行确认。实时活动指示器在专家运行时显示每个专家作为自己的通道。
核心规则贯穿始终:没有专家,也没有合成或怀疑步骤,持有订单工具。研究仅塑造建议。到达券商的唯一路径仍然是一个已确认的待定订单,而像报价或图表这样的简单请求会跳过协调器并直接访问工具。专家在更便宜的模型上运行,合成在更强的模型上运行,因此一个完整的通道仍然很便宜;标题成本估算包括每个子代理。
## 学习循环
代理可以根据您的历史记录进行学习,以便其建议随着时间的推移变得更加量身定制。这永远不会触及执行:没有存储的事实、教训或记录可以自动确认、调整大小或跳过确认门。学习会塑造Claude提出的建议,而不是交易是否或如何执行。
- **交易者配置文件记忆。** Claude可以使用`remember`工具记录关于您作为交易者的持久事实(风险承受能力、仓位调整、关注的股票代码、策略偏好)。相关记忆作为只读背景上下文注入每个会话中,而不是作为指令,在小令牌预算内。
- **否决反馈。** 确认卡的拒绝操作采用可选的单行原因。根据需求,`distill_lessons`会审查您的确认和拒绝历史,并提出持久的模式(例如,您始终拒绝超过某个阈值的规模)。
- **交易日记。** 已确认的交易保留其理由。`record_outcome`会在头寸关闭时记录实现的盈亏,`review_performance`会通过策略或设置计算Claude自己的提案跟踪记录,以便后续提案可以反映实际有效的内容。
- **对话搜索。** 过去的聊天记录使用SQLite FTS5本地索引,并可以通过`search_history`工具进行搜索。
代理学习的一切都是可见的,由您管理和控制。提炼的课程在设置中作为待批候选项列出;关于您的任何信息都不会不可见地存储,您可以批准、编辑、停用或删除其中的任何记忆。
## 您需要
- Node.js 20 或更新版本
- 一个 [Anthropic API 密钥](https://console.anthropic.com/)
- 一个免费的 [Polygon.io](https://polygon.io/) API 密钥(免费层足够;应用程序会积极缓存以保持在其限制之下)
- 一个启用了代理交易的Robinhood账户(在您需要投资组合访问和交易之前是可选的)
## 从全新克隆开始设置
```sh
git clone <此仓库>
cd NOMO
npm install
npm run dev
```
打开 http://localhost:5173。在首次运行时,应用程序会创建一个本地SQLite数据库,并显示一个设置屏幕:
1. 输入您的Anthropic API密钥和Polygon API密钥。两者都通过测试调用验证,然后再存储。它们保存在您机器上的`server/data/app.db`中,除了发送给各自提供商外,不会发送到其他地方。
2. 之后,您可以立即聊天和渲染图表。
要连接Robinhood:
1. 在Robinhood应用程序或网站上,设置代理交易:Robinhood将其隔离在一个单独的代理账户中,该账户一开始是空的。仅转移您打算交易的资金,并审查支出限制和终止开关。参见 [Robinhood的代理交易概述](https://ro.com/us/en/support/articles/agentic-trading-overview/)。
2. 在NOMO中,打开设置并点击链接Robinhood。会出现一个Robinhood授权页面;请在那里批准访问。
3. 返回NOMO后,设置显示已连接的工具(账户、投资组合、仓位、订单、报价、搜索)。只有只读工具会自动映射;交易通过确认环境配置是可选的。复制 `.env.example` 到 `.env` 以更改端口或模型。API密钥永远不会存放在 `.env` 中。
## 开发
```sh
npm run dev # 后端在:3001和前端在:5173
npm run typecheck # 所有工作区
npm test # 服务器单元测试和集成测试
```
测试运行在模拟的Robinhood MCP服务器上(`server/test/mockRobinhoodMcp.ts`);它们从不触及真实的券商。网关生命周期(提案、确认、拒绝、过期)由集成测试覆盖,模拟服务器记录了实际会到达券商的内容,因此测试可以断言确认网关仅转发存储的参数。
预提交钩子和CI作业在提交`.env`文件或数据库文件时都会失败。
##布局
```
frontend/ React聊天界面、图表、确认卡、设置
server/ Express后端、聊天循环、工具注册表、网关、SQLite
shared/ 两个共享的类型
docs/ 截图和资产
```
## 许可证
MIT。参见 [LICENSE](LICENSE)。