Skip to content
dsh.fish
Bundle

dsn-finance

DeepSeek Harness finance plugin: direct market HTTP APIs, portfolio settings, model tools

Source
looput
stars
1 stars
License
MIT
Updated
Updated 5 days ago

Readme

# DSH Finance

> 让 DeepSeek Harness 从“查一条行情”走向“看懂市场、管理组合、组织研究”。

[English README](./README.en.md) · [MIT License](./package.json)

DSN Finance 是一个面向 DeepSeek Harness 的金融插件:它把 A 股、港股、美股、基金、宏观数据和财经新闻接入模型,同时提供一个可停靠的本地金融面板。行情通过公开 HTTP 接口直连,持仓和自选股保存在本地 JSON 中,适合个人研究、组合复盘和多智能体协作。

<img width="1331" height="804" alt="DSN Finance panel" src="https://github.com/user-attachments/assets/3fa063b1-22ef-404b-8fb9-1d230b7e66c0" />

## 你可以用它做什么

- **跨市场看行情**:A 股、港股、美股和公募基金的报价、K 线、列表与代码解析。
- **从数据到判断**:本地计算 MA、MACD、RSI、KDJ;查询财务指标、市场指数和行业板块。
- **跟踪市场叙事**:读取中国 CPI/PPI/PMI/GDP/M2、市场电报、个股新闻,并通过 DuckDuckGo 免费搜索网页。
- **管理自己的组合**:维护持仓和自选股,计算市值、盈亏、资产类型/市场分布,以及 top1、top3 和 HHI 集中度。
- **用研究团队拆解问题**:内置行情、基本面、宏观、基金、消息和风险管理 playbook,可交给 DSH subagent 并行研究后汇总。

## 核心体验

### 一个面板,十个视角

从侧边栏打开 **📈 金融面板**,可在以下标签页之间切换:

| 标签页 | 内容 |
| --- | --- |
| 行情 | 指数、自选股走势、迷你 K 线和实时刷新 |
| 市场 | 领涨/领跌行业板块,快速定位当日风险 |
| 持仓 | 持仓盈亏、组合市值、股票/基金配置和集中度 |
| 基金 | 开放式基金排行、净值和加入自选 |
| K线 | 本地历史库日 K 线,财报/分红/自定义事件标记 |
| 宏观 | CPI、PPI、PMI、GDP、货币供应量及趋势 |
| 快讯 | 全球财经电报,以及按持仓/自选筛选的个股新闻 |
| 数据源 | 按 capability 选择 provider,选择顺序即调用优先级 |
| 技能 | 本地 playbook 与盈米金融场景 skill 的启停管理 |
| 接口 | 数据源健康状态与当前 provider、MCP 外部源开关 |

持仓截图也可以交给 Agent 识别,再通过 `import_holdings` 批量写入本地文件;面板会自动刷新。点击持仓或自选中的股票/基金即可打开完整 AI 解读,首次主动点击后才生成,报告会缓存到本地并支持重新生成。插件只修改本地持仓数据,不执行真实交易。

### 面板与对话双向通道

面板与模型之间是双向实时的:

- **面板 → 对话**:点击持仓/自选触发解读时,面板把任务注入当前 Harness 会话。
- **对话 → 面板**:工具对持仓、自选、解读缓存、数据源策略、技能开关的修改,经服务端事件总线(`GET api/events`,SSE)即时推送到面板,无需等待轮询;模型还可以调用 `panel_navigate` 把面板切到指定标签页、聚焦某只股票的 K 线,或直接打开 AI 解读。
- 60 秒轮询保留为兜底;SSE 断线时 EventSource 自动重连。

### What-if 再平衡模拟

`simulate_rebalance` 基于本地持仓做**纯模拟**推演,不修改持仓文件、不下单:

- **trades 模式**:给定买卖列表(先卖后买、现金约束、超卖自动截断);
- **targets 模式**:给定目标权重(占「持仓市值 + 可用现金」的百分比),自动折算为交易;
- 输出前后对比:总市值、现金、权重、top1/top3、HHI、分币种敞口,以及全部警告与口径说明(按最新价成交、不计滑点费用、跨币种未折算汇率等)。

### 面向模型的金融工具

| 领域 | 工具 | 能力 |
| --- | --- | --- |
| A 股 | `get_realtime_quote` · `get_stock_kline` · `search_stock` · `get_stock_list` | 行情、日/周/月 K 线、列表搜索 |
| A 股 | `get_market_overview` · `get_financial_indicators` · `get_sector_board` | 指数、财务指标、行业板块 |
| 港股 | `get_hk_quote` · `get_hk_kline` · `get_hk_list` | 港股报价、K 线和列表样本 |
| 美股 | `get_us_quote` · `get_us_kline` | Yahoo 优先、东财兜底的报价与 K 线 |
| 基金 | `get_fund_quote` · `get_fund_kline` · `get_fund_rank` | 净值、历史走势和分类排行 |
| 通用 | `search_symbol` · `get_stock_info` | 跨市场代码解析、个股档案与市值 |
| 研究 | `calculate_technical_indicators` · `get_macro_china` | MA/MACD/RSI/KDJ 与中国宏观序列 |
| 新闻 | `get_market_news` · `get_stock_news` · `web_search` | 市场快讯、个股新闻、免费网页搜索 |
| 组合 | `get_portfolio` · `analyze_portfolio` · `upsert_holding` · `import_holdings` · `remove_holding` · `save_position_analysis` | 持仓 CRUD、批量导入、盈亏、风险分析和解读缓存 |
| 模拟 | `simulate_rebalance` | What-if 再平衡推演(交易列表或目标权重),前后权重/HHI/分币种对比 |
| 面板 | `panel_navigate` | 对话中把金融面板切到指定标签页、聚焦代码或打开 AI 解读 |
| 自选 | `add_watchlist` · `remove_watchlist` · `get_portfolio_file` | 自选股/基金和本地文件管理 |
| 运维 | `probe_finance_sources` | 串行探测端点并生成 provider 降级顺序 |

## 快速开始

### 1. 安装并构建

需要 Node.js `>=20`:

```bash
cd dsn-finance-lab
npm install
npm run build
```

### 2. 先探测公开数据源

东财、腾讯、Yahoo 和 DuckDuckGo 都是公开源,可能受到网络波动、风控或限流影响。首次运行建议先探测,插件启动时会读取报告并优先使用健康的 provider:

```bash
npm run probe

# 指定输出和请求间隔
npx tsx scripts/probe_sources.ts \
  --out data/probe-report.json \
  --gap-sec 3

# 只探测某个 capability.provider
npx tsx scripts/probe_sources.ts --only kline.em_kline
```

报告默认写入 `data/probe-report.json`。全部公开源不可用时,行情工具会返回不可用信息;本地持仓 CRUD 仍然可以使用。

### 3. 接入 DeepSeek Harness

将当前项目目录注册到 `web` profile:

```bash
npx @deepseek-ai/dsh plugin \
  --profile web add /absolute/path/to/dsn-finance-lab
npx @deepseek-ai/dsh web --profile web
```

本地开发也可以直接运行:

```bash
bash scripts/dev_web.sh
```

如果需要使用开发期的绝对路径 overlay:

```bash
npx @deepseek-ai/dsh web --patch ./cordis.dev.yml
```

注册插件后,从 Harness 左下角的 **📈 金融面板** 打开 UI;模型工具会自动出现在工具列表中。

## 配置与数据

默认配置位于 `cordis.patch.yml`:

| 配置项 | 默认值 | 说明 |
| --- | --- | --- |
| `cacheTtlSec` | `300` | provider 缓存时间 |
| `requestGapMs` | `3000` | 相邻公开请求的间隔 |
| `httpTimeoutMs` | `30000` | 单次请求超时 |
| `probeReportPath` | `data/probe-report.json` | provider 探测报告 |
| `portfolioPath` | `data/portfolio.json` | 本地持仓/自选文件 |
| `mcpSources` | 预置 妙想 / 盈米 | 外部 MCP 数据源列表(见「多来源数据」) |
| `panelOpen` | 未设置 | 是否打开金融面板 |
| `panelDocked` | 未设置 | 是否默认停靠为侧栏页 |

相对路径均以插件包目录为基准。`data/probe-report.json` 和 `data/portfolio.json` 属于本地运行数据,不会被提交。

## 可用性测试

项目提供覆盖 A 股、港股、美股、跨市场解析和网页搜索的串行测试集:

```bash
npm run test:avail

# 只测试某个分组
npm run test:avail -- --group us
# 可选分组:ashare、hk、us、tools、search
```

## 数据源与边界

- 运行时不依赖 Python `akshare`;接口形状参考 [AkShare](https://github.com/akfamily/akshare) 源码,并在 `src/data/providers.ts` 中保留来源注释。
- A 股、港股、基金、宏观和新闻主要使用东方财富,部分行情使用腾讯;美股优先使用 Yahoo Finance,并以东方财富兜底;网页搜索使用 DuckDuckGo。
- provider 会按 capability 独立降级。公开源并不承诺稳定性或完整覆盖,返回结果应结合时间、市场状态和来源健康度解读。
- 本项目用于研究和组合记录,不构成投资建议;不连接券商,也不执行下单。

## 多来源数据(MCP)

除公开免费源外,可通过 `mcpSources` 接入需要凭证的外部数据源,其工具会被桥接进模型工具集,并显示在金融面板「接口」标签页。支持三类:

| kind | 说明 | 桥接后的工具名 |
| --- | --- | --- |
| `mcp-http` | Streamable HTTP MCP Server | `mcp__<name>__*` |
| `mcp-stdio` | 子进程 stdio MCP Server | `mcp__<name>__*` |
| `cli` | 遵循 `<command> mcp list/schema/call` 约定的 CLI | `<name>_list` / `_schema` / `_call` |

默认预置两个(需自备 token):

- **妙想数据**(`mx`,`mcp-http`,东方财富):A股/港股/美股/基金/债券/指数板块/宏观/新闻/公告的自然语言查询。
- **盈米**(`yingmi`,`cli`):基金详情、风险与资产配置等能力,依赖全局安装的 `yingmi-skill-cli`。

Token 解析优先级:环境变量(`apiKeyEnv`,如 `EM_API_KEY`)→ 本地 `data/mcp-secrets.json`(不提交,见 `data/mcp-secrets.example.json`)→ 配置内联 `apiKey`。也可在面板「接口」页点 🔑 直接填写 token:写入 `data/mcp-secrets.json` 并**即时热重载**(断开旧连接、重新桥接工具,无需重启)。

## 数据源选择(多来源策略)

面板「数据源」页可按 capability 选择使用哪些 provider(`quote`/`kline`/`hk_*`/`us_*`/`web_search` 等常有多个来源共存):多选、点击顺序即调用优先级,绿点=探测可用。选择保存到本地 `data/provider-policy.json` 并即时生效(用户选择优先于探测顺序)。妙想/盈米作为整体数据源在「接口」页开关。

## 本地历史库与 K 线事件

面板「K线」页可把日 K 线与事件落地到本地库并追加更新(`data/history/<code>.json`):

- `sync_history`(工具)/ `POST api/history/sync`:抓取日 K 线(A股/港股/美股/基金)并按日期去重合并,股票同时把财报日期存为事件。
- `add_market_event` / `get_history` / `list_history`:追加分红/公告等自定义事件、读取、列出。
- K 线图上以虚线标注事件(财报=蓝、分红=绿),下方列出事件时间。

## 技能管理

面板「技能」页统一管理技能(类似工具):本插件 playbook 技能可启用/停用(进入系统提示);盈米的 11 个金融场景 skill(标准 SKILL.md)可勾选可见范围,写入 `remote-skill scope`。选择保存到 `data/skills-policy.json`。

## 项目结构

```text
src/                  插件服务、provider、模型工具和金融面板
src/panel-bus.ts      面板 ↔ 对话双向通道的事件总线(SSE 推送)
src/rebalance.ts      What-if 再平衡模拟引擎(纯函数,不改持仓)
src/mcp/              外部 MCP 数据源桥接(妙想 HTTP / 盈米 CLI)+ token 热重载
src/history/          本地历史库(K线/财报/分红)与同步
skills/               财务分析、组合、策略、风控与研究团队 playbook
scripts/              provider 探测、可用性测试和本地 Web 启动脚本
cordis.patch.yml      Harness 插件注册与默认配置
```

Install

dsh plugin --profile web add github:looput/dsh-finance-lab

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source