stock-sdk 2.2.1 → 2.3.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.
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 分红送配、**主题基金**
@@ -241,6 +242,7 @@ import { SdkError, isSdkError, getSdkErrorCode } from 'stock-sdk/errors';
241
242
  | 实时行情 | ✅ | ✅ | ✅ | ✅ | ✅ 全球期货 | ✅ ETF / 中金所 / 商品 |
242
243
  | 历史 K 线(日/周/月) | ✅ | ✅ | ✅ | ⚠️ 场内 ETF/LOF | ✅ 国内 + 全球 | ✅ |
243
244
  | 分钟 K 线(5/15/30/60) | ✅ | ✅ `kline.hkMinute` | ✅ `kline.usMinute` | ⚠️ 场内 ETF/LOF | ❌ | ❌ |
245
+ | 筹码分布(CYQ) | ✅ `chips.cn` | ✅ `chips.hk` | ✅ `chips.us` | — | — | — |
244
246
  | 当日分时(1 分钟) | ✅ `quotes.timeline` | ✅ `kline.hkMinute`(period='1') | ✅ `kline.usMinute`(period='1') | ⚠️ 场内 ETF/LOF | ❌ | ✅ ETF 期权 |
245
247
  | 分红派送 | ✅ | ❌ | ❌ | ✅ 基金 + ETF | — | — |
246
248
  | 资金流向 | ✅ 个股/大盘/排名/板块 | ❌ | ❌ | — | — | — |
@@ -267,12 +269,13 @@ import { SdkError, isSdkError, getSdkErrorCode } from 'stock-sdk/errors';
267
269
  | `sdk.codes` | `.cn` / `.us` / `.hk` / `.fund` |
268
270
  | `sdk.batch` | `.cn` / `.hk` / `.us` / `.byCodes` / `.raw` |
269
271
  | `sdk.kline` | `.cn` / `.cnMinute` / `.hk` / `.hkMinute` / `.us` / `.usMinute` / `.withIndicators` |
272
+ | `sdk.chips` | `.cn` / `.hk` / `.us`(筹码分布:获利比例 / 平均成本 / 成本区间 / 筹码峰) |
270
273
  | `sdk.board` | `.industry.*` / `.concept.*`(`list` / `spot` / `constituents` / `kline` / `minuteKline`) |
271
274
  | `sdk.options` | `.index.*` / `.etf.*` / `.commodity.*` / `.cffex.*` / `.lhb` |
272
275
  | `sdk.futures` | `.kline` / `.globalSpot` / `.globalKline` / `.inventory` / `.comexInventory` … |
273
276
  | `sdk.fundFlow` | `.individual` / `.market` / `.rank` / `.sectorRank` / `.sectorHistory` |
274
277
  | `sdk.northbound` | `.minute` / `.summary` / `.holdingRank` / `.history` / `.individual` |
275
- | `sdk.marketEvent` | `.ztPool` / `.stockChanges` / `.boardChanges` |
278
+ | `sdk.marketEvent` | `.ztPool` / `.stockChanges`(支持多类型 / `'all'`) / `.boardChanges` / `.individualChanges` / `.individualChangesHistory`(个股异动) |
276
279
  | `sdk.dragonTiger` | `.detail` / `.stockStats` / `.institution` / `.branchRank` / `.seatDetail` |
277
280
  | `sdk.blockTrade` / `sdk.margin` | 大宗交易 / 融资融券 |
278
281
  | `sdk.fund` | `.dividendList` / `.navHistory` / `.estimate` / `.rankHistory` / `.theme` |
@@ -333,6 +333,8 @@ interface MAOptions {
333
333
  periods?: number[];
334
334
  /** 均线类型:'sma'(简单) | 'ema'(指数) | 'wma'(加权),默认 'sma' */
335
335
  type?: 'sma' | 'ema' | 'wma';
336
+ /** 输出舍入小数位,默认 3 */
337
+ decimals?: number;
336
338
  }
337
339
  interface MACDOptions {
338
340
  /** 短期 EMA 周期,默认 12 */
@@ -341,12 +343,16 @@ interface MACDOptions {
341
343
  long?: number;
342
344
  /** 信号线 EMA 周期,默认 9 */
343
345
  signal?: number;
346
+ /** 输出舍入小数位,默认 3 */
347
+ decimals?: number;
344
348
  }
345
349
  interface BOLLOptions {
346
350
  /** 均线周期,默认 20 */
347
351
  period?: number;
348
352
  /** 标准差倍数,默认 2 */
349
353
  stdDev?: number;
354
+ /** 输出舍入小数位,默认 3 */
355
+ decimals?: number;
350
356
  }
351
357
  interface KDJOptions {
352
358
  /** RSV 周期,默认 9 */
@@ -355,26 +361,38 @@ interface KDJOptions {
355
361
  kPeriod?: number;
356
362
  /** D 值平滑周期,默认 3 */
357
363
  dPeriod?: number;
364
+ /** 输出舍入小数位,默认 3 */
365
+ decimals?: number;
358
366
  }
359
367
  interface RSIOptions {
360
368
  /** RSI 周期数组,默认 [6, 12, 24] */
361
369
  periods?: number[];
370
+ /** 输出舍入小数位,默认 3 */
371
+ decimals?: number;
362
372
  }
363
373
  interface WROptions {
364
374
  /** WR 周期数组,默认 [6, 10] */
365
375
  periods?: number[];
376
+ /** 输出舍入小数位,默认 3 */
377
+ decimals?: number;
366
378
  }
367
379
  interface BIASOptions {
368
380
  /** BIAS 周期数组,默认 [6, 12, 24] */
369
381
  periods?: number[];
382
+ /** 输出舍入小数位,默认 3 */
383
+ decimals?: number;
370
384
  }
371
385
  interface CCIOptions {
372
386
  /** CCI 周期,默认 14 */
373
387
  period?: number;
388
+ /** 输出舍入小数位,默认 3 */
389
+ decimals?: number;
374
390
  }
375
391
  interface ATROptions {
376
392
  /** ATR 周期,默认 14 */
377
393
  period?: number;
394
+ /** 输出舍入小数位,默认 3 */
395
+ decimals?: number;
378
396
  }
379
397
  /**
380
398
  * 周期型指标(periods 复数)的文档简写入参:
@@ -333,6 +333,8 @@ interface MAOptions {
333
333
  periods?: number[];
334
334
  /** 均线类型:'sma'(简单) | 'ema'(指数) | 'wma'(加权),默认 'sma' */
335
335
  type?: 'sma' | 'ema' | 'wma';
336
+ /** 输出舍入小数位,默认 3 */
337
+ decimals?: number;
336
338
  }
337
339
  interface MACDOptions {
338
340
  /** 短期 EMA 周期,默认 12 */
@@ -341,12 +343,16 @@ interface MACDOptions {
341
343
  long?: number;
342
344
  /** 信号线 EMA 周期,默认 9 */
343
345
  signal?: number;
346
+ /** 输出舍入小数位,默认 3 */
347
+ decimals?: number;
344
348
  }
345
349
  interface BOLLOptions {
346
350
  /** 均线周期,默认 20 */
347
351
  period?: number;
348
352
  /** 标准差倍数,默认 2 */
349
353
  stdDev?: number;
354
+ /** 输出舍入小数位,默认 3 */
355
+ decimals?: number;
350
356
  }
351
357
  interface KDJOptions {
352
358
  /** RSV 周期,默认 9 */
@@ -355,26 +361,38 @@ interface KDJOptions {
355
361
  kPeriod?: number;
356
362
  /** D 值平滑周期,默认 3 */
357
363
  dPeriod?: number;
364
+ /** 输出舍入小数位,默认 3 */
365
+ decimals?: number;
358
366
  }
359
367
  interface RSIOptions {
360
368
  /** RSI 周期数组,默认 [6, 12, 24] */
361
369
  periods?: number[];
370
+ /** 输出舍入小数位,默认 3 */
371
+ decimals?: number;
362
372
  }
363
373
  interface WROptions {
364
374
  /** WR 周期数组,默认 [6, 10] */
365
375
  periods?: number[];
376
+ /** 输出舍入小数位,默认 3 */
377
+ decimals?: number;
366
378
  }
367
379
  interface BIASOptions {
368
380
  /** BIAS 周期数组,默认 [6, 12, 24] */
369
381
  periods?: number[];
382
+ /** 输出舍入小数位,默认 3 */
383
+ decimals?: number;
370
384
  }
371
385
  interface CCIOptions {
372
386
  /** CCI 周期,默认 14 */
373
387
  period?: number;
388
+ /** 输出舍入小数位,默认 3 */
389
+ decimals?: number;
374
390
  }
375
391
  interface ATROptions {
376
392
  /** ATR 周期,默认 14 */
377
393
  period?: number;
394
+ /** 输出舍入小数位,默认 3 */
395
+ decimals?: number;
378
396
  }
379
397
  /**
380
398
  * 周期型指标(periods 复数)的文档简写入参:
@@ -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 };