stock-sdk 2.2.2 → 2.4.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 +7 -2
  2. package/dist/{adapters-BiH4keVd.d.cts → adapters-CZUNRbxi.d.cts} +29 -1
  3. package/dist/{adapters-BiH4keVd.d.ts → adapters-CZUNRbxi.d.ts} +29 -1
  4. package/dist/cache.cjs +1 -1
  5. package/dist/cache.d.cts +35 -3
  6. package/dist/cache.d.ts +35 -3
  7. package/dist/cache.js +1 -1
  8. package/dist/chip-BbA23rr1.d.cts +113 -0
  9. package/dist/chip-BbA23rr1.d.ts +113 -0
  10. package/dist/chunk-46ECBWOQ.cjs +1 -0
  11. package/dist/chunk-4RN7AVFQ.js +1 -0
  12. package/dist/chunk-6FZNYDNN.cjs +1 -0
  13. package/dist/chunk-6MCPZDKN.cjs +1 -0
  14. package/dist/chunk-H5FDXQRK.js +1 -0
  15. package/dist/chunk-HKREKO2F.js +1 -0
  16. package/dist/chunk-LDYRNH4X.cjs +1 -0
  17. package/dist/chunk-OPCBE3NR.js +1 -0
  18. package/dist/chunk-R7M3BHS4.cjs +1 -0
  19. package/dist/chunk-SMCYQ6NL.js +1 -0
  20. package/dist/chunk-USZUOBM2.cjs +1 -0
  21. package/dist/chunk-VKXPLWPL.js +1 -0
  22. package/dist/chunk-W625VPPB.js +1 -0
  23. package/dist/chunk-WJOFTWZL.cjs +1 -0
  24. package/dist/cli.cjs +16 -16
  25. package/dist/cli.js +16 -16
  26. package/dist/index.cjs +1 -1
  27. package/dist/index.d.cts +24 -7
  28. package/dist/index.d.ts +24 -7
  29. package/dist/index.js +1 -1
  30. package/dist/indicators.cjs +1 -1
  31. package/dist/indicators.d.cts +1 -0
  32. package/dist/indicators.d.ts +1 -0
  33. package/dist/indicators.js +1 -1
  34. package/dist/mcp.cjs +83 -5
  35. package/dist/mcp.d.cts +29 -2
  36. package/dist/mcp.d.ts +29 -2
  37. package/dist/mcp.js +83 -5
  38. package/dist/screener.cjs +1 -1
  39. package/dist/screener.d.cts +51 -16
  40. package/dist/screener.d.ts +51 -16
  41. package/dist/screener.js +1 -1
  42. package/dist/{sdk-CmYFd7V2.d.ts → sdk-DGgSDZRx.d.ts} +200 -21
  43. package/dist/{sdk-BOfyUDzu.d.cts → sdk-RzQ-drS4.d.cts} +200 -21
  44. package/dist/signals.d.cts +3 -42
  45. package/dist/signals.d.ts +3 -42
  46. package/dist/symbols.cjs +1 -1
  47. package/dist/symbols.d.cts +2 -2
  48. package/dist/symbols.d.ts +2 -2
  49. package/dist/symbols.js +1 -1
  50. package/dist/types-7n5rSHbd.d.cts +42 -0
  51. package/dist/types-7n5rSHbd.d.ts +42 -0
  52. package/package.json +2 -1
  53. package/dist/chunk-3VUFYFFD.js +0 -1
  54. package/dist/chunk-6ZSZEHZW.js +0 -1
  55. package/dist/chunk-C4CA7QBB.cjs +0 -1
  56. package/dist/chunk-DU7MCVLJ.js +0 -1
  57. package/dist/chunk-EDUJJOAJ.js +0 -1
  58. package/dist/chunk-F3KZXCVO.js +0 -1
  59. package/dist/chunk-JP3ZPNWP.cjs +0 -1
  60. package/dist/chunk-KKGWFS2M.cjs +0 -1
  61. package/dist/chunk-LCX5Q36O.js +0 -1
  62. package/dist/chunk-T5CH7H3X.cjs +0 -1
  63. package/dist/chunk-TVIEKKDQ.cjs +0 -1
  64. package/dist/chunk-USK6JHLG.cjs +0 -1
  65. package/dist/chunk-WCBK5KYA.cjs +0 -1
  66. package/dist/chunk-ZZ2IBUMV.js +0 -1
package/README.md CHANGED
@@ -61,6 +61,7 @@
61
61
  - ✅ **统一符号模型**:`string` 一等公民,`sh600519` / `600519` / `600519.SH` / `00700` / `hk00700` / `AAPL` / `105.AAPL` 等写法容错解析;支持中证等特殊指数(`930955` / `H30533` / `HSHCI` / `GDAXI`,[详见符号指南](https://stock-sdk.linkdiary.cn/guide/symbols.html))
62
62
  - ✅ **A 股 / 港股 / 美股 / 公募基金**实时行情、历史 K 线(日/周/月)、分钟 K 线(1/5/15/30/60)、当日分时
63
63
  - ✅ **技术指标**:MA / MACD / BOLL / KDJ / RSI / WR / BIAS / CCI / ATR / OBV / ROC / DMI / SAR / KC
64
+ - ✅ **筹码分布(CYQ)**:`sdk.chips.cn/hk/us` 获利比例 / 平均成本 / 90-70 成本区间与集中度 / 筹码峰直方图(东财算法本地计算,零新增数据源)
64
65
  - ✅ **信号 / 选股 / 回测**:`calcSignals`(金叉死叉/超买超卖等事件识别)、链式选股器、本地回测
65
66
  - ✅ **期货 / 期权 / 资金流 / 龙虎榜 / 北向 / 大宗交易 / 融资融券 / 涨停板** 等全套扩展数据
66
67
  - ✅ **基金深度数据**:历史净值、实时估值、同类排名走势、基金/ETF 分红送配、**主题基金**
@@ -154,6 +155,8 @@ npx stock-sdk mcp
154
155
 
155
156
  环境变量 `STOCK_SDK_MCP_TOOLS=core|full|<逗号分隔工具名>` 控制工具集范围(默认 `core`)。
156
157
 
158
+ 除工具外还内置 **7 个场景化 AI Skills**(MCP Prompts,如 `analyze_stock` / `screen_stocks` / `diagnose_stock`),支持的客户端可一键触发;`STOCK_SDK_MCP_PROMPTS=core|full|<名单>` 控制技能集(默认 `core`)。详见 [AI Skills 文档](https://stock-sdk.linkdiary.cn/skills/)。
159
+
157
160
  👉 [完整 MCP 文档](https://stock-sdk.linkdiary.cn/mcp/)
158
161
 
159
162
  ---
@@ -241,6 +244,7 @@ import { SdkError, isSdkError, getSdkErrorCode } from 'stock-sdk/errors';
241
244
  | 实时行情 | ✅ | ✅ | ✅ | ✅ | ✅ 全球期货 | ✅ ETF / 中金所 / 商品 |
242
245
  | 历史 K 线(日/周/月) | ✅ | ✅ | ✅ | ⚠️ 场内 ETF/LOF | ✅ 国内 + 全球 | ✅ |
243
246
  | 分钟 K 线(5/15/30/60) | ✅ | ✅ `kline.hkMinute` | ✅ `kline.usMinute` | ⚠️ 场内 ETF/LOF | ❌ | ❌ |
247
+ | 筹码分布(CYQ) | ✅ `chips.cn` | ✅ `chips.hk` | ✅ `chips.us` | — | — | — |
244
248
  | 当日分时(1 分钟) | ✅ `quotes.timeline` | ✅ `kline.hkMinute`(period='1') | ✅ `kline.usMinute`(period='1') | ⚠️ 场内 ETF/LOF | ❌ | ✅ ETF 期权 |
245
249
  | 分红派送 | ✅ | ❌ | ❌ | ✅ 基金 + ETF | — | — |
246
250
  | 资金流向 | ✅ 个股/大盘/排名/板块 | ❌ | ❌ | — | — | — |
@@ -266,13 +270,14 @@ import { SdkError, isSdkError, getSdkErrorCode } from 'stock-sdk/errors';
266
270
  | `sdk.quotes` | `.cn` / `.cnSimple` / `.hk` / `.us` / `.fund` / `.fundFlow` / `.largeOrder` / `.timeline` |
267
271
  | `sdk.codes` | `.cn` / `.us` / `.hk` / `.fund` |
268
272
  | `sdk.batch` | `.cn` / `.hk` / `.us` / `.byCodes` / `.raw` |
269
- | `sdk.kline` | `.cn` / `.cnMinute` / `.hk` / `.hkMinute` / `.us` / `.usMinute` / `.withIndicators` |
273
+ | `sdk.kline` | `.cn` / `.cnMinute` / `.hk` / `.hkMinute` / `.us` / `.usMinute` / `.withIndicators` / `.signals` |
274
+ | `sdk.chips` | `.cn` / `.hk` / `.us`(筹码分布:获利比例 / 平均成本 / 成本区间 / 筹码峰) |
270
275
  | `sdk.board` | `.industry.*` / `.concept.*`(`list` / `spot` / `constituents` / `kline` / `minuteKline`) |
271
276
  | `sdk.options` | `.index.*` / `.etf.*` / `.commodity.*` / `.cffex.*` / `.lhb` |
272
277
  | `sdk.futures` | `.kline` / `.globalSpot` / `.globalKline` / `.inventory` / `.comexInventory` … |
273
278
  | `sdk.fundFlow` | `.individual` / `.market` / `.rank` / `.sectorRank` / `.sectorHistory` |
274
279
  | `sdk.northbound` | `.minute` / `.summary` / `.holdingRank` / `.history` / `.individual` |
275
- | `sdk.marketEvent` | `.ztPool` / `.stockChanges` / `.boardChanges` |
280
+ | `sdk.marketEvent` | `.ztPool` / `.stockChanges`(支持多类型 / `'all'`) / `.boardChanges` / `.individualChanges` / `.individualChangesHistory`(个股异动) |
276
281
  | `sdk.dragonTiger` | `.detail` / `.stockStats` / `.institution` / `.branchRank` / `.seatDetail` |
277
282
  | `sdk.blockTrade` / `sdk.margin` | 大宗交易 / 融资融券 |
278
283
  | `sdk.fund` | `.dividendList` / `.navHistory` / `.estimate` / `.rankHistory` / `.theme` |
@@ -74,5 +74,33 @@ declare function toTencentSymbol(ns: NormalizedSymbol): string;
74
74
  declare function toEastmoneySecid(ns: NormalizedSymbol): string;
75
75
  /** → 纯代码(去前缀) */
76
76
  declare function toPlainCode(ns: NormalizedSymbol): string;
77
+ /** {@link tryToTencentSymbols} 的归一结果。 */
78
+ interface TencentSymbolBatch {
79
+ /** 成功映射的腾讯行情键(按输入顺序,跳过失败项) */
80
+ keys: string[];
81
+ /** 无法映射的输入(非法格式 / 腾讯无该市场映射,如 CSI 特殊指数码 930955) */
82
+ invalid: Array<{
83
+ code: string;
84
+ reason: string;
85
+ }>;
86
+ }
87
+ /**
88
+ * 行情入口批量容错归一(R7-2/R7-3):
89
+ * - market:'CN':`'600036'`→`'sh600036'`、`'SH600519'`→`'sh600519'`
90
+ * - market:'HK':`'00700'`/`'hk00700'`/`'700'`→`'hk00700'`
91
+ * - market:'US':`'BABA'`/`'usAAPL'`→`'usBABA'`/`'usAAPL'`
92
+ *
93
+ * 【设计决策:逐码容错,不整批抛错】单个代码失败只跳过该码——与行情
94
+ * 解析侧"无匹配行静默丢弃"的既有语义对齐。理由:
95
+ * - batch.* 全市场扫描把上游代码表整表灌进来(~5600 码/次),一条脏数据
96
+ * 不应废掉整批已完成的网络请求;
97
+ * - SDK 自身支持的特殊指数码(930955/HSHCI 等)在 symbols 层合法但腾讯
98
+ * 无行情映射(toTencentSymbol 对 CSI 抛错)——这类输入应"跳过"而非
99
+ * 炸掉整个调用。
100
+ *
101
+ * 注意示例按 market 而异:`'00700'` 仅在 market:'HK' 下映射为 `hk00700`,
102
+ * 在 market:'CN' 下按 A 股推断为 `sz00700`(无此标的,行情侧自然无匹配)。
103
+ */
104
+ declare function tryToTencentSymbols(codes: string[], market: 'CN' | 'HK' | 'US'): TencentSymbolBatch;
77
105
 
78
- 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, EXCHANGE_TO_SECID_PREFIX as d, marketOf as m, normalizeSymbol as n, toTencentSymbol as t };
106
+ export { type AssetType as A, type Exchange as E, type Market as M, type NormalizedSymbol as N, type SymbolRef as S, type TencentSymbolBatch as T, type SymbolInput as a, toEastmoneySecid as b, toPlainCode as c, tryToTencentSymbols as d, EXCHANGE_TO_SECID_PREFIX as e, marketOf as m, normalizeSymbol as n, toTencentSymbol as t };
@@ -74,5 +74,33 @@ declare function toTencentSymbol(ns: NormalizedSymbol): string;
74
74
  declare function toEastmoneySecid(ns: NormalizedSymbol): string;
75
75
  /** → 纯代码(去前缀) */
76
76
  declare function toPlainCode(ns: NormalizedSymbol): string;
77
+ /** {@link tryToTencentSymbols} 的归一结果。 */
78
+ interface TencentSymbolBatch {
79
+ /** 成功映射的腾讯行情键(按输入顺序,跳过失败项) */
80
+ keys: string[];
81
+ /** 无法映射的输入(非法格式 / 腾讯无该市场映射,如 CSI 特殊指数码 930955) */
82
+ invalid: Array<{
83
+ code: string;
84
+ reason: string;
85
+ }>;
86
+ }
87
+ /**
88
+ * 行情入口批量容错归一(R7-2/R7-3):
89
+ * - market:'CN':`'600036'`→`'sh600036'`、`'SH600519'`→`'sh600519'`
90
+ * - market:'HK':`'00700'`/`'hk00700'`/`'700'`→`'hk00700'`
91
+ * - market:'US':`'BABA'`/`'usAAPL'`→`'usBABA'`/`'usAAPL'`
92
+ *
93
+ * 【设计决策:逐码容错,不整批抛错】单个代码失败只跳过该码——与行情
94
+ * 解析侧"无匹配行静默丢弃"的既有语义对齐。理由:
95
+ * - batch.* 全市场扫描把上游代码表整表灌进来(~5600 码/次),一条脏数据
96
+ * 不应废掉整批已完成的网络请求;
97
+ * - SDK 自身支持的特殊指数码(930955/HSHCI 等)在 symbols 层合法但腾讯
98
+ * 无行情映射(toTencentSymbol 对 CSI 抛错)——这类输入应"跳过"而非
99
+ * 炸掉整个调用。
100
+ *
101
+ * 注意示例按 market 而异:`'00700'` 仅在 market:'HK' 下映射为 `hk00700`,
102
+ * 在 market:'CN' 下按 A 股推断为 `sz00700`(无此标的,行情侧自然无匹配)。
103
+ */
104
+ declare function tryToTencentSymbols(codes: string[], market: 'CN' | 'HK' | 'US'): TencentSymbolBatch;
77
105
 
78
- 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, EXCHANGE_TO_SECID_PREFIX as d, marketOf as m, normalizeSymbol as n, toTencentSymbol as t };
106
+ export { type AssetType as A, type Exchange as E, type Market as M, type NormalizedSymbol as N, type SymbolRef as S, type TencentSymbolBatch as T, type SymbolInput as a, toEastmoneySecid as b, toPlainCode as c, tryToTencentSymbols as d, EXCHANGE_TO_SECID_PREFIX as e, marketOf as m, normalizeSymbol as n, toTencentSymbol as t };
package/dist/cache.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkWCBK5KYAcjs = require('./chunk-WCBK5KYA.cjs');var _chunkTVIEKKDQcjs = require('./chunk-TVIEKKDQ.cjs');require('./chunk-4VDLQK6F.cjs');exports.MemoryCache = _chunkTVIEKKDQcjs.a; exports.MemoryCacheStore = _chunkWCBK5KYAcjs.a; exports.cacheThrough = _chunkWCBK5KYAcjs.b; exports.clearSharedCaches = _chunkTVIEKKDQcjs.c; exports.createCacheKey = _chunkTVIEKKDQcjs.d; exports.getSharedCache = _chunkTVIEKKDQcjs.b;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk6FZNYDNNcjs = require('./chunk-6FZNYDNN.cjs');var _chunk6MCPZDKNcjs = require('./chunk-6MCPZDKN.cjs');require('./chunk-4VDLQK6F.cjs');exports.MemoryCache = _chunk6MCPZDKNcjs.a; exports.MemoryCacheStore = _chunk6FZNYDNNcjs.a; exports.cacheThrough = _chunk6FZNYDNNcjs.b; exports.clearClientScopedCaches = _chunk6MCPZDKNcjs.f; exports.clearSharedCaches = _chunk6MCPZDKNcjs.d; exports.configureSharedCache = _chunk6MCPZDKNcjs.c; exports.createCacheKey = _chunk6MCPZDKNcjs.g; exports.getSharedCache = _chunk6MCPZDKNcjs.b;
package/dist/cache.d.cts CHANGED
@@ -61,6 +61,14 @@ declare class MemoryCache<T = unknown> {
61
61
  * 淘汰最久未访问的缓存(LRU)
62
62
  */
63
63
  private evictLRU;
64
+ /** options 浅等价(defaultTTL / maxSize,与构造默认值对齐后比较) */
65
+ matchesOptions(options: CacheOptions): boolean;
66
+ /**
67
+ * 运行时重配(R7-13,配合 {@link configureSharedCache})。
68
+ * 新 defaultTTL 只影响后续 set(已存条目的 expireAt 不回溯改写);
69
+ * maxSize 调小时立即淘汰至达标。
70
+ */
71
+ configure(options: CacheOptions): void;
64
72
  /**
65
73
  * 带缓存的异步获取
66
74
  * 如果缓存存在则返回缓存,否则执行 fetcher 并缓存结果
@@ -68,13 +76,37 @@ declare class MemoryCache<T = unknown> {
68
76
  getOrFetch(key: string, fetcher: () => Promise<T>, ttl?: number): Promise<T>;
69
77
  }
70
78
  /**
71
- * 获取具名共享缓存
79
+ * 获取具名共享缓存。
80
+ *
81
+ * **first-caller-wins**:`options` 仅在 namespace 首次创建时生效;命中已存在
82
+ * 的 namespace 时 options 被忽略(与现行配置不等价时警告一次),如需运行时
83
+ * 调整请用 {@link configureSharedCache}。
72
84
  */
73
85
  declare function getSharedCache<T = unknown>(namespace: string, options?: CacheOptions): MemoryCache<T>;
74
86
  /**
75
- * 清空所有共享缓存
87
+ * 显式重配已存在的共享缓存(R7-13);namespace 不存在返回 `false`。
88
+ * 语义见 {@link MemoryCache.configure}。
89
+ */
90
+ declare function configureSharedCache(namespace: string, options: CacheOptions): boolean;
91
+ /**
92
+ * 清空所有**共享**缓存。
93
+ *
94
+ * ⚠️ v2.4.0 起不覆盖实例级缓存:代码表 / 交易日历 / 板块映射 / us-secid
95
+ * 已迁移为按 client 隔离(R7-11),强刷它们请用 `StockSDK.clearCaches()`。
76
96
  */
77
97
  declare function clearSharedCaches(): void;
98
+ /**
99
+ * 清空某 client 的全部作用域缓存(测试 teardown / 手动强制失效用;
100
+ * 面向 SDK 用户的入口是 `StockSDK.clearCaches()`;不经 StockSDK、直接以
101
+ * 自建 RequestClient 调 provider 函数的用户,从 `stock-sdk/cache` 导入本函数
102
+ * 传入该 client 即可 —— v2.4.0 起代码表/日历/板块映射迁到实例级后,
103
+ * `clearSharedCaches()` 不再覆盖它们。
104
+ *
105
+ * 已知残留:清空瞬间仍在途的 getOrFetch 解析完成后会写进被丢弃的旧缓存
106
+ * 实例(无害,首次新调用会重新解析),清空窗口内的"强制重解析"对该 key
107
+ * 可能晚一拍生效。
108
+ */
109
+ declare function clearClientScopedCaches(client: object): void;
78
110
  /**
79
111
  * 生成缓存键的辅助函数
80
112
  */
@@ -123,4 +155,4 @@ declare class MemoryCacheStore implements CacheStore {
123
155
  */
124
156
  declare function cacheThrough<T>(store: CacheStore, key: string, fetcher: () => Promise<T>, ttl?: number): Promise<T>;
125
157
 
126
- export { type CacheOptions, type CacheStore, type MaybePromise, MemoryCache, MemoryCacheStore, cacheThrough, clearSharedCaches, createCacheKey, getSharedCache };
158
+ export { type CacheOptions, type CacheStore, type MaybePromise, MemoryCache, MemoryCacheStore, cacheThrough, clearClientScopedCaches, clearSharedCaches, configureSharedCache, createCacheKey, getSharedCache };
package/dist/cache.d.ts CHANGED
@@ -61,6 +61,14 @@ declare class MemoryCache<T = unknown> {
61
61
  * 淘汰最久未访问的缓存(LRU)
62
62
  */
63
63
  private evictLRU;
64
+ /** options 浅等价(defaultTTL / maxSize,与构造默认值对齐后比较) */
65
+ matchesOptions(options: CacheOptions): boolean;
66
+ /**
67
+ * 运行时重配(R7-13,配合 {@link configureSharedCache})。
68
+ * 新 defaultTTL 只影响后续 set(已存条目的 expireAt 不回溯改写);
69
+ * maxSize 调小时立即淘汰至达标。
70
+ */
71
+ configure(options: CacheOptions): void;
64
72
  /**
65
73
  * 带缓存的异步获取
66
74
  * 如果缓存存在则返回缓存,否则执行 fetcher 并缓存结果
@@ -68,13 +76,37 @@ declare class MemoryCache<T = unknown> {
68
76
  getOrFetch(key: string, fetcher: () => Promise<T>, ttl?: number): Promise<T>;
69
77
  }
70
78
  /**
71
- * 获取具名共享缓存
79
+ * 获取具名共享缓存。
80
+ *
81
+ * **first-caller-wins**:`options` 仅在 namespace 首次创建时生效;命中已存在
82
+ * 的 namespace 时 options 被忽略(与现行配置不等价时警告一次),如需运行时
83
+ * 调整请用 {@link configureSharedCache}。
72
84
  */
73
85
  declare function getSharedCache<T = unknown>(namespace: string, options?: CacheOptions): MemoryCache<T>;
74
86
  /**
75
- * 清空所有共享缓存
87
+ * 显式重配已存在的共享缓存(R7-13);namespace 不存在返回 `false`。
88
+ * 语义见 {@link MemoryCache.configure}。
89
+ */
90
+ declare function configureSharedCache(namespace: string, options: CacheOptions): boolean;
91
+ /**
92
+ * 清空所有**共享**缓存。
93
+ *
94
+ * ⚠️ v2.4.0 起不覆盖实例级缓存:代码表 / 交易日历 / 板块映射 / us-secid
95
+ * 已迁移为按 client 隔离(R7-11),强刷它们请用 `StockSDK.clearCaches()`。
76
96
  */
77
97
  declare function clearSharedCaches(): void;
98
+ /**
99
+ * 清空某 client 的全部作用域缓存(测试 teardown / 手动强制失效用;
100
+ * 面向 SDK 用户的入口是 `StockSDK.clearCaches()`;不经 StockSDK、直接以
101
+ * 自建 RequestClient 调 provider 函数的用户,从 `stock-sdk/cache` 导入本函数
102
+ * 传入该 client 即可 —— v2.4.0 起代码表/日历/板块映射迁到实例级后,
103
+ * `clearSharedCaches()` 不再覆盖它们。
104
+ *
105
+ * 已知残留:清空瞬间仍在途的 getOrFetch 解析完成后会写进被丢弃的旧缓存
106
+ * 实例(无害,首次新调用会重新解析),清空窗口内的"强制重解析"对该 key
107
+ * 可能晚一拍生效。
108
+ */
109
+ declare function clearClientScopedCaches(client: object): void;
78
110
  /**
79
111
  * 生成缓存键的辅助函数
80
112
  */
@@ -123,4 +155,4 @@ declare class MemoryCacheStore implements CacheStore {
123
155
  */
124
156
  declare function cacheThrough<T>(store: CacheStore, key: string, fetcher: () => Promise<T>, ttl?: number): Promise<T>;
125
157
 
126
- export { type CacheOptions, type CacheStore, type MaybePromise, MemoryCache, MemoryCacheStore, cacheThrough, clearSharedCaches, createCacheKey, getSharedCache };
158
+ export { type CacheOptions, type CacheStore, type MaybePromise, MemoryCache, MemoryCacheStore, cacheThrough, clearClientScopedCaches, clearSharedCaches, configureSharedCache, createCacheKey, getSharedCache };
package/dist/cache.js CHANGED
@@ -1 +1 @@
1
- import{a as e,b as f}from"./chunk-F3KZXCVO.js";import{a,b,c,d}from"./chunk-DU7MCVLJ.js";import"./chunk-WOT6VMZA.js";export{a as MemoryCache,e as MemoryCacheStore,f as cacheThrough,c as clearSharedCaches,d as createCacheKey,b as getSharedCache};
1
+ import{a as g,b as h}from"./chunk-VKXPLWPL.js";import{a,b,c,d,f as e,g as f}from"./chunk-SMCYQ6NL.js";import"./chunk-WOT6VMZA.js";export{a as MemoryCache,g as MemoryCacheStore,h as cacheThrough,e as clearClientScopedCaches,d as clearSharedCaches,c as configureSharedCache,f as createCacheKey,b as getSharedCache};
@@ -0,0 +1,113 @@
1
+ /**
2
+ * 筹码计算所需的最小 K 线形状:SDK 的 A 股 / 港股 / 美股历史日 K 线
3
+ * (`HistoryKline` / `HKHistoryKline` / `USHistoryKline`)均满足。
4
+ */
5
+ interface ChipKlineLike {
6
+ /** 日期 YYYY-MM-DD(或任意可标识该 bar 的字符串,原样透传到输出行) */
7
+ date: string;
8
+ /** 开盘价 */
9
+ open: number | null;
10
+ /** 最高价 */
11
+ high: number | null;
12
+ /** 最低价 */
13
+ low: number | null;
14
+ /** 收盘价 */
15
+ close: number | null;
16
+ /** 换手率 % */
17
+ turnoverRate: number | null;
18
+ }
19
+ /**
20
+ * 筹码峰直方图(单日分布形状)
21
+ */
22
+ interface ChipHistogram {
23
+ /** 价格档(150 档,低 → 高,已按原算法保留 2 位小数) */
24
+ prices: number[];
25
+ /** 各价格档筹码占比(0..1,总和 ≈ 1;按 6 位小数舍入) */
26
+ ratios: number[];
27
+ }
28
+ /**
29
+ * `calcChipDistribution` 配置
30
+ */
31
+ interface ChipDistributionOptions {
32
+ /**
33
+ * 分布回看窗口(根)。每日分布只由最近 `range` 根 K 线推演。
34
+ *
35
+ * - `120`(默认):与东财 App / 网页筹码分布的显示口径一致;
36
+ * - `0`:从序列首根全量累计(akshare `stock_cyq_em` 的口径)。
37
+ * 注意该模式下每行成本为 O(序列长度),长序列请配合 {@link tail}。
38
+ *
39
+ * @default 120
40
+ */
41
+ range?: number;
42
+ /**
43
+ * 仅对输入序列**最后 `tail` 根**产出统计行(输出长度 = min(tail, 输入长度))。
44
+ * 前面的 bar 仍参与分布推演,只是不生成输出行 —— 用于「取足暖机数据、
45
+ * 只要尾部结果」的场景,避免 `range: 0` + 长序列时的 O(N²) 全量计算。
46
+ * 不传时对每根输入 bar 都产出统计行;`tail <= 0` 或 `NaN` 输出空数组,
47
+ * 非整数向下取整,`Infinity` 等价于不传(输出全部行)。
48
+ */
49
+ tail?: number;
50
+ /**
51
+ * 是否在输出行上附带筹码峰直方图:
52
+ * - `false`(默认):不附带;
53
+ * - `'last'` 或 `true`:仅最后一行附带(看「当前筹码峰」的常见场景);
54
+ * - `'all'`:每行都附带(数据量为 每行 150 档 × 2 数组,注意体积)。
55
+ *
56
+ * @default false
57
+ */
58
+ includeHistogram?: boolean | 'last' | 'all';
59
+ /**
60
+ * 比例类字段(获利比例 / 集中度)的输出舍入小数位。
61
+ * 价格类字段(平均成本 / 90-70 成本区间)固定 2 位小数(原算法口径),不受此项影响。
62
+ *
63
+ * @default 3
64
+ */
65
+ decimals?: number;
66
+ }
67
+ /**
68
+ * 单日筹码分布统计(字段口径与 akshare `stock_cyq_em` 输出对齐)
69
+ */
70
+ interface ChipDistributionItem {
71
+ /** 日期(透传输入 bar 的 date) */
72
+ date: string;
73
+ /** 获利比例 0..1(收盘价之下的筹码占比);收盘价缺失或分布退化时为 null */
74
+ profitRatio: number | null;
75
+ /** 平均成本(元,累计 50% 筹码处的价格,即中位数成本 —— 东财「平均成本」口径) */
76
+ avgCost: number | null;
77
+ /** 90% 筹码成本区间下沿(元) */
78
+ cost90Low: number | null;
79
+ /** 90% 筹码成本区间上沿(元) */
80
+ cost90High: number | null;
81
+ /** 90% 筹码集中度 (高-低)/(高+低) */
82
+ concentration90: number | null;
83
+ /** 70% 筹码成本区间下沿(元) */
84
+ cost70Low: number | null;
85
+ /** 70% 筹码成本区间上沿(元) */
86
+ cost70High: number | null;
87
+ /** 70% 筹码集中度 */
88
+ concentration70: number | null;
89
+ /** 筹码峰直方图(按 includeHistogram 配置附带) */
90
+ histogram?: ChipHistogram;
91
+ }
92
+ /**
93
+ * 计算筹码分布(纯函数,零网络)。
94
+ *
95
+ * 输入通常为**日 K 线**(需含换手率;SDK 的 `kline.cn` / `kline.hk` / `kline.us`
96
+ * 返回值可直接使用)。对输入的每根 bar(或 `tail` 限定的尾部)输出一行统计。
97
+ *
98
+ * 口径说明:
99
+ * - `range` 默认 120(东财 App 显示口径);`range: 0` 为 akshare 全量累计口径,
100
+ * 两者数值不同,对拍 akshare 输出时请显式传 `range: 0`;
101
+ * - 复权方式由调用方在取 K 线时决定,分布数值随复权口径变化;
102
+ * - 换手率缺失(null)的 bar 按 0 换手处理(沿用东财 `hsl/100 || 0` 语义);
103
+ * OHLC 含 null 的脏行整体跳过,不贡献分布;
104
+ * - 窗口内累计换手极低(如长期停牌 / 仙股)时分布主要由窗口首日堆叠决定,
105
+ * 参考价值有限;指数 / 无换手率概念的品种不适用本模型。
106
+ *
107
+ * @param klines - K 线序列(按时间升序)
108
+ * @param options - 见 {@link ChipDistributionOptions}
109
+ * @returns 每日筹码分布统计(与输入尾部 bar 一一对应)
110
+ */
111
+ declare function calcChipDistribution(klines: ChipKlineLike[], options?: ChipDistributionOptions): ChipDistributionItem[];
112
+
113
+ export { type ChipKlineLike as C, type ChipHistogram as a, type ChipDistributionOptions as b, calcChipDistribution as c, type ChipDistributionItem as d };
@@ -0,0 +1,113 @@
1
+ /**
2
+ * 筹码计算所需的最小 K 线形状:SDK 的 A 股 / 港股 / 美股历史日 K 线
3
+ * (`HistoryKline` / `HKHistoryKline` / `USHistoryKline`)均满足。
4
+ */
5
+ interface ChipKlineLike {
6
+ /** 日期 YYYY-MM-DD(或任意可标识该 bar 的字符串,原样透传到输出行) */
7
+ date: string;
8
+ /** 开盘价 */
9
+ open: number | null;
10
+ /** 最高价 */
11
+ high: number | null;
12
+ /** 最低价 */
13
+ low: number | null;
14
+ /** 收盘价 */
15
+ close: number | null;
16
+ /** 换手率 % */
17
+ turnoverRate: number | null;
18
+ }
19
+ /**
20
+ * 筹码峰直方图(单日分布形状)
21
+ */
22
+ interface ChipHistogram {
23
+ /** 价格档(150 档,低 → 高,已按原算法保留 2 位小数) */
24
+ prices: number[];
25
+ /** 各价格档筹码占比(0..1,总和 ≈ 1;按 6 位小数舍入) */
26
+ ratios: number[];
27
+ }
28
+ /**
29
+ * `calcChipDistribution` 配置
30
+ */
31
+ interface ChipDistributionOptions {
32
+ /**
33
+ * 分布回看窗口(根)。每日分布只由最近 `range` 根 K 线推演。
34
+ *
35
+ * - `120`(默认):与东财 App / 网页筹码分布的显示口径一致;
36
+ * - `0`:从序列首根全量累计(akshare `stock_cyq_em` 的口径)。
37
+ * 注意该模式下每行成本为 O(序列长度),长序列请配合 {@link tail}。
38
+ *
39
+ * @default 120
40
+ */
41
+ range?: number;
42
+ /**
43
+ * 仅对输入序列**最后 `tail` 根**产出统计行(输出长度 = min(tail, 输入长度))。
44
+ * 前面的 bar 仍参与分布推演,只是不生成输出行 —— 用于「取足暖机数据、
45
+ * 只要尾部结果」的场景,避免 `range: 0` + 长序列时的 O(N²) 全量计算。
46
+ * 不传时对每根输入 bar 都产出统计行;`tail <= 0` 或 `NaN` 输出空数组,
47
+ * 非整数向下取整,`Infinity` 等价于不传(输出全部行)。
48
+ */
49
+ tail?: number;
50
+ /**
51
+ * 是否在输出行上附带筹码峰直方图:
52
+ * - `false`(默认):不附带;
53
+ * - `'last'` 或 `true`:仅最后一行附带(看「当前筹码峰」的常见场景);
54
+ * - `'all'`:每行都附带(数据量为 每行 150 档 × 2 数组,注意体积)。
55
+ *
56
+ * @default false
57
+ */
58
+ includeHistogram?: boolean | 'last' | 'all';
59
+ /**
60
+ * 比例类字段(获利比例 / 集中度)的输出舍入小数位。
61
+ * 价格类字段(平均成本 / 90-70 成本区间)固定 2 位小数(原算法口径),不受此项影响。
62
+ *
63
+ * @default 3
64
+ */
65
+ decimals?: number;
66
+ }
67
+ /**
68
+ * 单日筹码分布统计(字段口径与 akshare `stock_cyq_em` 输出对齐)
69
+ */
70
+ interface ChipDistributionItem {
71
+ /** 日期(透传输入 bar 的 date) */
72
+ date: string;
73
+ /** 获利比例 0..1(收盘价之下的筹码占比);收盘价缺失或分布退化时为 null */
74
+ profitRatio: number | null;
75
+ /** 平均成本(元,累计 50% 筹码处的价格,即中位数成本 —— 东财「平均成本」口径) */
76
+ avgCost: number | null;
77
+ /** 90% 筹码成本区间下沿(元) */
78
+ cost90Low: number | null;
79
+ /** 90% 筹码成本区间上沿(元) */
80
+ cost90High: number | null;
81
+ /** 90% 筹码集中度 (高-低)/(高+低) */
82
+ concentration90: number | null;
83
+ /** 70% 筹码成本区间下沿(元) */
84
+ cost70Low: number | null;
85
+ /** 70% 筹码成本区间上沿(元) */
86
+ cost70High: number | null;
87
+ /** 70% 筹码集中度 */
88
+ concentration70: number | null;
89
+ /** 筹码峰直方图(按 includeHistogram 配置附带) */
90
+ histogram?: ChipHistogram;
91
+ }
92
+ /**
93
+ * 计算筹码分布(纯函数,零网络)。
94
+ *
95
+ * 输入通常为**日 K 线**(需含换手率;SDK 的 `kline.cn` / `kline.hk` / `kline.us`
96
+ * 返回值可直接使用)。对输入的每根 bar(或 `tail` 限定的尾部)输出一行统计。
97
+ *
98
+ * 口径说明:
99
+ * - `range` 默认 120(东财 App 显示口径);`range: 0` 为 akshare 全量累计口径,
100
+ * 两者数值不同,对拍 akshare 输出时请显式传 `range: 0`;
101
+ * - 复权方式由调用方在取 K 线时决定,分布数值随复权口径变化;
102
+ * - 换手率缺失(null)的 bar 按 0 换手处理(沿用东财 `hsl/100 || 0` 语义);
103
+ * OHLC 含 null 的脏行整体跳过,不贡献分布;
104
+ * - 窗口内累计换手极低(如长期停牌 / 仙股)时分布主要由窗口首日堆叠决定,
105
+ * 参考价值有限;指数 / 无换手率概念的品种不适用本模型。
106
+ *
107
+ * @param klines - K 线序列(按时间升序)
108
+ * @param options - 见 {@link ChipDistributionOptions}
109
+ * @returns 每日筹码分布统计(与输入尾部 bar 一一对应)
110
+ */
111
+ declare function calcChipDistribution(klines: ChipKlineLike[], options?: ChipDistributionOptions): ChipDistributionItem[];
112
+
113
+ export { type ChipKlineLike as C, type ChipHistogram as a, type ChipDistributionOptions as b, calcChipDistribution as c, type ChipDistributionItem as d };