stock-sdk 1.10.1 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +198 -301
  2. package/dist/adapters-C0s5bM8O.d.cts +62 -0
  3. package/dist/adapters-C0s5bM8O.d.ts +62 -0
  4. package/dist/addIndicators-TPEcddTW.d.cts +524 -0
  5. package/dist/addIndicators-TPEcddTW.d.ts +524 -0
  6. package/dist/cache.cjs +1 -0
  7. package/dist/cache.d.cts +126 -0
  8. package/dist/cache.d.ts +126 -0
  9. package/dist/cache.js +1 -0
  10. package/dist/chunk-333W3ADG.js +1 -0
  11. package/dist/chunk-4Q7UQ5Q3.cjs +1 -0
  12. package/dist/chunk-4RR2H3DC.js +1 -0
  13. package/dist/chunk-4VDLQK6F.cjs +1 -0
  14. package/dist/chunk-66NWE54C.cjs +1 -0
  15. package/dist/chunk-6JEP4QK7.cjs +1 -0
  16. package/dist/chunk-BGZ4ZUAF.cjs +1 -0
  17. package/dist/chunk-DOOAXFSS.cjs +1 -0
  18. package/dist/chunk-HFN6G5M4.js +1 -0
  19. package/dist/chunk-JYHHLB34.js +1 -0
  20. package/dist/chunk-LAT6L2TO.js +1 -0
  21. package/dist/chunk-LRE63M2C.js +1 -0
  22. package/dist/chunk-NMRUSAWS.cjs +1 -0
  23. package/dist/chunk-PVSDXLQP.cjs +1 -0
  24. package/dist/chunk-SPLQXFFF.js +1 -0
  25. package/dist/chunk-SR7FGCVZ.cjs +1 -0
  26. package/dist/chunk-UBIQBXQ7.js +1 -0
  27. package/dist/chunk-WOT6VMZA.js +1 -0
  28. package/dist/chunk-XVLG3G7T.cjs +1 -0
  29. package/dist/chunk-ZAQ7DTRY.js +1 -0
  30. package/dist/cli.cjs +21 -0
  31. package/dist/cli.d.cts +1 -0
  32. package/dist/cli.d.ts +1 -0
  33. package/dist/cli.js +21 -0
  34. package/dist/errors.cjs +1 -0
  35. package/dist/errors.d.cts +1 -0
  36. package/dist/errors.d.ts +1 -0
  37. package/dist/errors.js +1 -0
  38. package/dist/index-B0PXWAkv.d.cts +198 -0
  39. package/dist/index-B0PXWAkv.d.ts +198 -0
  40. package/dist/index.cjs +1 -1
  41. package/dist/index.d.cts +54 -3658
  42. package/dist/index.d.ts +54 -3658
  43. package/dist/index.js +1 -1
  44. package/dist/indicators.cjs +1 -0
  45. package/dist/indicators.d.cts +358 -0
  46. package/dist/indicators.d.ts +358 -0
  47. package/dist/indicators.js +1 -0
  48. package/dist/mcp.cjs +5 -0
  49. package/dist/mcp.d.cts +93 -0
  50. package/dist/mcp.d.ts +93 -0
  51. package/dist/mcp.js +5 -0
  52. package/dist/screener.cjs +1 -0
  53. package/dist/screener.d.cts +69 -0
  54. package/dist/screener.d.ts +69 -0
  55. package/dist/screener.js +1 -0
  56. package/dist/sdk-CGd_HgIM.d.ts +2741 -0
  57. package/dist/sdk-C_Agv5AV.d.cts +2741 -0
  58. package/dist/signals.cjs +1 -0
  59. package/dist/signals.d.cts +60 -0
  60. package/dist/signals.d.ts +60 -0
  61. package/dist/signals.js +1 -0
  62. package/dist/symbols.cjs +1 -0
  63. package/dist/symbols.d.cts +28 -0
  64. package/dist/symbols.d.ts +28 -0
  65. package/dist/symbols.js +1 -0
  66. package/package.json +44 -3
package/README.md CHANGED
@@ -3,22 +3,29 @@
3
3
  [![npm version](https://img.shields.io/npm/v/stock-sdk.svg)](https://www.npmjs.com/package/stock-sdk)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/stock-sdk.svg)](https://www.npmjs.com/package/stock-sdk)
5
5
  [![license](https://img.shields.io/npm/l/stock-sdk)](https://github.com/chengzuopeng/stock-sdk/blob/master/LICENSE)
6
- [![MCP](https://img.shields.io/badge/protocol-MCP-blue)](https://www.npmjs.com/package/stock-sdk-mcp)
7
- [![AI Ready](https://img.shields.io/badge/AI-Ready-orange)](https://stock-sdk.linkdiary.cn/mcp/)
6
+ [![MCP](https://img.shields.io/badge/protocol-MCP-blue)](https://stock-sdk-v2.linkdiary.cn/mcp/)
7
+ [![AI Ready](https://img.shields.io/badge/AI-Ready-orange)](https://stock-sdk-v2.linkdiary.cn/mcp/)
8
8
 
9
9
  **[English](./README_EN.md)** | 中文
10
10
 
11
11
  为 **前端和 Node.js 设计的股票行情 JavaScript SDK**。
12
12
 
13
- 无需 Python、无需后端服务,直接在 **浏览器或 Node.js** 中获取 **A 股 / 港股 / 美股 / 公募基金** 的实时行情与 K 线数据。
13
+ 无需 Python、无需后端服务,直接在 **浏览器或 Node.js** 中获取 **A 股 / 港股 / 美股 / 公募基金** 的实时行情与 K 线数据。还自带 **命令行工具** 与 **MCP server**,一条命令取行情或接入 AI。
14
14
 
15
- **✨ 零依赖 | 🌐 Browser + Node.js | 📦 轻量发布包 | 🧠 完整 TypeScript 类型**
15
+ **✨ 零依赖 | 🌐 Browser + Node.js | 📦 ESM + CJS + subpath | 🧠 完整 TypeScript 类型 | 🖥️ CLI | 🤖 MCP**
16
16
 
17
- ## Documentation
17
+ > 🧪 **v2.0.0 Beta**:v2 是一次架构跃迁(命名空间 API、统一符号模型、`Quote` 可辨识联合、统一错误体系、CLI / MCP / subpath 导出)。
18
+ > 安装 beta:`npm i stock-sdk@beta`。从 v1 升级请先读 [v1 → v2 迁移指南](https://stock-sdk-v2.linkdiary.cn/guide/migration-v1-to-v2)(**破坏性变更,无兼容别名**)。
18
19
 
19
- 👉🏻 [官方文档](https://stock-sdk.linkdiary.cn/)
20
+ ## 📖 官网文档(v2 Beta)
20
21
 
21
- 📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://stock-sdk.linkdiary.cn/playground/)
22
+ > ## 👉 https://stock-sdk-v2.linkdiary.cn
23
+ >
24
+ > **v2 Beta 的临时官网** —— 完整 API、命名空间总览、CLI / MCP 指南、在线 Playground、v1 → v2 迁移文档全部在这里。先看官网再上手最快。
25
+ >
26
+ > (v1 稳定版文档仍在 https://stock-sdk.linkdiary.cn)
27
+
28
+ 📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线 Playground](https://stock-sdk-v2.linkdiary.cn/playground/)
22
29
 
23
30
  🧭 [Stock Dashboard](https://chengzuopeng.github.io/stock-dashboard/):基于 stock-sdk 搭建的股票数据大盘演示站点,欢迎体验。
24
31
 
@@ -29,7 +36,6 @@
29
36
  * 股票行情工具大多是 **Python 生态**,前端难以直接使用
30
37
  * 想做行情看板 / Demo,不想额外维护后端服务
31
38
  * 财经接口返回格式混乱、编码复杂(GBK / 并发 / 批量)
32
- * AkShare 很强,但并不适合浏览器或 Node.js 项目
33
39
 
34
40
  **stock-sdk 的目标很简单:**
35
41
 
@@ -44,355 +50,246 @@
44
50
  * 🎓 股票 / 金融课程 Demo
45
51
  * 🧪 量化策略原型验证(JS / Node)
46
52
  * 🕒 Node.js 定时抓取行情数据
53
+ * 🖥️ 命令行临时查行情 / 🤖 给 AI 工具接数据源
47
54
 
48
55
  ---
49
56
 
50
57
  ## 特性
51
58
 
52
- - ✅ **零依赖**,轻量级发布包
53
- - ✅ 支持 **浏览器** **Node.js 18+** 双端运行
54
- - ✅ 同时提供 **ESM** **CommonJS** 两种模块格式
55
- - ✅ 完整的 **TypeScript** 类型定义和单元测试覆盖
56
- - ✅ **A 股、港股、美股、公募基金**实时行情
57
- - ✅ **基金深度数据**(v1.10.0+):历史净值(全历史单位/累计)、实时估值(盘中刷新)、同类排名走势、基金/ETF 分红送配
58
- - ✅ **历史 K 线**(日/周/月)、**分钟 K 线**(1/5/15/30/60 分钟)和**当日分时走势**数据
59
- - ✅ **技术指标**:内置 MA、MACD、BOLL、KDJ、RSI、WR、BIAS、CCI、ATR、OBV、ROC、DMI、SAR、KC
60
- - ✅ **期货行情**:国内期货 K 线、全球期货实时行情与 K 线、期货库存数据
61
- - ✅ **期权数据**:中金所股指期权、上交所 ETF 期权、商品期权的报价 / K 线 / 分钟行情
62
- - ✅ **资金流向**(个股/大盘/排名/板块)、**盘口大单**、**涨停板池**、**盘口异动** 等扩展数据
63
- - ✅ **沪深港通 / 北向资金**(分时、汇总、持股排行、历史、个股持仓)
64
- - ✅ **龙虎榜**(详情、个股统计、机构买卖、营业部排行、席位明细)
65
- - ✅ **大宗交易** + **融资融券** 全套数据
66
- - ✅ 获取全部 **A 股代码列表**(5000+ 只股票)和批量获取**全市场行情**(内置并发控制)
67
- - ✅ 支持 **provider 级重试 / 限流 / 熔断策略覆盖**,兼容旧的全局请求配置
68
- - ✅ **AI / MCP 就绪** — 配套 [stock-sdk-mcp](https://www.npmjs.com/package/stock-sdk-mcp) MCP Server,一行命令接入 Cursor / Claude / Gemini 等 AI 工具
69
-
70
- ## 市场支持矩阵
71
-
72
- 不同市场的能力覆盖度差异较大,下表帮你快速判断 SDK 是否覆盖你的场景。
73
-
74
- - ✅ 已支持
75
- - ⚠️ 部分支持 / 限制见备注
76
- - ❌ 暂未实现(市场有此能力或存在数据源,SDK 后续可补)
77
- - — 概念不适用(该市场 / 产品本身不存在此能力,如基金不会涨停、期货合约无分红)
78
-
79
- | 能力 | A 股 | 港股 | 美股 | 公募基金 | 期货 | 期权 |
80
- |------|:----:|:----:|:----:|:--------:|:----:|:----:|
81
- | 实时行情 | ✅ | ✅ | ✅ | ✅ | ✅ 全球期货 | ✅ ETF / 中金所 / 商品 |
82
- | 历史 K 线(日/周/月) | ✅ | ✅ | ✅ | ⚠️ 场内 ETF/LOF(走 `getHistoryKline`) | ✅ 国内 + 全球 | ✅ |
83
- | 分钟 K 线(5/15/30/60) | ✅ | ✅ `getHKMinuteKline` | ✅ `getUSMinuteKline` | ⚠️ 场内 ETF/LOF(走 `getMinuteKline`) | ❌ | ❌ |
84
- | 当日分时(1 分钟) | ✅ | ✅ `getHKMinuteKline` (period='1') | ✅ `getUSMinuteKline` (period='1') | ⚠️ 场内 ETF/LOF | ❌ | ✅ ETF 期权 |
85
- | 分红派送 | ✅ | ❌ | ❌ | ✅ 基金 + ETF(`getFundDividendList`) | — | — |
86
- | 资金流向 | ✅ 个股/大盘/排名/板块 | ❌ | ❌ | — | — | — |
87
- | 板块(行业 / 概念) | ✅ | ❌ | ❌ | ❌ | — | — |
88
- | 龙虎榜 | ✅ | — | — | — | — | ✅ 期权龙虎榜 |
89
- | 沪深港通 / 北向资金 | ✅ 北向 | ✅ 南向 | — | — | — | — |
90
- | 大宗交易 | ✅ | ❌ | ❌ | — | — | — |
91
- | 融资融券 | ✅ | — | — | — | — | — |
92
- | 涨停板 / 盘口异动 | ✅ | — | — | — | — | — |
93
- | 全市场代码列表 | ✅ 5000+ | ✅ | ✅ | ✅ | ❌ | ❌ |
94
- | 批量行情 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
95
- | 库存数据 | — | — | — | — | ✅ 国内 + COMEX | — |
96
- | 交易日历 | ✅ + `isTradingDay()` 等工具 | ⚠️ 仅市场状态判断(按周一-周五) | ⚠️ 仅市场状态判断(按周一-周五) | — | — | — |
59
+ - ✅ **零依赖**,浏览器 + Node.js 18+ 双端运行;同时提供 **ESM** 和 **CommonJS**
60
+ - ✅ **命名空间 API**:`sdk.quotes.cn()` / `sdk.kline.cn()` / `sdk.options.etf.dailyKline()`,按领域分组、IDE 自动补全友好
61
+ - ✅ **统一符号模型**:`string` 一等公民,`sh600519` / `600519` / `600519.SH` / `00700` / `hk00700` / `AAPL` / `105.AAPL` 等写法容错解析
62
+ - ✅ **A 股 / 港股 / 美股 / 公募基金**实时行情、历史 K 线(日/周/月)、分钟 K 线(1/5/15/30/60)、当日分时
63
+ - ✅ **技术指标**:MA / MACD / BOLL / KDJ / RSI / WR / BIAS / CCI / ATR / OBV / ROC / DMI / SAR / KC
64
+ - ✅ **信号 / 选股 / 回测**:`calcSignals`(金叉死叉/超买超卖等事件识别)、链式选股器、本地回测
65
+ - ✅ **期货 / 期权 / 资金流 / 龙虎榜 / 北向 / 大宗交易 / 融资融券 / 涨停板** 等全套扩展数据
66
+ - ✅ **基金深度数据**:历史净值、实时估值、同类排名走势、基金/ETF 分红送配
67
+ - ✅ **subpath 导出**:`stock-sdk/{indicators,signals,symbols,screener,cache,errors}`,纯计算不拖入网络层,tree-shake 友好
68
+ - ✅ **统一错误体系**:对外只抛 `SdkError`,带标准 `code`,可从 `stock-sdk/errors` 导入
69
+ - ✅ **请求治理**:provider 级重试 / 限流 / 熔断 + 可注入 `fetchImpl` / `signal` / 生命周期 `hooks`
70
+ - ✅ **CLI**:`stock-sdk quote 600519` 终端直接取行情
71
+ - ✅ **内置 MCP server**:`stock-sdk mcp` 一行接入 Cursor / Claude / Codex 等 AI 工具(零依赖手写,无 `@modelcontextprotocol/sdk`)
97
72
 
98
- > **数据延迟**:实时行情来自腾讯财经 / 东方财富等公开接口,**非实时撮合**,
99
- > 通常有数十秒到数分钟延迟。SDK 不适合做高频交易决策。
100
- >
101
- > **港股 / 美股 K 线类型**:自 v1.9.1 起拆分为 `HKHistoryKline` / `USHistoryKline`,
102
- > 各自带 `currency` 与时区元信息;老的 `HKUSHistoryKline` 别名仍兼容。
73
+ ---
103
74
 
104
75
  ## 安装
105
76
 
106
77
  ```bash
78
+ # v2 Beta(命名空间 API / CLI / MCP)
79
+ npm install stock-sdk@beta
80
+
81
+ # v1 稳定版
107
82
  npm install stock-sdk
108
- # 或
109
- yarn add stock-sdk
110
- # 或
111
- pnpm add stock-sdk
112
83
  ```
113
84
 
114
- ## 快速开始(10 行 Demo)
85
+ ## 快速开始
115
86
 
116
87
  ```ts
117
88
  import { StockSDK } from 'stock-sdk';
118
89
 
119
90
  const sdk = new StockSDK();
120
91
 
121
- const quotes = await sdk.getSimpleQuotes([
122
- 'sh000001',
123
- 'sz000858',
124
- 'sh600519',
125
- ]);
126
-
127
- quotes.forEach(q => {
92
+ // 命名空间 API(v2)— 符号写法容错,'600519' / 'sh600519' / '600519.SH' 都可
93
+ const quotes = await sdk.quotes.cnSimple(['sh000001', 'sz000858', 'sh600519']);
94
+ quotes.forEach((q) => {
128
95
  console.log(`${q.name}: ${q.price} (${q.changePercent}%)`);
129
96
  });
97
+
98
+ // 历史 K 线 + 技术指标
99
+ const kline = await sdk.kline.withIndicators('600519', {
100
+ period: 'daily',
101
+ indicators: { ma: { periods: [5, 10, 20] }, macd: {} },
102
+ });
103
+
104
+ // 全市场 A 股行情(5000+ 股票,内置并发控制)
105
+ const all = await sdk.batch.cn({ concurrency: 5 });
106
+ console.log(`共 ${all.length} 只`);
130
107
  ```
131
108
 
132
- ## 示例:全市场 A 股行情
109
+ > 港股 `'00700'` / `'hk00700'`,美股 `'AAPL'` / `'105.AAPL'`,由 `normalizeSymbol` 统一容错解析。
133
110
 
134
- 前端直接一次性获取全市场 A 股行情(5000+股票),无需 Python 或后端服务。
111
+ ---
112
+
113
+ ## 命令行(CLI)
114
+
115
+ 安装后即得 `stock-sdk` 命令(或用 `npx`):
116
+
117
+ ```bash
118
+ # 行情(按代码自动识别市场)
119
+ npx stock-sdk quote 600519 00700 AAPL
120
+ # K 线 + 输出截断
121
+ npx stock-sdk kline 600519 --period weekly --limit 30
122
+ # 带技术指标
123
+ npx stock-sdk indicators 600519 --ma 5,10,20 --macd
124
+ # 搜索
125
+ npx stock-sdk search 茅台
126
+ # 任意命名空间方法直达
127
+ npx stock-sdk quotes cn sh600519 sz000001
128
+ ```
129
+
130
+ 默认 JSON 输出,可加 `--format table|csv`、`--pretty`、`--limit N`。
131
+
132
+ ---
133
+
134
+ ## 🤖 AI / MCP 集成
135
+
136
+ v2 内置零依赖 MCP server,一条命令启动:
137
+
138
+ ```bash
139
+ npx stock-sdk mcp
140
+ ```
141
+
142
+ 接入 Cursor / Claude Desktop / Codex / Gemini 等(配置 `mcpServers`):
143
+
144
+ ```json
145
+ {
146
+ "mcpServers": {
147
+ "stock-sdk": {
148
+ "command": "npx",
149
+ "args": ["-y", "stock-sdk", "mcp"]
150
+ }
151
+ }
152
+ }
153
+ ```
154
+
155
+ 环境变量 `STOCK_SDK_MCP_TOOLS=core|full|<逗号分隔工具名>` 控制工具集范围(默认 `core`)。
156
+
157
+ 👉 [完整 MCP 文档](https://stock-sdk-v2.linkdiary.cn/mcp/)
158
+
159
+ ---
160
+
161
+ ## 信号 / 选股 / 回测
135
162
 
136
163
  ```ts
137
- const allQuotes = await sdk.getAllAShareQuotes({
138
- batchSize: 300,
139
- concurrency: 5,
140
- onProgress: (completed, total) => {
141
- console.log(`进度: ${completed}/${total}`);
142
- },
164
+ import { calcSignals } from 'stock-sdk/signals';
165
+ import { screen, backtest } from 'stock-sdk/screener';
166
+
167
+ // 金叉/死叉/超买超卖等事件识别(基于带指标的 K 线)
168
+ const signals = calcSignals(klineWithIndicators, {
169
+ ma: { fast: 5, slow: 20 },
170
+ rsi: {},
143
171
  });
144
172
 
145
- console.log(`共获取 ${allQuotes.length} 只股票`);
173
+ // 链式选股(输入任意行情数组,纯本地、无网络)
174
+ const picks = screen(allQuotes)
175
+ .where((q) => q.pe != null && q.pe < 20)
176
+ .where((q) => q.changePercent > 3)
177
+ .sortBy((q) => q.amount)
178
+ .top(20);
179
+
180
+ // 本地回测
181
+ const report = backtest({
182
+ klines,
183
+ strategy: (bar, i, all) => 'hold', // 返回 'buy' | 'sell' | 'hold'
184
+ });
185
+ console.log(report.totalReturn, report.winRate, report.maxDrawdown);
146
186
  ```
147
187
 
148
- ## 请求治理与错误码
188
+ ---
189
+
190
+ ## 请求治理与错误
149
191
 
150
192
  ```ts
151
- import { StockSDK, HttpError, getSdkErrorCode } from 'stock-sdk';
193
+ import { StockSDK } from 'stock-sdk';
194
+ import { HttpError, getSdkErrorCode } from 'stock-sdk/errors';
152
195
 
153
196
  const sdk = new StockSDK({
154
197
  retry: { maxRetries: 2, baseDelay: 500 },
155
198
  providerPolicies: {
156
- eastmoney: {
157
- timeout: 12000,
158
- rateLimit: { requestsPerSecond: 3, maxBurst: 3 },
159
- },
199
+ eastmoney: { timeout: 12000, rateLimit: { requestsPerSecond: 3, maxBurst: 3 } },
160
200
  },
161
201
  });
162
202
 
163
203
  try {
164
- await sdk.getSimpleQuotes(['sh600519']);
204
+ await sdk.quotes.cnSimple(['sh600519']);
165
205
  } catch (error) {
166
- if (error instanceof HttpError) {
167
- console.log(error.status, error.statusText);
168
- }
169
-
170
- console.log(getSdkErrorCode(error)); // HTTP_ERROR / NETWORK_ERROR / TIMEOUT ...
206
+ // v2 对外只抛 SdkError,带统一 code
207
+ if (error instanceof HttpError) console.log(error.status, error.statusText);
208
+ console.log(getSdkErrorCode(error)); // HTTP_ERROR / NETWORK_ERROR / TIMEOUT / ABORTED / PARSE_ERROR ...
171
209
  }
172
210
  ```
173
211
 
174
- `getSdkErrorCode` 只做标准化识别,不会改变原始错误实例类型。网络错误仍然保持 `TypeError`,超时仍然保持 `AbortError` / `DOMException` 的兼容行为。
212
+ ---
175
213
 
176
- ## 开发校验命令
214
+ ## 子路径导出(subpath)
177
215
 
178
- ```bash
179
- yarn typecheck
180
- yarn build
181
- yarn test
182
- yarn test:integration:smoke
183
- # 全量集成回归
184
- yarn test:integration:full
216
+ 只用纯计算(指标 / 符号 / 信号 / 选股)时,从 subpath 导入,bundle 不会拖入 `RequestClient` 与所有 provider:
217
+
218
+ ```ts
219
+ import { calcMACD, calcKDJ } from 'stock-sdk/indicators';
220
+ import { normalizeSymbol, toTencentSymbol } from 'stock-sdk/symbols';
221
+ import { calcSignals } from 'stock-sdk/signals';
222
+ import { screen, backtest } from 'stock-sdk/screener';
223
+ import { MemoryCacheStore, cacheThrough } from 'stock-sdk/cache';
224
+ import { SdkError, isSdkError, getSdkErrorCode } from 'stock-sdk/errors';
185
225
  ```
186
226
 
187
- ## 🤖 AI / MCP 集成
227
+ ---
188
228
 
189
- Stock SDK 配套 MCP Server([stock-sdk-mcp](https://www.npmjs.com/package/stock-sdk-mcp)),可一键接入主流 AI 工具:
229
+ ## 市场支持矩阵
190
230
 
191
- | AI 工具 | 配置方式 |
192
- |---------|---------|
193
- | Cursor | `~/.cursor/mcp.json` |
194
- | Claude Desktop | `claude_desktop_config.json` |
195
- | OpenClaw | `~/.clawdbot/config.yaml` |
196
- | Codex CLI | `~/.codex/config.json` |
197
- | Gemini CLI | `~/.gemini/settings.json` |
231
+ 不同市场的能力覆盖度差异较大,下表帮你快速判断 SDK 是否覆盖你的场景。
198
232
 
199
- **配置示例:**
233
+ - ✅ 已支持 | ⚠️ 部分支持(见备注)| ❌ 暂未实现 | — 概念不适用
200
234
 
201
- ```json
202
- {
203
- "mcpServers": {
204
- "stock-sdk": {
205
- "command": "npx",
206
- "args": ["-y", "stock-sdk-mcp"]
207
- }
208
- }
209
- }
210
- ```
235
+ | 能力 | A 股 | 港股 | 美股 | 公募基金 | 期货 | 期权 |
236
+ |------|:----:|:----:|:----:|:--------:|:----:|:----:|
237
+ | 实时行情 | ✅ | ✅ | ✅ | ✅ | ✅ 全球期货 | ✅ ETF / 中金所 / 商品 |
238
+ | 历史 K 线(日/周/月) | ✅ | ✅ | ✅ | ⚠️ 场内 ETF/LOF | ✅ 国内 + 全球 | ✅ |
239
+ | 分钟 K 线(5/15/30/60) | ✅ | ✅ `kline.hkMinute` | ✅ `kline.usMinute` | ⚠️ 场内 ETF/LOF | ❌ | ❌ |
240
+ | 当日分时(1 分钟) | ✅ `quotes.timeline` | ✅ `kline.hkMinute`(period='1') | ✅ `kline.usMinute`(period='1') | ⚠️ 场内 ETF/LOF | ❌ | ✅ ETF 期权 |
241
+ | 分红派送 | ✅ | ❌ | ❌ | ✅ 基金 + ETF | — | — |
242
+ | 资金流向 | ✅ 个股/大盘/排名/板块 | ❌ | ❌ | — | — | — |
243
+ | 板块(行业 / 概念) | ✅ | ❌ | ❌ | ❌ | — | — |
244
+ | 龙虎榜 | ✅ | — | — | — | — | ✅ 期权龙虎榜 |
245
+ | 沪深港通 / 北向资金 | ✅ 北向 | ✅ 南向 | — | — | — | — |
246
+ | 大宗交易 / 融资融券 | ✅ | ❌ | ❌ | — | — | — |
247
+ | 涨停板 / 盘口异动 | ✅ | — | — | — | — | — |
248
+ | 全市场代码列表 / 批量行情 | ✅ 5000+ | ✅ | ✅ | ✅ 代码 | ❌ | ❌ |
249
+ | 库存数据 | — | — | — | — | ✅ 国内 + COMEX | — |
250
+ | 交易日历 | ✅ `calendar.*` | ⚠️ 仅市场状态 | ⚠️ 仅市场状态 | — | — | — |
251
+
252
+ > **数据延迟**:实时行情来自腾讯财经 / 东方财富等公开接口,**非实时撮合**,通常有数十秒到数分钟延迟,不适合高频交易决策。
211
253
 
212
- **内置 4 个专业 AI Skills:** 技术分析 / 智能选股 / 市场概览 / 实时监控
254
+ ---
213
255
 
214
- 👉 [完整 MCP 文档](https://stock-sdk.linkdiary.cn/mcp/)
256
+ ## API 概览(命名空间)
257
+
258
+ 💡 完整 API 见 [官方文档](https://stock-sdk-v2.linkdiary.cn/api/)。v2 全部方法挂在命名空间下:
259
+
260
+ | 命名空间 | 代表方法 |
261
+ |---|---|
262
+ | `sdk.quotes` | `.cn` / `.cnSimple` / `.hk` / `.us` / `.fund` / `.fundFlow` / `.largeOrder` / `.timeline` |
263
+ | `sdk.codes` | `.cn` / `.us` / `.hk` / `.fund` |
264
+ | `sdk.batch` | `.cn` / `.hk` / `.us` / `.byCodes` / `.raw` |
265
+ | `sdk.kline` | `.cn` / `.cnMinute` / `.hk` / `.hkMinute` / `.us` / `.usMinute` / `.withIndicators` |
266
+ | `sdk.board` | `.industry.*` / `.concept.*`(`list` / `spot` / `constituents` / `kline` / `minuteKline`) |
267
+ | `sdk.options` | `.index.*` / `.etf.*` / `.commodity.*` / `.cffex.*` / `.lhb` |
268
+ | `sdk.futures` | `.kline` / `.globalSpot` / `.globalKline` / `.inventory` / `.comexInventory` … |
269
+ | `sdk.fundFlow` | `.individual` / `.market` / `.rank` / `.sectorRank` / `.sectorHistory` |
270
+ | `sdk.northbound` | `.minute` / `.summary` / `.holdingRank` / `.history` / `.individual` |
271
+ | `sdk.marketEvent` | `.ztPool` / `.stockChanges` / `.boardChanges` |
272
+ | `sdk.dragonTiger` | `.detail` / `.stockStats` / `.institution` / `.branchRank` / `.seatDetail` |
273
+ | `sdk.blockTrade` / `sdk.margin` | 大宗交易 / 融资融券 |
274
+ | `sdk.fund` | `.dividendList` / `.navHistory` / `.estimate` / `.rankHistory` |
275
+ | `sdk.calendar` | `.isTradingDay` / `.nextTradingDay` / `.prevTradingDay` / `.marketStatus` |
276
+ | `sdk.reference` | `.dividendDetail` / `.tradingCalendar` |
277
+ | 顶层 | `sdk.search(keyword)` |
278
+
279
+ > 指标计算从主包改为 subpath:`import { calcMACD } from 'stock-sdk/indicators'`。
280
+ > 从 v1 扁平 API 迁移?见 [v1 → v2 迁移指南](https://stock-sdk-v2.linkdiary.cn/guide/migration-v1-to-v2)(含完整 `sdk.getXxx()` → `sdk.<ns>.<method>()` 映射表)。
215
281
 
216
282
  ---
217
283
 
218
- ## API 列表
219
-
220
- 💡 API 详细文档请查阅 [https://stock-sdk.linkdiary.cn/](https://stock-sdk.linkdiary.cn/)
221
-
222
- ### 实时行情
223
-
224
- | 方法 | 说明 |
225
- |------|------|
226
- | `getFullQuotes` | A 股/指数全量行情 |
227
- | `getSimpleQuotes` | A 股/指数简要行情 |
228
- | `getHKQuotes` | 港股行情 |
229
- | `getUSQuotes` | 美股行情 |
230
- | `getFundQuotes` | 公募基金行情 |
231
-
232
- ### K 线数据
233
-
234
- | 方法 | 说明 |
235
- |------|------|
236
- | `getHistoryKline` | A 股历史 K 线(日/周/月) |
237
- | `getHKHistoryKline` | 港股历史 K 线(日/周/月) |
238
- | `getUSHistoryKline` | 美股历史 K 线(日/周/月) |
239
- | `getMinuteKline` | A 股分钟 K 线(1/5/15/30/60 分钟) |
240
- | `getHKMinuteKline` | 港股分钟 K 线(5/15/30/60 分钟)或当日分时(period='1'),v1.10.0+ |
241
- | `getUSMinuteKline` | 美股分钟 K 线(5/15/30/60 分钟)或当日分时(period='1'),v1.10.0+ |
242
- | `getTodayTimeline` | A 股当日分时走势 |
243
-
244
- ### 技术指标
245
-
246
- | 方法 | 说明 |
247
- |------|------|
248
- | `getKlineWithIndicators` | 获取带技术指标的 K 线数据 |
249
- | `calcMA` | 计算均线(SMA/EMA/WMA) |
250
- | `calcMACD` | 计算 MACD |
251
- | `calcBOLL` | 计算布林带 |
252
- | `calcKDJ` | 计算 KDJ |
253
- | `calcRSI` | 计算 RSI |
254
- | `calcWR` | 计算威廉指标 |
255
- | `calcBIAS` | 计算乖离率 |
256
- | `calcCCI` | 计算商品通道指数 |
257
- | `calcATR` | 计算平均真实波幅 |
258
- | `calcOBV` | 计算能量潮 |
259
- | `calcROC` | 计算变动率指标 |
260
- | `calcDMI` | 计算趋向指标 |
261
- | `calcSAR` | 计算抛物线转向 |
262
- | `calcKC` | 计算肯特纳通道 |
263
-
264
- ### 行业板块
265
-
266
- | 方法 | 说明 |
267
- |------|------|
268
- | `getIndustryList` | 行业板块名称列表 |
269
- | `getIndustrySpot` | 行业板块实时行情 |
270
- | `getIndustryConstituents` | 行业板块成分股 |
271
- | `getIndustryKline` | 行业板块历史 K 线(日/周/月) |
272
- | `getIndustryMinuteKline` | 行业板块分时行情(1/5/15/30/60 分钟) |
273
-
274
- ### 概念板块
275
-
276
- | 方法 | 说明 |
277
- |------|------|
278
- | `getConceptList` | 概念板块名称列表 |
279
- | `getConceptSpot` | 概念板块实时行情 |
280
- | `getConceptConstituents` | 概念板块成分股 |
281
- | `getConceptKline` | 概念板块历史 K 线(日/周/月) |
282
- | `getConceptMinuteKline` | 概念板块分时行情(1/5/15/30/60 分钟) |
283
-
284
- ### 期货行情
285
-
286
- | 方法 | 说明 |
287
- |------|------|
288
- | `getFuturesKline` | 国内期货历史 K 线(日/周/月) |
289
- | `getGlobalFuturesSpot` | 全球期货实时行情 |
290
- | `getGlobalFuturesKline` | 全球期货历史 K 线(日/周/月) |
291
- | `getFuturesInventorySymbols` | 期货库存品种列表 |
292
- | `getFuturesInventory` | 期货库存数据 |
293
- | `getComexInventory` | COMEX 黄金/白银库存 |
294
-
295
- ### 期权数据
296
-
297
- | 方法 | 说明 |
298
- |------|------|
299
- | `getIndexOptionSpot` | 中金所股指期权 T 型报价(看涨 + 看跌) |
300
- | `getIndexOptionKline` | 股指期权合约日 K 线 |
301
- | `getCFFEXOptionQuotes` | 中金所全部期权实时行情列表 |
302
- | `getETFOptionMonths` | 上交所 ETF 期权到期月份列表 |
303
- | `getETFOptionExpireDay` | ETF 期权到期日与剩余天数 |
304
- | `getETFOptionMinute` | ETF 期权当日分钟行情 |
305
- | `getETFOptionDailyKline` | ETF 期权历史日 K 线 |
306
- | `getETFOption5DayMinute` | ETF 期权 5 日分钟行情 |
307
- | `getCommodityOptionSpot` | 商品期权 T 型报价 |
308
- | `getCommodityOptionKline` | 商品期权合约日 K 线 |
309
- | `getOptionLHB` | 期权龙虎榜 |
310
-
311
- ### 扩展数据
312
-
313
- | 方法 | 说明 |
314
- |------|------|
315
- | `getFundFlow` | 资金流向(按代码批量查询) |
316
- | `getPanelLargeOrder` | 盘口大单占比 |
317
- | `getTradingCalendar` | A 股交易日历 |
318
- | `getDividendDetail` | 股票分红派送详情 |
319
-
320
- ### 基金扩展(v1.10.0+)
321
-
322
- | 方法 | 说明 |
323
- |------|------|
324
- | `getFundDividendList` | 基金 / ETF 分红明细(全市场,按年份分页,可按代码过滤) |
325
- | `getFundNavHistory` | 基金历史净值(单位 + 累计,全历史一次返回) |
326
- | `getFundEstimate` | 基金当日实时估值(含 T-1 单位净值 + 盘中估算) |
327
- | `getFundRankHistory` | 基金同类排名走势(每日近三月排名 + 百分位) |
328
-
329
- ### 资金流向(深度)
330
-
331
- | 方法 | 说明 |
332
- |------|------|
333
- | `getIndividualFundFlow` | 个股资金流历史(日/周/月) |
334
- | `getMarketFundFlow` | 大盘(上证 + 深证)资金流历史 |
335
- | `getFundFlowRank` | 个股资金流排名(今日 / 3 日 / 5 日 / 10 日) |
336
- | `getSectorFundFlowRank` | 板块资金流排名(行业 / 概念 / 地域) |
337
- | `getSectorFundFlowHistory` | 单个板块的历史资金流 |
338
-
339
- ### 沪深港通 / 北向资金
340
-
341
- | 方法 | 说明 |
342
- |------|------|
343
- | `getNorthboundMinute` | 北向 / 南向资金分时数据 |
344
- | `getNorthboundFlowSummary` | 沪深港通市场资金流向汇总 |
345
- | `getNorthboundHoldingRank` | 北向 / 沪股通 / 深股通持股个股排行 |
346
- | `getNorthboundHistory` | 北向 / 南向资金历史 |
347
- | `getNorthboundIndividual` | 个股北向持仓历史 |
348
-
349
- ### 涨停板 / 盘口异动
350
-
351
- | 方法 | 说明 |
352
- |------|------|
353
- | `getZTPool` | 涨停 / 昨日涨停 / 强势 / 次新 / 炸板 / 跌停 6 大股池 |
354
- | `getStockChanges` | 22 种盘口异动(火箭发射 / 大笔买入 / 封涨停 等) |
355
- | `getBoardChanges` | 当日板块异动详情 |
356
-
357
- ### 龙虎榜
358
-
359
- | 方法 | 说明 |
360
- |------|------|
361
- | `getDragonTigerDetail` | 龙虎榜详情(按日期范围) |
362
- | `getDragonTigerStockStats` | 个股上榜统计(近 1/3/6 月、1 年) |
363
- | `getDragonTigerInstitution` | 机构买卖统计 |
364
- | `getDragonTigerBranchRank` | 营业部排行 |
365
- | `getDragonTigerStockSeatDetail` | 个股某日上榜席位明细(买入榜 + 卖出榜) |
366
-
367
- ### 大宗交易 / 融资融券
368
-
369
- | 方法 | 说明 |
370
- |------|------|
371
- | `getBlockTradeMarketStat` | 大宗交易市场每日总览 |
372
- | `getBlockTradeDetail` | 大宗交易明细 |
373
- | `getBlockTradeDailyStat` | 大宗交易每日统计(按股票汇总) |
374
- | `getMarginAccountInfo` | 融资融券账户统计 |
375
- | `getMarginTargetList` | 融资融券标的明细 |
376
-
377
- ### 批量查询
378
-
379
- | 方法 | 说明 |
380
- |------|------|
381
- | `getAShareCodeList` | 获取全部 A 股代码 |
382
- | `getUSCodeList` | 获取全部美股代码 |
383
- | `getHKCodeList` | 获取全部港股代码 |
384
- | `getAllAShareQuotes` | 获取全市场 A 股行情 |
385
- | `getAllHKShareQuotes` | 获取全市场港股行情 |
386
- | `getAllUSShareQuotes` | 获取全市场美股行情 |
387
- | `getAllQuotesByCodes` | 批量获取指定股票行情 |
388
-
389
- ### 搜索
390
-
391
- | 方法 | 说明 |
392
- |------|------|
393
- | `search` | 搜索股票代码/名称/拼音 |
394
-
395
- 搜索结果可配合 `generateSearchExternalLinks(result)` 生成东方财富、雪球外链。
284
+ ## 开发校验
285
+
286
+ ```bash
287
+ yarn typecheck
288
+ yarn build
289
+ yarn test
290
+ yarn test:integration:smoke # 冒烟集成(真实网络)
291
+ yarn test:integration:full # 全量集成回归
292
+ ```
396
293
 
397
294
  ---
398
295
 
@@ -402,7 +299,7 @@ Stock SDK 配套 MCP Server([stock-sdk-mcp](https://www.npmjs.com/package/stoc
402
299
 
403
300
  ---
404
301
 
405
- 🌐 [官网](https://stock-sdk.linkdiary.cn) | 📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://stock-sdk.linkdiary.cn/playground) | 🧭 [Stock Dashboard](https://chengzuopeng.github.io/stock-dashboard/) | 🐛 [Issues](https://github.com/chengzuopeng/stock-sdk/issues)
302
+ 🌐 [官网](https://stock-sdk-v2.linkdiary.cn) | 📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://stock-sdk-v2.linkdiary.cn/playground) | 🧭 [Stock Dashboard](https://chengzuopeng.github.io/stock-dashboard/) | 🐛 [Issues](https://github.com/chengzuopeng/stock-sdk/issues)
406
303
 
407
304
  ---
408
305
 
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 统一符号模型类型(v2 A1)
3
+ *
4
+ * 设计要点:
5
+ * - `string` 是一等公民,`SymbolRef` 是「带提示的 string」(其 code 也走 normalizeSymbol)
6
+ * - `NormalizedSymbol` 是 SDK 内部唯一表示,各 provider 适配器只认它
7
+ */
8
+ /** 交易区域 / 体系(GLOBAL = 海外期货/商品) */
9
+ type Market = 'CN' | 'HK' | 'US' | 'GLOBAL';
10
+ /** 资产类型 */
11
+ type AssetType = 'stock' | 'index' | 'fund' | 'bond' | 'futures' | 'option' | 'board';
12
+ /**
13
+ * 交易所 / 市场强判别字段。
14
+ * 股票:SSE/SZSE/BSE/HKEX/NASDAQ/NYSE/AMEX;
15
+ * 国内期货:SHFE/DCE/CZCE/INE/CFFEX/GFEX;海外期货:COMEX/NYMEX/CBOT/LME。
16
+ * 允许 string 兜底以容纳未来扩展。
17
+ */
18
+ type Exchange = 'SSE' | 'SZSE' | 'BSE' | 'HKEX' | 'NASDAQ' | 'NYSE' | 'AMEX' | 'US' | 'SHFE' | 'DCE' | 'CZCE' | 'INE' | 'CFFEX' | 'GFEX' | 'COMEX' | 'NYMEX' | 'CBOT' | 'LME' | (string & {});
19
+ /** 用户入参:裸 string,或「带提示的 string」对象 */
20
+ interface SymbolRef {
21
+ code: string;
22
+ market?: Market;
23
+ assetType?: AssetType;
24
+ exchange?: Exchange;
25
+ }
26
+ /** SDK 内部统一表示 */
27
+ interface NormalizedSymbol {
28
+ market: Market;
29
+ assetType: AssetType;
30
+ exchange: Exchange;
31
+ /** 纯代码,无前缀(如 '600519' / '00700' / 'AAPL' / 'IF2412') */
32
+ code: string;
33
+ /** 期货品种(如 'IF' / 'RB') */
34
+ variety?: string;
35
+ /** 原始入参,便于报错与调试 */
36
+ input: string;
37
+ }
38
+ /** API 接受的符号入参类型 */
39
+ type SymbolInput = string | SymbolRef;
40
+
41
+ declare function normalizeSymbol(input: SymbolInput, hint?: Partial<SymbolRef>): NormalizedSymbol;
42
+
43
+ /**
44
+ * Provider 符号适配器:NormalizedSymbol → 各数据源原生格式(纯函数)
45
+ *
46
+ * 仅覆盖股票/指数/基金/板块这类有明确 secid 体系的资产;期货/期权的 secid
47
+ * 体系不同(且由各自 provider 内联处理),这里对它们显式抛错而非静默兜底,
48
+ * 避免把海外期货误拼成美股 secid(105.xxx)这类隐蔽错误。
49
+ */
50
+
51
+ /**
52
+ * → 腾讯行情格式:sh600519 / sz000001 / bj920819 / hk00700 / usAAPL
53
+ */
54
+ declare function toTencentSymbol(ns: NormalizedSymbol): string;
55
+ /**
56
+ * → 东财 secid:1.600519 / 0.000001 / 116.00700 / 105.AAPL / 90.BK0475(板块)
57
+ */
58
+ declare function toEastmoneySecid(ns: NormalizedSymbol): string;
59
+ /** → 纯代码(去前缀) */
60
+ declare function toPlainCode(ns: NormalizedSymbol): string;
61
+
62
+ export { type AssetType as A, type Exchange as E, type Market as M, type NormalizedSymbol as N, type SymbolRef as S, type SymbolInput as a, toEastmoneySecid as b, toPlainCode as c, normalizeSymbol as n, toTencentSymbol as t };