daxiapi-cli 2.4.1 → 2.5.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 +162 -117
- package/commands/market.js +17 -0
- package/lib/api.js +53 -7
- package/lib/dividendUtils.js +10 -3
- package/lib/output.js +4 -1
- package/lib/utils.js +20 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# daxiapi-cli
|
|
2
2
|
|
|
3
|
-
大虾皮金融数据API命令行工具。需要注册 daxiapi.com
|
|
3
|
+
大虾皮金融数据API命令行工具。需要注册 [daxiapi.com](https://daxiapi.com) 并获取 API Token 后才能使用。
|
|
4
|
+
|
|
5
|
+
> 💡 `daxiapi` 命令也可以使用简写 `dxp`
|
|
4
6
|
|
|
5
7
|
## 安装
|
|
6
8
|
|
|
@@ -8,8 +10,8 @@
|
|
|
8
10
|
# 全局安装
|
|
9
11
|
npm install -g daxiapi-cli
|
|
10
12
|
|
|
11
|
-
# 或使用
|
|
12
|
-
|
|
13
|
+
# 或使用 npx(无需安装,始终使用最新版)
|
|
14
|
+
npx daxiapi-cli@latest market index
|
|
13
15
|
```
|
|
14
16
|
|
|
15
17
|
## 配置
|
|
@@ -17,164 +19,170 @@ pnpm add -g daxiapi-cli
|
|
|
17
19
|
首次使用需要配置 API Token(在 daxiapi.com 用户中心申请):
|
|
18
20
|
|
|
19
21
|
```bash
|
|
20
|
-
#
|
|
22
|
+
# 方式一:配置文件(推荐)
|
|
21
23
|
daxiapi config set token YOUR_API_TOKEN
|
|
22
24
|
|
|
23
25
|
# 方式二:环境变量
|
|
24
26
|
export DAXIAPI_TOKEN=YOUR_API_TOKEN
|
|
25
27
|
```
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
### 配置管理
|
|
29
|
+
### 配置管理命令
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
# 设置Token
|
|
33
|
-
daxiapi config set token YOUR_API_TOKEN
|
|
34
|
-
|
|
35
|
-
# 设置API地址(可选)
|
|
36
|
-
daxiapi config set baseUrl https://daxiapi.com
|
|
37
|
-
|
|
38
32
|
# 查看所有配置
|
|
39
33
|
daxiapi config get
|
|
40
34
|
|
|
41
|
-
#
|
|
35
|
+
# 设置配置项
|
|
36
|
+
daxiapi config set token YOUR_API_TOKEN
|
|
37
|
+
daxiapi config set baseUrl https://daxiapi.com
|
|
38
|
+
|
|
39
|
+
# 删除配置项
|
|
42
40
|
daxiapi config delete token
|
|
43
41
|
```
|
|
44
42
|
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 命令一览
|
|
46
|
+
|
|
45
47
|
### 市场数据
|
|
46
48
|
|
|
47
49
|
```bash
|
|
48
|
-
#
|
|
49
|
-
daxiapi market
|
|
50
|
+
# 主流指数行情(CS强度、多日涨跌幅)
|
|
51
|
+
daxiapi market index
|
|
52
|
+
|
|
53
|
+
# 市场三维结构综合判断(趋势+估值+情绪),推荐优先使用
|
|
54
|
+
daxiapi market compass
|
|
50
55
|
|
|
51
|
-
#
|
|
56
|
+
# 市场温度原始数据(估值温度、恐贪指数、趋势温度、动量温度)
|
|
52
57
|
daxiapi market temp
|
|
53
58
|
|
|
54
|
-
#
|
|
59
|
+
# 大小盘风格轮动(中证2000 vs 沪深300 差值及历史百分位)
|
|
55
60
|
daxiapi market style
|
|
56
61
|
|
|
57
|
-
#
|
|
62
|
+
# 主要指数估值(PE、PB、估值温度、历史百分位)
|
|
58
63
|
daxiapi market value
|
|
59
64
|
```
|
|
60
65
|
|
|
66
|
+
---
|
|
67
|
+
|
|
61
68
|
### 板块数据
|
|
62
69
|
|
|
63
70
|
```bash
|
|
64
|
-
#
|
|
65
|
-
daxiapi sector
|
|
71
|
+
# 板块热力图(按 CS 强度排序,默认展示前5)
|
|
72
|
+
daxiapi sector heatmap
|
|
66
73
|
|
|
67
|
-
#
|
|
68
|
-
daxiapi sector --order zdf --limit 10
|
|
74
|
+
# 按涨跌幅排序,展示前10
|
|
75
|
+
daxiapi sector heatmap --order zdf --limit 10
|
|
69
76
|
|
|
70
|
-
#
|
|
77
|
+
# 行业板块列表(今日涨幅、CS强度、CS均线)
|
|
71
78
|
daxiapi sector bk
|
|
72
79
|
|
|
73
|
-
#
|
|
80
|
+
# 板块内个股排名(按 CS 强度排序)
|
|
74
81
|
daxiapi sector stocks --code BK0457
|
|
75
82
|
|
|
76
|
-
#
|
|
83
|
+
# 板块内个股排名(按涨跌幅排序)
|
|
84
|
+
daxiapi sector stocks --code BK0457 --order zdf
|
|
85
|
+
|
|
86
|
+
# 热门股票(当日涨幅>7% 且 IBS>50 的强势股,按板块分组)
|
|
77
87
|
daxiapi sector top
|
|
78
88
|
|
|
79
|
-
#
|
|
89
|
+
# 热门概念板块(同花顺,默认)
|
|
80
90
|
daxiapi sector gn
|
|
81
91
|
|
|
82
|
-
#
|
|
83
|
-
daxiapi sector gn --type ths
|
|
84
|
-
|
|
85
|
-
# 使用东方财富数据源
|
|
92
|
+
# 热门概念板块(东方财富数据源)
|
|
86
93
|
daxiapi sector gn --type dfcf
|
|
87
94
|
```
|
|
88
95
|
|
|
89
|
-
|
|
96
|
+
**sector stocks 排序字段**:`cs`(CS强度)、`zdf`(涨跌幅)、`sm`(市值)、`cg`(成交额)、`cr`(换手率)、`sctr`(SCTR排名)
|
|
90
97
|
|
|
91
|
-
|
|
92
|
-
# 搜索股票或板块
|
|
93
|
-
daxiapi search 平安
|
|
94
|
-
daxiapi search 锂电 --type bk
|
|
98
|
+
---
|
|
95
99
|
|
|
96
|
-
|
|
100
|
+
### 个股数据
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# 查询单只股票详情
|
|
97
104
|
daxiapi stock info 000001
|
|
98
105
|
|
|
99
|
-
#
|
|
106
|
+
# 批量查询(最多20只,空格或逗号分隔)
|
|
100
107
|
daxiapi stock info 000001 600031 300750
|
|
101
108
|
|
|
102
|
-
#
|
|
109
|
+
# 查询概念板块成分股(同花顺板块ID)
|
|
103
110
|
daxiapi stock gn 881273
|
|
104
111
|
|
|
105
|
-
#
|
|
112
|
+
# 查询概念板块成分股(东方财富板块ID)
|
|
113
|
+
daxiapi stock gn BK0428 --type dfcf
|
|
114
|
+
|
|
115
|
+
# 技术形态选股
|
|
106
116
|
daxiapi stock pattern vcp
|
|
107
117
|
daxiapi stock pattern rps
|
|
108
118
|
daxiapi stock pattern newHigh
|
|
119
|
+
|
|
120
|
+
# 个股主力资金流向(默认5天)
|
|
121
|
+
daxiapi stock capital-flow 600031
|
|
122
|
+
|
|
123
|
+
# 个股主力资金流向(指定天数,最多30天)
|
|
124
|
+
daxiapi stock capital-flow 600031 --days 10
|
|
109
125
|
```
|
|
110
126
|
|
|
111
|
-
####
|
|
127
|
+
#### 技术形态类型(stock pattern)
|
|
112
128
|
|
|
113
129
|
| 形态代码 | 说明 |
|
|
114
130
|
|---------|------|
|
|
115
131
|
| **价值指标类** | |
|
|
116
|
-
| gxl |
|
|
132
|
+
| `gxl` | 高股息率(股息率 > 3%) |
|
|
117
133
|
| **强度指标类** | |
|
|
118
|
-
| rps | RPS
|
|
119
|
-
| sctr | SCTR
|
|
120
|
-
| rpsTop3 | RPS行业前三 |
|
|
121
|
-
| csTop3 | CS
|
|
122
|
-
| sctrTop3 | SCTR行业前三 |
|
|
134
|
+
| `rps` | RPS > 70(欧奈尔相对强度) |
|
|
135
|
+
| `sctr` | SCTR > 70(Stockcharts 综合排名) |
|
|
136
|
+
| `rpsTop3` | RPS 行业前三 |
|
|
137
|
+
| `csTop3` | CS 强度行业前三 |
|
|
138
|
+
| `sctrTop3` | SCTR 行业前三 |
|
|
123
139
|
| **趋势形态类** | |
|
|
124
|
-
| trendUp | K线趋势向上 |
|
|
125
|
-
| high_60d |
|
|
126
|
-
| newHigh |
|
|
127
|
-
| crossMa50 | 上穿MA50 |
|
|
128
|
-
| crossoverBox |
|
|
129
|
-
| cs_crossover_20 | CS
|
|
140
|
+
| `trendUp` | K线趋势向上 |
|
|
141
|
+
| `high_60d` | 近期创60日新高 |
|
|
142
|
+
| `newHigh` | 年度新高附近 |
|
|
143
|
+
| `crossMa50` | 上穿 MA50 |
|
|
144
|
+
| `crossoverBox` | 价格行为信号K(上穿箱体) |
|
|
145
|
+
| `cs_crossover_20` | CS 强度穿过 MA20 |
|
|
130
146
|
| **成交量形态类** | |
|
|
131
|
-
| fangliang |
|
|
132
|
-
| fangliangtupo | 放量突破箱体 |
|
|
147
|
+
| `fangliang` | 放量上涨(前日VCP形态,当日放量突破) |
|
|
148
|
+
| `fangliangtupo` | 放量突破箱体 |
|
|
133
149
|
| **涨跌幅排名类** | |
|
|
134
|
-
| zdf1dTop3 | 1日涨幅行业前三 |
|
|
135
|
-
| zdf5dTop3 | 5日涨幅行业前三 |
|
|
136
|
-
| zdf10dTop3 | 10日涨幅行业前三 |
|
|
137
|
-
| zdf20dTop3 | 20日涨幅行业前三 |
|
|
138
|
-
| shizhiTop3 |
|
|
150
|
+
| `zdf1dTop3` | 1日涨幅行业前三 |
|
|
151
|
+
| `zdf5dTop3` | 5日涨幅行业前三 |
|
|
152
|
+
| `zdf10dTop3` | 10日涨幅行业前三 |
|
|
153
|
+
| `zdf20dTop3` | 20日涨幅行业前三 |
|
|
154
|
+
| `shizhiTop3` | 市值行业前三 |
|
|
139
155
|
| **经典技术形态类** | |
|
|
140
|
-
| vcp |
|
|
141
|
-
| joc |
|
|
142
|
-
| sos |
|
|
143
|
-
| sos_h1 | SOS
|
|
144
|
-
| spring | Spring
|
|
145
|
-
| w | SOS
|
|
146
|
-
| lps | LPS
|
|
147
|
-
| ibs | K
|
|
148
|
-
```
|
|
156
|
+
| `vcp` | VCP 波动收缩形态(股票魔法师) |
|
|
157
|
+
| `joc` | Joc 越过小溪(威科夫) |
|
|
158
|
+
| `sos` | SOS 强势上涨(威科夫) |
|
|
159
|
+
| `sos_h1` | SOS 后出现高1入场点 |
|
|
160
|
+
| `spring` | Spring 弹簧形态(威科夫) |
|
|
161
|
+
| `w` | SOS 后出现 W 底吸收 |
|
|
162
|
+
| `lps` | LPS 最后供应点(威科夫) |
|
|
163
|
+
| `ibs` | K线实体较大(放量上涨,收盘超昨日高点) |
|
|
149
164
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
# 获取K线数据
|
|
154
|
-
daxiapi kline 000001
|
|
155
|
-
```
|
|
165
|
+
---
|
|
156
166
|
|
|
157
167
|
### 涨跌停
|
|
158
168
|
|
|
159
169
|
```bash
|
|
160
|
-
#
|
|
170
|
+
# 涨停池(默认)
|
|
161
171
|
daxiapi zdt
|
|
162
172
|
|
|
163
173
|
# 跌停池
|
|
164
174
|
daxiapi zdt --type dt
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### 成交额
|
|
168
175
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
daxiapi turnover
|
|
176
|
+
# 炸板池
|
|
177
|
+
daxiapi zdt --type zb
|
|
172
178
|
```
|
|
173
179
|
|
|
180
|
+
---
|
|
181
|
+
|
|
174
182
|
### 热榜数据
|
|
175
183
|
|
|
176
184
|
```bash
|
|
177
|
-
# 热股榜(默认:1
|
|
185
|
+
# 热股榜(默认:1小时维度,大家都在看)
|
|
178
186
|
daxiapi hotrank stock
|
|
179
187
|
|
|
180
188
|
# 热股榜 - 24小时维度
|
|
@@ -183,13 +191,13 @@ daxiapi hotrank stock --type day
|
|
|
183
191
|
# 热股榜 - 快速飙升个股
|
|
184
192
|
daxiapi hotrank stock --list-type skyrocket
|
|
185
193
|
|
|
186
|
-
# 热股榜 -
|
|
194
|
+
# 热股榜 - 趋势投资派关注
|
|
187
195
|
daxiapi hotrank stock --list-type trend
|
|
188
196
|
|
|
189
|
-
# 热股榜 -
|
|
197
|
+
# 热股榜 - 价值派关注
|
|
190
198
|
daxiapi hotrank stock --list-type value
|
|
191
199
|
|
|
192
|
-
# 热股榜 -
|
|
200
|
+
# 热股榜 - 技术派关注
|
|
193
201
|
daxiapi hotrank stock --list-type tech
|
|
194
202
|
|
|
195
203
|
# 概念板块热榜
|
|
@@ -199,48 +207,85 @@ daxiapi hotrank concept
|
|
|
199
207
|
daxiapi hotrank board
|
|
200
208
|
```
|
|
201
209
|
|
|
202
|
-
|
|
210
|
+
**热股榜说明**:`--type`(`hour`/`day`)仅对 `normal` 和 `skyrocket` 榜单有效;`trend`/`value`/`tech` 榜单固定使用日维度。
|
|
203
211
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### 成交额
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# 全市场成交额及较昨日变化
|
|
218
|
+
daxiapi turnover
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
### 红利指数
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
# 红利低波指数打分(默认)
|
|
227
|
+
daxiapi dividend score
|
|
228
|
+
|
|
229
|
+
# 指定指数
|
|
230
|
+
daxiapi dividend score -c 2.H30269 # 红利低波
|
|
231
|
+
daxiapi dividend score -c 2.930955 # 红利低波100
|
|
232
|
+
daxiapi dividend score -c 1.000922 # 中证红利
|
|
233
|
+
daxiapi dividend score -c 2.932365 # 中证现金流
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
211
237
|
|
|
212
238
|
### 财报数据
|
|
213
239
|
|
|
214
240
|
```bash
|
|
215
241
|
# 获取个股财务报表数据
|
|
216
242
|
daxiapi report finance 300014
|
|
217
|
-
|
|
218
|
-
# 查询其他股票
|
|
219
243
|
daxiapi report finance 600036
|
|
220
|
-
daxiapi report finance 000001
|
|
221
244
|
```
|
|
222
245
|
|
|
246
|
+
---
|
|
247
|
+
|
|
223
248
|
### 新闻数据
|
|
224
249
|
|
|
225
250
|
```bash
|
|
226
|
-
#
|
|
251
|
+
# 个股舆情(内部自动将 code 转为 secid)
|
|
252
|
+
daxiapi news sentiment -c 600031
|
|
253
|
+
|
|
254
|
+
# 指定条数
|
|
227
255
|
daxiapi news sentiment -c 600031 -p 20
|
|
228
256
|
|
|
229
|
-
#
|
|
230
|
-
daxiapi news notice -c 600031
|
|
257
|
+
# 个股公告
|
|
258
|
+
daxiapi news notice -c 600031
|
|
259
|
+
|
|
260
|
+
# 个股公告(翻页)
|
|
261
|
+
daxiapi news notice -c 600031 -p 20 -i 2
|
|
231
262
|
|
|
232
|
-
#
|
|
233
|
-
daxiapi news report -c 600031 -
|
|
263
|
+
# 个股研报(指定时间区间)
|
|
264
|
+
daxiapi news report -c 600031 -b 2026-01-01 -e 2026-04-09
|
|
234
265
|
```
|
|
235
266
|
|
|
236
|
-
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### 工具命令
|
|
237
270
|
|
|
238
271
|
```bash
|
|
239
|
-
#
|
|
240
|
-
daxiapi
|
|
272
|
+
# 搜索股票(支持名称、拼音缩写)
|
|
273
|
+
daxiapi search 平安
|
|
274
|
+
daxiapi search 宁德时代
|
|
275
|
+
|
|
276
|
+
# 搜索板块
|
|
277
|
+
daxiapi search 锂电 --type bk
|
|
278
|
+
|
|
279
|
+
# 代码格式转换(转为标准 secid 格式)
|
|
280
|
+
daxiapi secid 000001 # → 0.000001
|
|
281
|
+
daxiapi secid 600031 # → 1.600031
|
|
282
|
+
|
|
283
|
+
# K线数据
|
|
284
|
+
daxiapi kline 000001
|
|
285
|
+
daxiapi kline 1.600031
|
|
241
286
|
```
|
|
242
287
|
|
|
243
|
-
|
|
288
|
+
---
|
|
244
289
|
|
|
245
290
|
## 全局选项
|
|
246
291
|
|
|
@@ -248,14 +293,15 @@ daxiapi secid 000001
|
|
|
248
293
|
# 查看帮助
|
|
249
294
|
daxiapi --help
|
|
250
295
|
daxiapi market --help
|
|
296
|
+
daxiapi stock --help
|
|
251
297
|
|
|
252
298
|
# 查看版本
|
|
253
299
|
daxiapi --version
|
|
254
300
|
```
|
|
255
301
|
|
|
256
|
-
|
|
302
|
+
---
|
|
257
303
|
|
|
258
|
-
|
|
304
|
+
## 错误处理
|
|
259
305
|
|
|
260
306
|
### 认证错误 (401)
|
|
261
307
|
|
|
@@ -264,12 +310,12 @@ CLI 工具提供详细的错误提示和解决建议:
|
|
|
264
310
|
|
|
265
311
|
解决方法:
|
|
266
312
|
1. 检查 Token 是否正确配置:
|
|
313
|
+
daxiapi config get token
|
|
314
|
+
2. 重新配置:
|
|
267
315
|
daxiapi config set token YOUR_TOKEN
|
|
268
|
-
|
|
269
|
-
2. 或设置环境变量:
|
|
316
|
+
3. 或设置环境变量:
|
|
270
317
|
export DAXIAPI_TOKEN=YOUR_TOKEN
|
|
271
|
-
|
|
272
|
-
3. Token 可在 daxiapi.com 用户中心获取
|
|
318
|
+
4. Token 可在 daxiapi.com 用户中心获取
|
|
273
319
|
```
|
|
274
320
|
|
|
275
321
|
### 限流错误 (429)
|
|
@@ -278,15 +324,14 @@ CLI 工具提供详细的错误提示和解决建议:
|
|
|
278
324
|
❌ 错误: 请求频率超限
|
|
279
325
|
|
|
280
326
|
解决方法:
|
|
281
|
-
1.
|
|
282
|
-
2.
|
|
283
|
-
3. 升级账户获取更高配额
|
|
327
|
+
1. 等待 30-60 秒后重试
|
|
328
|
+
2. 检查请求频率是否过高
|
|
284
329
|
```
|
|
285
330
|
|
|
286
331
|
## 限流规则
|
|
287
332
|
|
|
288
|
-
- 每日上限:1000次
|
|
289
|
-
- 每分钟上限:10次
|
|
333
|
+
- 每日上限:1000 次
|
|
334
|
+
- 每分钟上限:10 次
|
|
290
335
|
- 超限返回 429 错误
|
|
291
336
|
|
|
292
337
|
## License
|
package/commands/market.js
CHANGED
|
@@ -31,7 +31,24 @@ module.exports = function (program) {
|
|
|
31
31
|
process.exit(1);
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
|
+
marketCmd.command('compass')
|
|
35
|
+
.description('获取市场整合趋势结构、估值、情绪三层指标,用于A股市场三维结构分析系统,给出市场当前状态的综合判断与操作建议')
|
|
36
|
+
.action(async () => {
|
|
37
|
+
try {
|
|
38
|
+
const token = config.getToken();
|
|
39
|
+
if (!token) {
|
|
40
|
+
const error = new Error('未配置 API Token');
|
|
41
|
+
error.response = {status: 401};
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
34
44
|
|
|
45
|
+
const data = await api.getCompassData(token);
|
|
46
|
+
output(data);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
handleError(error);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
35
52
|
marketCmd
|
|
36
53
|
.command('temp')
|
|
37
54
|
.description(
|
package/lib/api.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const axios = require('axios');
|
|
2
2
|
const config = require('./config');
|
|
3
3
|
const request = require('./request');
|
|
4
|
-
const {formatThsVolumeTime, isTradingNow} = require('./utils');
|
|
4
|
+
const {formatThsVolumeTime, isTradingNow, formatSecucode} = require('./utils');
|
|
5
5
|
const {calculateScores} = require('./dividendUtils');
|
|
6
6
|
const getFinanceReportDetail = require('./caibao');
|
|
7
7
|
|
|
@@ -107,12 +107,58 @@ async function getSecId(token, code) {
|
|
|
107
107
|
const client = createClient(token);
|
|
108
108
|
return post(client, '/get_sec_id', {code});
|
|
109
109
|
}
|
|
110
|
+
async function getCompassData(token, ) {
|
|
111
|
+
const client = createClient(token);
|
|
112
|
+
return get(client, '/get_market_compass');
|
|
113
|
+
}
|
|
110
114
|
|
|
111
115
|
async function queryStockData(token, q, type = 'stock') {
|
|
112
116
|
const client = createClient(token);
|
|
113
117
|
return post(client, '/query_stock_data', {q, type});
|
|
114
118
|
}
|
|
115
119
|
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
async function getCapitalFlow(code, days =10) {
|
|
123
|
+
if (!code || typeof code !== 'string') {
|
|
124
|
+
throw new Error('Invalid code: code must be a non-empty string');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const secucode = formatSecucode(code);
|
|
128
|
+
const response = await axios.get('https://datacenter-web.eastmoney.com/api/data/v1/get', {
|
|
129
|
+
params: {
|
|
130
|
+
callback: '',
|
|
131
|
+
reportName: 'PRT_STOCK_CAPITALFLOWS',
|
|
132
|
+
columns: 'ALL',
|
|
133
|
+
filter: `(SECUCODE="${secucode}")`,
|
|
134
|
+
pageNumber: 1,
|
|
135
|
+
pageSize: days,
|
|
136
|
+
sortTypes: -1,
|
|
137
|
+
sortColumns: 'TRADE_DATE',
|
|
138
|
+
source: 'WEB',
|
|
139
|
+
client: 'WEB'
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const payload = response.data || {};
|
|
144
|
+
if (!payload.success || !payload.result || !payload.result.data) {
|
|
145
|
+
throw new Error('Failed to get capital flow data');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const data = payload.result.data;
|
|
149
|
+
return data.map(item => ({
|
|
150
|
+
date: item.TRADE_DATE,
|
|
151
|
+
当日资金流入: item.CAPITAL_FLOWS,
|
|
152
|
+
'当日资金流入占比': item.CAPITAL_FLOWS_RATIO,
|
|
153
|
+
'5日资金流入金额': item.CAPITAL_FLOWS_5DAYS,
|
|
154
|
+
'5日资金流入占比': item.CAPITAL_FLOWS_5DAYSRATIO,
|
|
155
|
+
'板块资金流入': item.BOARD_CAPITAL_FLOWS,
|
|
156
|
+
'5日板块资金流入金额': item.BOARD_CAPITAL_5FLOWS,
|
|
157
|
+
'板块代码': item.BOARD_CODE,
|
|
158
|
+
'板块名称': item.BOARD_NAME,
|
|
159
|
+
}))
|
|
160
|
+
}
|
|
161
|
+
|
|
116
162
|
async function getPatternStocks(token, pattern) {
|
|
117
163
|
const client = createClient(token);
|
|
118
164
|
return post(client, '/get_pattern_stocks', {pattern});
|
|
@@ -146,8 +192,8 @@ async function getDividendScore(token, code) {
|
|
|
146
192
|
scores: recentScores.map(item => ({
|
|
147
193
|
date: item.date,
|
|
148
194
|
score: item.totalScore,
|
|
149
|
-
cs: item.cs.toFixed(2),
|
|
150
|
-
rsi: item.rsi.toFixed(2)
|
|
195
|
+
cs: item.cs != null ? item.cs.toFixed(2) : null,
|
|
196
|
+
rsi: item.rsi != null ? item.rsi.toFixed(2) : null
|
|
151
197
|
}))
|
|
152
198
|
};
|
|
153
199
|
}
|
|
@@ -272,15 +318,13 @@ async function getTurnoverData(type = 'day') {
|
|
|
272
318
|
if (isTrading) {
|
|
273
319
|
return {
|
|
274
320
|
是否正在盘中交易: isTrading ? '是' : '否',
|
|
275
|
-
...rs
|
|
276
|
-
minuteData
|
|
321
|
+
...rs
|
|
277
322
|
};
|
|
278
323
|
}
|
|
279
324
|
return {
|
|
280
325
|
...formattedData,
|
|
281
326
|
是否正在盘中交易: isTrading ? '是' : '否',
|
|
282
|
-
...rs
|
|
283
|
-
minuteData
|
|
327
|
+
...rs
|
|
284
328
|
};
|
|
285
329
|
}
|
|
286
330
|
|
|
@@ -439,8 +483,10 @@ async function getNewsReport(code, pageSize = 25, pageIndex = 1, beginTime = '20
|
|
|
439
483
|
}
|
|
440
484
|
|
|
441
485
|
module.exports = {
|
|
486
|
+
getCapitalFlow,
|
|
442
487
|
getMarketData,
|
|
443
488
|
getMarketTemp,
|
|
489
|
+
getCompassData,
|
|
444
490
|
getMarketStyle,
|
|
445
491
|
getMarketValueData,
|
|
446
492
|
getBkData,
|
package/lib/dividendUtils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const DIVIDEND_SCORE_CONSTANTS = {
|
|
2
2
|
ROLLING_WINDOW: 440,
|
|
3
|
-
PERCENTILE_LOW:
|
|
4
|
-
PERCENTILE_HIGH:
|
|
3
|
+
PERCENTILE_LOW: 0,
|
|
4
|
+
PERCENTILE_HIGH: 100,
|
|
5
5
|
SCORE_MA_PERIOD: 5,
|
|
6
6
|
EMA_PERIOD: 20,
|
|
7
7
|
MA_PERIOD: 80,
|
|
@@ -140,6 +140,7 @@ function calculateScores(data) {
|
|
|
140
140
|
|
|
141
141
|
const csValues = dataCopy.map(d => d.cs);
|
|
142
142
|
const ma80BiasValues = dataCopy.map(d => d.ma80Bias);
|
|
143
|
+
const rsiValues = dataCopy.map(d => d.rsi);
|
|
143
144
|
|
|
144
145
|
for (let i = 0; i < dataCopy.length; i++) {
|
|
145
146
|
const current = dataCopy[i];
|
|
@@ -155,6 +156,7 @@ function calculateScores(data) {
|
|
|
155
156
|
const startIdx = Math.max(0, i - DIVIDEND_SCORE_CONSTANTS.ROLLING_WINDOW + 1);
|
|
156
157
|
const csHistory = csValues.slice(startIdx, i + 1);
|
|
157
158
|
const ma80History = ma80BiasValues.slice(startIdx, i + 1);
|
|
159
|
+
const rsiHistory = rsiValues.slice(startIdx, i + 1);
|
|
158
160
|
|
|
159
161
|
current.csScore = calculateRollingScore(
|
|
160
162
|
current.cs,
|
|
@@ -168,7 +170,12 @@ function calculateScores(data) {
|
|
|
168
170
|
DIVIDEND_SCORE_CONSTANTS.PERCENTILE_LOW,
|
|
169
171
|
DIVIDEND_SCORE_CONSTANTS.PERCENTILE_HIGH
|
|
170
172
|
);
|
|
171
|
-
current.rsiScore =
|
|
173
|
+
current.rsiScore = calculateRollingScore(
|
|
174
|
+
current.rsi,
|
|
175
|
+
rsiHistory,
|
|
176
|
+
DIVIDEND_SCORE_CONSTANTS.PERCENTILE_LOW,
|
|
177
|
+
DIVIDEND_SCORE_CONSTANTS.PERCENTILE_HIGH
|
|
178
|
+
);
|
|
172
179
|
|
|
173
180
|
if (current.csScore !== null && current.ma80Score !== null && current.rsiScore !== null) {
|
|
174
181
|
current.totalScore = parseFloat(
|
package/lib/output.js
CHANGED
|
@@ -8,7 +8,10 @@ function output(data) {
|
|
|
8
8
|
console.log('[60]{"日期","分数","cs值","rsi值"}:');
|
|
9
9
|
|
|
10
10
|
data.scores.forEach(item => {
|
|
11
|
-
|
|
11
|
+
const score = item.score != null ? item.score : '-';
|
|
12
|
+
const cs = item.cs != null ? item.cs : '-';
|
|
13
|
+
const rsi = item.rsi != null ? item.rsi : '-';
|
|
14
|
+
console.log(` ${item.date},${score},${cs},${rsi}`);
|
|
12
15
|
});
|
|
13
16
|
|
|
14
17
|
console.log('```');
|
package/lib/utils.js
CHANGED
|
@@ -78,10 +78,29 @@ const formatThsVolumeTime = e => {
|
|
|
78
78
|
dataTimestamp: h
|
|
79
79
|
};
|
|
80
80
|
};
|
|
81
|
+
|
|
82
|
+
function formatSecucode(code) {
|
|
83
|
+
code = String(code);
|
|
84
|
+
if (code.includes('.')) {
|
|
85
|
+
const parts = code.split('.');
|
|
86
|
+
const stockCode = parts[0];
|
|
87
|
+
const suffix = parts[1].toUpperCase();
|
|
88
|
+
if (suffix === 'SH' || suffix === 'SZ') {
|
|
89
|
+
return `${stockCode}.${suffix}`;
|
|
90
|
+
}
|
|
91
|
+
return `${stockCode}.${suffix === '1' ? 'SH' : 'SZ'}`;
|
|
92
|
+
}
|
|
93
|
+
if (code[0] === '6' || code[0] === '5') {
|
|
94
|
+
return `${code}.SH`;
|
|
95
|
+
}
|
|
96
|
+
return `${code}.SZ`;
|
|
97
|
+
}
|
|
98
|
+
|
|
81
99
|
module.exports = {
|
|
82
100
|
isWeekday,
|
|
83
101
|
isTradingTime,
|
|
84
102
|
isTradingNow,
|
|
85
103
|
formatThsVolumeTime,
|
|
86
|
-
getSecid
|
|
104
|
+
getSecid,
|
|
105
|
+
formatSecucode
|
|
87
106
|
};
|