# stockclaw
**Repository Path**: efreets/stockclaw
## Basic Information
- **Project Name**: stockclaw
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-18
- **Last Updated**: 2026-03-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
StockClaw
一个为股票研究、模拟交易、历史回测与 Telegram 投递深度优化的多智能体系统。
快速开始 ·
它能做什么 ·
架构 ·
Telegram ·
历史回测
> [!IMPORTANT]
> StockClaw 围绕一个持久化 root agent 构建。root 持有整个对话,会自行决定何时使用工具,只有在 specialist 确实能增加信号时才会 spawn。
## 它能做什么
深度股票研究
一个持久化 root 协调多个专业分析师,从估值、技术面、情绪到风险多个维度协同分析。
|
模拟交易
结构化的模拟组合真值、明确的执行边界,以及完整可审计的状态变更。
|
历史回测
冻结数据集、隔离的逐日会话、严格的 `T-1` 约束,以及 agent 化的上下文补充流程。
|
## 产品哲学
- StockClaw 首先是为股票分析优化的,不是普通的 LLM 聊天机器人套壳。
- root agent 对最终结论负责,只在 specialist 确实能增加有效信息时才按需调用。
- 系统不会把供应商特定的市场数据结构硬编码进业务工作流。
- 外部数据访问尽量通过社区 MCP 服务器和 skills 接入,这样无需重写核心交易或回测逻辑也能演进。
- 交易、配置修改、durable memory 写入等高风险动作都必须经过显式工具和可审计的状态流转。
## Specialist 池
StockClaw 内置了一组针对股票分析调优的 specialist:
- 价值分析师
- 技术分析师
- 新闻与情绪分析师
- 风险经理
- 组合代理
- 交易执行代理
- 系统运维代理
root agent 可以访问整组 specialist,只挑当前任务真正需要的角色,并负责综合最终答案。
## 数据与扩展模型
StockClaw 的设计目标之一,就是避免把某一家数据提供商硬焊进核心系统。
- 市场数据、研究数据和外部集成都预期通过社区 MCP 服务器和 skills 提供。
- 你可以先使用仓库内置的 skills。
- 当 StockClaw 跑起来后,你既可以让它帮助安装新的 skill 或 MCP 路径,也可以自己手动添加。
- 正常使用时,更推荐让 StockClaw 自己安装 MCP 和 skills,而不是手改仓库配置文件。
- 目的是让核心系统保持稳定,而把数据接入能力留在边缘持续演进。
## 示例场景
### 1. 回测你已经建好的组合
假设你已经配置好了一个组合,但你不知道过去几个交易日它的表现会如何,也不想手动收集数据、逐笔分析整个过程。
这正是 StockClaw 适合接管的工作流。你只需要说:
```text
帮我回测这个组合 7 天。
```
或者:
```text
回测我当前组合最近 7 个交易日的表现。
```
StockClaw 可以准备历史窗口、运行回测流程,并返回交易、回撤和收益表现总结。
> [!CAUTION]
> 除非你确实需要长周期回测,否则尽量把回测窗口控制得短一些。更长的日期范围会显著增加 token budget 和 tool budget 消耗,系统完成所需时间也会更长。
### 2. 找值得研究的股票
如果你不是要验证现有组合,而是想获得新的投资想法,可以让 StockClaw 搜索具有投资价值的标的并建立 shortlist。例如:
```text
帮我找几只具有较强投资潜力的美股,做一个观察名单。
```
或者:
```text
找几只价值、技术面和情绪面都比较协调的股票。
```
在这条流程里,root agent 可以先搜索、聚合数据,再按需调用 specialist,把大范围候选收缩成值得继续研究的标的。
### 3. 对单只股票做深度分析
如果你已经有明确的 ticker,StockClaw 可以继续向下钻,而不是只给一个泛泛总结。例如:
```text
帮我深度分析一下 MSFT。
```
或者:
```text
分析一下 NVDA 现在是否还有投资价值。
```
这类场景最能体现多智能体结构的价值:root 会把估值、技术结构、情绪和风险几条分析线合成为一个最终结论,而不是把碎片推理扔给你自己拼接。
## 为什么这样设计
- 一个持久化 root 能让普通对话的连续性保持稳定。
- specialists 是临时、隔离的,所以可以委派分析而不污染主会话。
- 高风险操作通过工具和状态存储完成,而不是靠自由文本执行。
- 回测能保持可复现,因为执行依赖冻结状态和受 `T-1` 约束的上下文读取。
- Telegram、重启处理、runtime reload、cron 自动化这些能力都收敛在适配器和服务层,而不会泄漏进组合逻辑。
## 快速开始
```bash
git clone https://github.com/24mlight/StockClaw.git
cd StockClaw
npm install
npm start
```
首次启动时,应用会引导你完成本地初始化:
- 单一本地 LLM 配置文件 `config/llm.local.toml`
- 可选的 Telegram 集成
如果本地 MCP 配置文件不存在,应用会在后台自动创建一个空文件。安装向导不会带你逐项填写 MCP server 凭证。
对于 LLM 配置,你可以任选一种方式:
- 让启动向导创建 `config/llm.local.toml`
- 自己基于 `config/llm.local.example.toml` 创建 `config/llm.local.toml`
LLM 配置采用单一 OpenAI-compatible endpoint 的形式,真正必填的只有:
- `model`
- `baseUrl`
- `apiKey`
超时、上下文窗口和 compaction threshold 都会使用系统默认值,除非你手动加入覆盖项。
Telegram 是可选的:
- 选 `no`:只使用 Web UI
- 选 `yes`:启用 Telegram
如果启用了 Telegram,初始化流程是:
1. 粘贴 bot token
2. 在 Telegram 里给你的 bot 发任意一条消息
3. 从 Telegram 里复制 pairing code
4. 把这段 pairing code 粘贴回本地终端
5. 如果想稍后再配对,可以输入 `skip`
所有生成的配置和运行时状态都保存在本地,并已被 git ignore。
如果你更喜欢手动管理,也可以自己创建这些本地文件。
默认地址:
```text
http://127.0.0.1:8000
```
## 启动时会加载什么
在 runtime 启动时,StockClaw 会加载:
- 本地 LLM 配置
- 本地 MCP 配置
- 已安装的 skills
- prompts
- 本地 memory 文件,包括 persona、用户偏好、工具使用习惯和投资原则
- 持久化的运行状态,例如 sessions、portfolio state、cron jobs 和 backtest artifacts
对 `config`、`skills` 和 `prompts` 的变更支持 watcher 驱动的 reload。
## 架构
```mermaid
flowchart LR
user[User]
web[Web UI]
telegram[Telegram]
router[App Router]
root[Persistent Root Agent]
tools[System Tools]
specialists[Specialist Pool]
state[State Stores]
skills[Skills]
mcp[MCP via mcporter]
backtest[Backtest Runs]
user --> web
user --> telegram
web --> router
telegram --> router
router --> root
root --> tools
root --> specialists
tools --> state
tools --> skills
tools --> mcp
tools --> backtest
```
应用层本质上只负责最外层路由。真正长期持有对话的是背后的持久化 root PI session。
## 核心流程
| 流程 | 行为 |
| --- | --- |
| 聊天 | root 处理当前 turn;简单任务直接用工具,只有必要时才 spawn specialists |
| Specialist 工作 | `sessions_spawn` 创建隔离的临时 session,并带上 profile 专属 prompt 和 tool policy |
| 模拟交易执行 | 先解析实时价格,再验证后更新结构化模拟交易状态 |
| 回测 | job 会先准备冻结数据集,再运行隔离的逐日会话,最终把结果推回原始 session |
| Telegram | 配对、reaction、媒体输入、文件投递和聊天传输都收敛在 Telegram adapter 内 |
## 历史回测
root agent 目前可以对这些对象发起回测:
- 单个资产
- 显式组合
- 当前模拟组合
当前的回测模型是:
- 外层工具提交异步 job,并立即返回回执
- prepare 阶段在运行时发现可用的历史数据路径
- 交易日历会在执行开始前先确定
- 每个交易日都运行在隔离的决策 session 中
- day session 可以请求更多历史 context,但只能通过受限的 backtest tools
- 最终结果完成后会被推送回发起该回测的原始 session
## Telegram
Telegram 是扩展入口,不是主要交互界面。
当前支持的能力包括:
- 本地 pairing 审批
- slash commands 用于查看状态和组合
- reactions
- 文件发送
- 异步回测结果投递
- 文本与非文本消息输入,例如图片和常见媒体附件
当前对非文本输入的处理会结合附件元数据:
- 文本和 caption 会被保留
- 纯媒体消息会被标准化成可用请求
- 附件摘要会进入 root 上下文
## 上下文与压缩
- 每个完成的 turn 后都会记录真实的 provider usage,并在 `/status` 中显示
- 上下文大小和 compaction threshold 来自本地 LLM 配置
- Compaction 是 PI session 本身的压缩步骤
- Flush 指的是 compaction 之前,对哪些 durable memory 需要落盘所做的决策
- Cron jobs 在独立 session 中运行,这样聊天 session 不会被撑大
## API
HTTP endpoints
- `GET /`
- `GET /health`
- `GET /api/runtime`
- `POST /api/runtime/reload`
- `POST /api/sessions`
- `GET /api/sessions/:id`
- `GET /api/sessions/:id/spawns`
- `POST /api/sessions/:id/messages`
- `GET /api/sessions/:id/status`
- `GET /api/portfolio`
- `PUT /api/portfolio`
- `POST /api/trades/execute`
- `GET /api/config`
- `PATCH /api/config`
- `POST /api/ops/install`
## 本地状态
被忽略的本地文件和运行状态
仓库会忽略这些本地工作状态:
- 本地配置
- 组合和 session 状态
- 回测产物
- 运行日志
- 本地 memory 文件
这些都是仅保存在本机的运行时文件,不属于仓库内容。
## 许可证
StockClaw 采用 MIT License,详见 [LICENSE](LICENSE)。