@kamuira/stock-analyzer 1.0.3 → 1.0.5
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 +219 -86
- package/package.json +1 -1
- package/server.js +29 -6
package/README.md
CHANGED
|
@@ -1,156 +1,240 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @kamuira/stock-analyzer
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A股/台股综合技术分析工具 — 支持实时分析、历史回测、智能买卖建议
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 15+ 技术指标综合评分(MA、MACD、RSI、KDJ、布林带、ADX、ATR...)
|
|
8
|
+
- 动态加权评分:根据趋势/震荡市自动调整指标权重
|
|
9
|
+
- 多重信号确认:金叉/死叉需要量能+趋势方向确认,减少假信号
|
|
10
|
+
- 信号连续性判断:区分新信号和已持续信号,避免追高杀低
|
|
11
|
+
- MACD/RSI 顶底背离检测
|
|
12
|
+
- 缺口分析、斐波那契回撤位、动量衰竭检测
|
|
13
|
+
- 形态识别(缩量回踩、放量突破、假突破、锤子线等)
|
|
14
|
+
- 大盘环境过滤(获取上证指数趋势,弱势时降低做多权重)
|
|
15
|
+
- 基于实际支撑/压力位的风险收益比计算
|
|
16
|
+
- 可操作的买入/卖出建议(具体价位、仓位比例、持仓周期)
|
|
17
|
+
- 历史回测验证(500个交易日,统计胜率和平均收益)
|
|
18
|
+
- 支持 A股 + 台股
|
|
19
|
+
- 端口自动重试 + 自动打开浏览器
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 全局安装
|
|
25
|
+
npm install -g @kamuira/stock-analyzer
|
|
26
|
+
|
|
27
|
+
# 或直接使用 npx
|
|
28
|
+
npx @kamuira/stock-analyzer
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 使用方式
|
|
32
|
+
|
|
33
|
+
### Web 界面(推荐)
|
|
4
34
|
|
|
5
35
|
```bash
|
|
6
|
-
#
|
|
36
|
+
# 启动服务(自动打开浏览器)
|
|
37
|
+
stock-server
|
|
38
|
+
|
|
39
|
+
# 开发模式(文件变化自动重启)
|
|
7
40
|
node dev.js
|
|
41
|
+
```
|
|
8
42
|
|
|
9
|
-
|
|
10
|
-
node server.js
|
|
43
|
+
启动后自动打开浏览器访问 `http://127.0.0.1:3000`,端口被占用会自动 +1 重试。
|
|
11
44
|
|
|
12
|
-
|
|
13
|
-
node analyze.js [股票代码|all]
|
|
45
|
+
### 命令行分析
|
|
14
46
|
|
|
15
|
-
|
|
16
|
-
|
|
47
|
+
```bash
|
|
48
|
+
# 分析单只股票
|
|
49
|
+
stock-analyze sz002049
|
|
50
|
+
stock-analyze 2330 # 台股(4位数字自动识别)
|
|
51
|
+
stock-analyze 紫光国微 # 支持中文名搜索
|
|
52
|
+
|
|
53
|
+
# 分析所有关注列表
|
|
54
|
+
stock-analyze all
|
|
17
55
|
```
|
|
18
56
|
|
|
19
|
-
|
|
57
|
+
### 回测验证
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 回测单只股票
|
|
61
|
+
stock-backtest sh601138
|
|
62
|
+
|
|
63
|
+
# 回测所有
|
|
64
|
+
stock-backtest all
|
|
65
|
+
```
|
|
20
66
|
|
|
21
67
|
## 支持的输入格式
|
|
22
68
|
|
|
23
69
|
| 格式 | 示例 | 说明 |
|
|
24
70
|
|------|------|------|
|
|
25
|
-
| 6位数字 | `002049` | 自动识别A
|
|
71
|
+
| 6位数字 | `002049` | 自动识别A股(6开头=上海,其他=深圳) |
|
|
26
72
|
| sh/sz前缀 | `sz002049` | 明确指定A股 |
|
|
27
73
|
| 4位数字 | `2330` | 自动识别台股 |
|
|
28
74
|
| tw前缀 | `tw2330` | 明确指定台股 |
|
|
29
75
|
| 中文名称 | `紫光国微` | 搜索A股 |
|
|
30
76
|
| 拼音缩写 | `zggw` | 搜索A股 |
|
|
31
77
|
|
|
32
|
-
|
|
78
|
+
## 技术指标一览
|
|
33
79
|
|
|
34
|
-
|
|
80
|
+
| 指标 | 用途 | 参数 |
|
|
81
|
+
|------|------|------|
|
|
82
|
+
| MA (5/10/20/60) | 趋势方向、支撑压力 | 多头/空头排列、金叉死叉 |
|
|
83
|
+
| MACD (12,26,9) | 趋势动能、买卖时机 | 金叉死叉、零轴位置、柱状线 |
|
|
84
|
+
| RSI (14) | 超买超卖 | <30超卖、>70超买 |
|
|
85
|
+
| KDJ (9,3,3) | 短期超买超卖 | J值极端、金叉死叉 |
|
|
86
|
+
| 布林带 (20,2) | 波动区间、变盘信号 | 触轨、带宽收窄 |
|
|
87
|
+
| ADX (14) | 趋势强度 | >25趋势市、<20震荡市 |
|
|
88
|
+
| ATR (14) | 波动率、仓位管理 | 止损距离、仓位建议 |
|
|
89
|
+
| VWAP (20) | 量价均衡位 | 支撑/压力参考 |
|
|
35
90
|
|
|
36
|
-
|
|
91
|
+
## 高级分析功能
|
|
37
92
|
|
|
38
|
-
|
|
39
|
-
- 当日综合评分 >= 5 → 记为"买入信号"
|
|
40
|
-
- 当日综合评分 <= -5 → 记为"卖出信号"
|
|
41
|
-
- 中间区域 → "观望",不计入统计
|
|
93
|
+
### 信号确认机制
|
|
42
94
|
|
|
43
|
-
|
|
95
|
+
每个金叉/死叉信号需要多重确认才给满分:
|
|
44
96
|
|
|
45
97
|
```
|
|
46
|
-
|
|
47
|
-
|
|
98
|
+
确认因素:量能放大 + 趋势方向一致 + 价格位置合理
|
|
99
|
+
- 3项确认 → 满分(强信号)
|
|
100
|
+
- 2项确认 → 7折
|
|
101
|
+
- 1项确认 → 5折
|
|
102
|
+
- 0项确认 → 仅给基础分(可能是假信号)
|
|
48
103
|
```
|
|
49
104
|
|
|
50
|
-
|
|
51
|
-
1. 取500个交易日(约2年)历史数据
|
|
52
|
-
2. 从第60天开始,逐日计算综合评分
|
|
53
|
-
3. 某天评分>=5,记录当天收盘价为"入场价"
|
|
54
|
-
4. 分别看 3天、5天、10天 后的收盘价
|
|
55
|
-
5. 后续收盘价 > 入场价 → 算"赢",否则算"输"
|
|
56
|
-
|
|
57
|
-
**举例:**
|
|
58
|
-
紫光国微在250个交易日中,有75次触发买入信号(评分>=5),其中5天后价格上涨的有41次:
|
|
59
|
-
- 胜率 = 41/75 = 55.4%
|
|
60
|
-
- 平均收益 = 所有75次的5日涨跌幅平均值 = +0.46%
|
|
61
|
-
|
|
62
|
-
**当前局限性:**
|
|
63
|
-
- 每天独立判断,连续信号不去重(如连续5天都是买入信号,会算5次独立交易)
|
|
64
|
-
- 未模拟实际仓位管理和交易手续费
|
|
65
|
-
- 未考虑止损提前退出的情况
|
|
66
|
-
- 固定持有N天后退出,不考虑中途信号变化
|
|
67
|
-
|
|
68
|
-
---
|
|
105
|
+
### 动态加权评分
|
|
69
106
|
|
|
70
|
-
|
|
107
|
+
根据 ADX 判断市场状态,自动切换权重:
|
|
71
108
|
|
|
72
|
-
|
|
109
|
+
- **趋势市 (ADX>=25)**:加大 MA、MACD、ADX 权重,降低 RSI、KDJ 权重
|
|
110
|
+
- **震荡市 (ADX<20)**:加大 RSI、KDJ、布林带权重,降低趋势指标权重
|
|
111
|
+
- **ADX<15 极度震荡**:所有信号打 4 折(几乎无效)
|
|
73
112
|
|
|
74
|
-
|
|
75
|
-
- 均线(×1.5) + MACD(×1.3) + ADX(×1.5) + RSI(×0.7) + KDJ(×0.7) + 布林(×0.8) + 量价(×1.0) + 趋势(×1.3) + 背离(×1.2) + 形态(×1.0) + 动量(×1.2) + 缺口(×0.8)
|
|
113
|
+
### 趋势一致性检查
|
|
76
114
|
|
|
77
|
-
|
|
78
|
-
|
|
115
|
+
```
|
|
116
|
+
短期(5日) + 中期(20日) + 长期(60日) 方向一致 → +3分
|
|
117
|
+
短期和中期方向矛盾 → 信号打8折
|
|
118
|
+
```
|
|
79
119
|
|
|
80
|
-
|
|
81
|
-
- 趋势一致性:短/中/长期方向一致 +3分,矛盾则打8折
|
|
82
|
-
- ADX<20 震荡市:所有信号打6折
|
|
83
|
-
- 低波动股(ATR<1.5%):信号打7折
|
|
84
|
-
- 量能确认:放量看多加成15%,缩量看多打8折
|
|
85
|
-
- 大盘环境:上证偏强+1.5,偏弱-1.5且正分打7折
|
|
120
|
+
### 大盘环境过滤
|
|
86
121
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
| >= 10 | 强烈买入 |
|
|
91
|
-
| >= 5 | 建议买入 |
|
|
92
|
-
| >= 1 | 谨慎买入 |
|
|
93
|
-
| >= -4 | 观望 |
|
|
94
|
-
| >= -9 | 建议卖出 |
|
|
95
|
-
| < -9 | 强烈卖出 |
|
|
122
|
+
自动获取上证指数趋势:
|
|
123
|
+
- 大盘偏强 → 整体 +1.5 分
|
|
124
|
+
- 大盘偏弱 → 整体 -1.5 分,且正分打 7 折
|
|
96
125
|
|
|
97
126
|
---
|
|
98
127
|
|
|
99
|
-
|
|
128
|
+
## 评分体系
|
|
129
|
+
|
|
130
|
+
### 信号分级
|
|
131
|
+
|
|
132
|
+
| 评分 | 信号 | 建议操作 |
|
|
133
|
+
|------|------|----------|
|
|
134
|
+
| >= 10 | 强烈买入 | 积极建仓,持仓5-10天 |
|
|
135
|
+
| >= 5 | 建议买入 | 适量买入,持仓3-5天 |
|
|
136
|
+
| >= 1 | 谨慎买入 | 小仓位试探,持仓1-3天 |
|
|
137
|
+
| >= -4 | 观望 | 不操作,等待方向 |
|
|
138
|
+
| >= -9 | 建议卖出 | 减仓或观望 |
|
|
139
|
+
| < -9 | 强烈卖出 | 清仓回避 |
|
|
140
|
+
|
|
141
|
+
### 买入条件逻辑
|
|
100
142
|
|
|
101
|
-
|
|
143
|
+
根据评分高低给出不同激进程度的入场建议:
|
|
144
|
+
|
|
145
|
+
| 评分区间 | 入场策略 |
|
|
146
|
+
|----------|----------|
|
|
147
|
+
| >= 5(强势) | 当前价附近或日内回调半个ATR入场 + 分批建仓方案 |
|
|
148
|
+
| 1-4(偏多) | 等回调2-3%后出现止跌信号再买 |
|
|
149
|
+
| < 1(中性/偏空) | 等布林下轨抄底或站回MA20 |
|
|
150
|
+
|
|
151
|
+
### 风险收益比
|
|
102
152
|
|
|
103
|
-
|
|
153
|
+
基于实际支撑/压力位计算(非机械ATR倍数):
|
|
154
|
+
|
|
155
|
+
**止损位选取(最近的下方支撑):**
|
|
104
156
|
- MA20(如果在下方)
|
|
105
157
|
- 布林下轨
|
|
106
158
|
- 近20日最低价
|
|
107
159
|
- ATR止损(兜底)
|
|
108
160
|
|
|
109
|
-
|
|
161
|
+
**止盈位选取(上方有意义的压力位,排除距离<2%的):**
|
|
110
162
|
- 近20日最高价
|
|
111
163
|
- 布林上轨
|
|
112
164
|
- 斐波那契回撤位
|
|
113
165
|
- ATR目标(补充)
|
|
114
166
|
|
|
115
|
-
**公式:**
|
|
116
167
|
```
|
|
117
168
|
风险收益比 = (止盈位 - 当前价) / (当前价 - 止损位)
|
|
118
|
-
```
|
|
119
169
|
|
|
120
|
-
|
|
121
|
-
|
|
170
|
+
>= 2.0 → "入场性价比高"
|
|
171
|
+
< 1.0 → "建议等回调再入场"
|
|
172
|
+
```
|
|
122
173
|
|
|
123
174
|
---
|
|
124
175
|
|
|
125
|
-
|
|
176
|
+
## 回测验证
|
|
177
|
+
|
|
178
|
+
### 胜率计算方法
|
|
179
|
+
|
|
180
|
+
**触发条件:**
|
|
181
|
+
- 当日综合评分 >= 5 → 记为"买入信号"
|
|
182
|
+
- 当日综合评分 <= -5 → 记为"卖出信号"
|
|
183
|
+
- 中间区域 → "观望",不计入统计
|
|
126
184
|
|
|
127
|
-
|
|
185
|
+
**计算公式:**
|
|
186
|
+
```
|
|
187
|
+
买入胜率 = 信号发出后N天价格上涨的次数 / 买入信号总次数 × 100%
|
|
188
|
+
平均收益 = 所有买入信号N天后涨跌幅之和 / 买入信号总次数
|
|
189
|
+
```
|
|
128
190
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
191
|
+
**流程:**
|
|
192
|
+
1. 取500个交易日(约2年)历史数据
|
|
193
|
+
2. 从第60天开始逐日计算综合评分
|
|
194
|
+
3. 评分>=5时记录收盘价为入场价
|
|
195
|
+
4. 分别统计 3天、5天、10天 后的涨跌
|
|
134
196
|
|
|
135
|
-
|
|
197
|
+
**评级标准(取3/5/10日最佳表现):**
|
|
198
|
+
| 评级 | 条件 |
|
|
199
|
+
|------|------|
|
|
200
|
+
| 优秀 | 最佳胜率 >= 65% 且均收益 > 2% |
|
|
201
|
+
| 良好 | 最佳胜率 >= 58% 且均收益 > 1% |
|
|
202
|
+
| 一般 | 最佳胜率 >= 55%,或胜率>=50%且均收益>0.5% |
|
|
203
|
+
| 较差 | 以上都不满足 |
|
|
204
|
+
|
|
205
|
+
### 回测结果(26只股票验证)
|
|
206
|
+
|
|
207
|
+
**适合本系统(胜率55%+):**
|
|
208
|
+
| 股票 | 5日胜率 | 5日均收益 | 类型 |
|
|
209
|
+
|------|---------|-----------|------|
|
|
210
|
+
| 兆易创新 | 68.5% | +5.50% | 半导体 |
|
|
211
|
+
| 台积电 | 66.1% | +1.93% | 半导体 |
|
|
212
|
+
| 阳光电源 | 64.5% | +4.82% | 新能源 |
|
|
213
|
+
| 立讯精密 | 64.1% | +4.03% | 消费电子 |
|
|
214
|
+
| 湖南白银 | 64.1% | +6.82% | 有色金属 |
|
|
215
|
+
| 宏和科技 | 63.1% | +7.61% | 新材料 |
|
|
216
|
+
| 工业富联 | 60.0% | +3.83% | AI/科技 |
|
|
217
|
+
| 中芯国际 | 59.7% | +3.27% | 半导体 |
|
|
218
|
+
| 紫金矿业 | 59.6% | +2.14% | 资源 |
|
|
219
|
+
|
|
220
|
+
**不适合本系统(胜率<45%):**
|
|
136
221
|
- 银行股(招商银行、平安银行)— 低波动,政策驱动
|
|
137
222
|
- 白酒消费(茅台、五粮液)— 基本面下行时技术面失效
|
|
138
223
|
- 公用事业(核电、长江电力)— 波动太小
|
|
139
224
|
- 券商(中信建投)— 脉冲式行情,趋势不持续
|
|
140
225
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
### 买入条件的逻辑?
|
|
226
|
+
**结论:** 本系统最适合波动率适中(ATR 2-6%)、趋势性强(ADX经常>25)、成交活跃的科技/成长/有色金属类股票。
|
|
144
227
|
|
|
145
|
-
|
|
228
|
+
### 当前局限性
|
|
146
229
|
|
|
147
|
-
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
230
|
+
- 每天独立判断,连续信号不去重
|
|
231
|
+
- 未模拟实际仓位管理和交易手续费
|
|
232
|
+
- 未考虑止损提前退出
|
|
233
|
+
- 固定持有N天后退出,不考虑中途信号变化
|
|
150
234
|
|
|
151
235
|
---
|
|
152
236
|
|
|
153
|
-
|
|
237
|
+
## 数据来源
|
|
154
238
|
|
|
155
239
|
| 数据 | A股来源 | 台股来源 |
|
|
156
240
|
|------|---------|---------|
|
|
@@ -159,8 +243,57 @@ node backtest.js [股票代码|all]
|
|
|
159
243
|
| 股票搜索 | 腾讯智能搜索 (smartbox.gtimg.cn) | — |
|
|
160
244
|
| 大盘指数 | 腾讯财经 (上证000001) | — |
|
|
161
245
|
|
|
246
|
+
## 项目结构
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
├── server.js # Web 服务主程序(含所有分析逻辑)
|
|
250
|
+
├── analyze.js # CLI 分析工具
|
|
251
|
+
├── backtest.js # 回测验证工具
|
|
252
|
+
├── dev.js # 开发模式(文件变化自动重启)
|
|
253
|
+
├── stock.js # 数据获取工具
|
|
254
|
+
├── index.html # 前端页面
|
|
255
|
+
├── package.json # npm 包配置
|
|
256
|
+
├── README.md # 本文件
|
|
257
|
+
└── bin/
|
|
258
|
+
├── analyze.js # CLI 入口: stock-analyze
|
|
259
|
+
├── server.js # 服务入口: stock-server
|
|
260
|
+
└── backtest.js # 回测入口: stock-backtest
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## 环境要求
|
|
264
|
+
|
|
265
|
+
- Node.js >= 14.0.0
|
|
266
|
+
- 无需安装任何第三方依赖(纯原生 Node.js 实现)
|
|
267
|
+
- 需要网络连接(获取实时/历史数据)
|
|
268
|
+
|
|
269
|
+
## 更新日志
|
|
270
|
+
|
|
271
|
+
### v1.0.3
|
|
272
|
+
- 修复 README 在 npm 页面不显示的问题
|
|
273
|
+
|
|
274
|
+
### v1.0.2
|
|
275
|
+
- 修复 ADX 阈值逻辑 bug
|
|
276
|
+
- 修复 yesterdayClose 除零风险
|
|
277
|
+
- 修复前端 XSS 和 null guard
|
|
278
|
+
- 修复 localStorage 异常处理
|
|
279
|
+
|
|
280
|
+
### v1.0.1
|
|
281
|
+
- 修复 bin 脚本路径
|
|
282
|
+
|
|
283
|
+
### v1.0.0
|
|
284
|
+
- 初始发布
|
|
285
|
+
- 15+ 技术指标综合分析
|
|
286
|
+
- 动态加权评分 + 多重信号确认
|
|
287
|
+
- 历史回测验证
|
|
288
|
+
- A股 + 台股支持
|
|
289
|
+
- Web 界面 + CLI 工具
|
|
290
|
+
|
|
162
291
|
---
|
|
163
292
|
|
|
164
293
|
## 免责声明
|
|
165
294
|
|
|
166
|
-
|
|
295
|
+
本工具仅基于技术面指标进行分析,不构成任何投资建议。技术分析有其固有局限性,无法预测突发事件、政策变化、基本面恶化等因素。投资有风险,入市需谨慎。使用本工具产生的任何投资损失,作者不承担任何责任。
|
|
296
|
+
|
|
297
|
+
## License
|
|
298
|
+
|
|
299
|
+
MIT
|
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -1691,9 +1691,32 @@ const server = http.createServer(async (req, res) => {
|
|
|
1691
1691
|
res.end('Not Found');
|
|
1692
1692
|
});
|
|
1693
1693
|
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
});
|
|
1694
|
+
// 自动打开浏览器
|
|
1695
|
+
function openBrowser(url) {
|
|
1696
|
+
const { exec } = require('child_process');
|
|
1697
|
+
const platform = process.platform;
|
|
1698
|
+
if (platform === 'win32') exec(`start ${url}`);
|
|
1699
|
+
else if (platform === 'darwin') exec(`open ${url}`);
|
|
1700
|
+
else exec(`xdg-open ${url}`);
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
// 端口占用自动重试
|
|
1704
|
+
function startServer(port) {
|
|
1705
|
+
server.listen(port, () => {
|
|
1706
|
+
console.log(`\n${'='.repeat(50)}`);
|
|
1707
|
+
console.log(` A股综合分析工具`);
|
|
1708
|
+
console.log(` 打开浏览器访问: http://127.0.0.1:${port}`);
|
|
1709
|
+
console.log(`${'='.repeat(50)}\n`);
|
|
1710
|
+
openBrowser(`http://127.0.0.1:${port}`);
|
|
1711
|
+
});
|
|
1712
|
+
server.on('error', (err) => {
|
|
1713
|
+
if (err.code === 'EADDRINUSE') {
|
|
1714
|
+
console.log(`端口 ${port} 被占用,尝试 ${port + 1}...`);
|
|
1715
|
+
startServer(port + 1);
|
|
1716
|
+
} else {
|
|
1717
|
+
console.error('服务启动失败:', err.message);
|
|
1718
|
+
}
|
|
1719
|
+
});
|
|
1720
|
+
}
|
|
1721
|
+
|
|
1722
|
+
startServer(PORT);
|