@kamuira/stock-analyzer 1.3.3 → 1.3.4

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 (2) hide show
  1. package/index.html +75 -1
  2. package/package.json +1 -1
package/index.html CHANGED
@@ -249,6 +249,47 @@
249
249
  <button onclick="quickAnalyze('sz002340')">格林美</button>
250
250
  <button onclick="quickAnalyze('sh600900')">长江电力</button>
251
251
  <button onclick="quickAnalyze('sz002916')">深南电路</button>
252
+ <button onclick="quickAnalyze('sz002378')">章源钨业</button>
253
+ <button onclick="quickAnalyze('sh600699')">均胜电子</button>
254
+ <button onclick="quickAnalyze('sz002709')">天赐材料</button>
255
+ <button onclick="quickAnalyze('sz000338')">潍柴动力</button>
256
+ <button onclick="quickAnalyze('sz002125')">湘潭电化</button>
257
+ <button onclick="quickAnalyze('sh600089')">特变电工</button>
258
+ <button onclick="quickAnalyze('sh603124')">江南新材</button>
259
+ <button onclick="quickAnalyze('sz000983')">山西焦煤</button>
260
+ <button onclick="quickAnalyze('sz001314')">亿道信息</button>
261
+ <button onclick="quickAnalyze('sh600158')">中体产业</button>
262
+ <button onclick="quickAnalyze('sz000534')">万泽股份</button>
263
+ <button onclick="quickAnalyze('sz002747')">埃斯顿</button>
264
+ <button onclick="quickAnalyze('sz002050')">三花智控</button>
265
+ <button onclick="quickAnalyze('sz002167')">东方锆业</button>
266
+ <button onclick="quickAnalyze('sz002931')">锋龙股份</button>
267
+ <button onclick="quickAnalyze('sh600458')">时代新材</button>
268
+ <button onclick="quickAnalyze('sh603500')">祥和实业</button>
269
+ <button onclick="quickAnalyze('sz000021')">深科技</button>
270
+ <button onclick="quickAnalyze('sz002028')">思源电气</button>
271
+ <button onclick="quickAnalyze('sh600563')">法拉电子</button>
272
+ <button onclick="quickAnalyze('sz000725')">京东方A</button>
273
+ <button onclick="quickAnalyze('sh605358')">立昂微</button>
274
+ <button onclick="quickAnalyze('sz002938')">鹏鼎控股</button>
275
+ <button onclick="quickAnalyze('sh600522')">中天科技</button>
276
+ <button onclick="quickAnalyze('sz002213')">大为股份</button>
277
+ <button onclick="quickAnalyze('sh600226')">亨通股份</button>
278
+ <button onclick="quickAnalyze('sz001389')">广合科技</button>
279
+ <button onclick="quickAnalyze('sz002179')">中航光电</button>
280
+ <button onclick="quickAnalyze('sz002491')">通鼎互联</button>
281
+ <button onclick="quickAnalyze('sh601231')">环旭电子</button>
282
+ <button onclick="quickAnalyze('sz002156')">通富微电</button>
283
+ <button onclick="quickAnalyze('sz300476')">胜宏科技</button>
284
+ <button onclick="quickAnalyze('sh600406')">国电南瑞</button>
285
+ <button onclick="quickAnalyze('sz000807')">云铝股份</button>
286
+ <button onclick="quickAnalyze('sh600961')">株冶集团</button>
287
+ <button onclick="quickAnalyze('sh605117')">德业股份</button>
288
+ <button onclick="quickAnalyze('sh603271')">永杰新材</button>
289
+ <button onclick="quickAnalyze('sh603129')">春风动力</button>
290
+ <button onclick="quickAnalyze('sh603288')">海天味业</button>
291
+ <button onclick="quickAnalyze('sh603277')">银都股份</button>
292
+ <button onclick="quickAnalyze('sh603606')">东方电缆</button>
252
293
  </div>
253
294
  <div class="shortcuts" id="customShortcuts"></div>
254
295
 
@@ -323,7 +364,13 @@
323
364
  'sh600206','sh600111','sh601318','sh601066',
324
365
  'sz000510','sh601021','sz000657','sh600027','sh603659',
325
366
  'sh600309','sz300170','sh605589','sz300308','sz002463','sh603259','sz002371',
326
- 'sz300502','sh600487','sh601869','sh600869','sz002340','sh600900','sz002916'
367
+ 'sz300502','sh600487','sh601869','sh600869','sz002340','sh600900','sz002916',
368
+ 'sz002378','sh600699','sz002709','sz000338','sz002125','sh600089','sh603124',
369
+ 'sz000983','sz001314','sh600158','sz000534','sz002747','sz002050','sz002167',
370
+ 'sz002931','sh600458','sh603500','sz000021','sz002028','sh600563','sz000725',
371
+ 'sh605358','sz002938','sh600522','sz002213','sh600226','sz001389','sz002179',
372
+ 'sz002491','sh601231','sz002156','sz300476','sh600406','sz000807','sh600961',
373
+ 'sh605117','sh603271','sh603129','sh603288','sh603277','sh603606'
327
374
  ];
328
375
 
329
376
  const rankBtn = document.getElementById('rankBtn');
@@ -358,6 +405,14 @@
358
405
 
359
406
  // 保存上一次排名的渲染结果(仅前端内存,非接口缓存),用于点进个股后快速返回
360
407
  let lastRankHTML = '';
408
+ let lastRankData = null; // 上次排名的原始数据,用于本地重新筛选(不重算)
409
+ let rankFilterStrict = false; // 是否只看"可博弈"(综合评分≥5 且 盈亏比>1)
410
+
411
+ function toggleRankFilter() {
412
+ if (!lastRankData) return;
413
+ rankFilterStrict = !rankFilterStrict;
414
+ renderRank(lastRankData); // 用内存数据重渲染,零网络、零重算
415
+ }
361
416
 
362
417
  function backToRank() {
363
418
  if (!lastRankHTML) return;
@@ -385,6 +440,7 @@
385
440
  const res = await fetch(`/api/rank?codes=${encodeURIComponent(list.join(','))}`);
386
441
  const data = await res.json();
387
442
  if (data.error) { showError(data.error); return; }
443
+ lastRankData = data;
388
444
  renderRank(data);
389
445
  } catch (e) {
390
446
  showError('网络请求失败: ' + e.message);
@@ -471,6 +527,16 @@
471
527
  }
472
528
  html += `<div style="font-size:11px;color:#ff8a80;margin-top:8px">注:这是按规则筛出的"候选",仍不含消息面;买前自行查公告、定仓位、设止损。</div></div>`;
473
529
 
530
+ // 🎯 可博弈筛选:技术综合评分≥5 且 盈亏比>1(用户自定义条件)
531
+ const passStrict = r => r.totalScore >= 5 && r.riskRewardRatio != null && r.riskRewardRatio > 1;
532
+ const strictCount = ok.filter(passStrict).length;
533
+ html += `<div style="margin-bottom:12px;display:flex;align-items:center;gap:12px;flex-wrap:wrap">
534
+ <button onclick="toggleRankFilter()" style="padding:8px 16px;border:1px solid ${rankFilterStrict ? '#4caf50' : '#5a3dbf'};border-radius:8px;background:${rankFilterStrict ? '#4caf5022' : 'transparent'};color:${rankFilterStrict ? '#4caf50' : '#b39dff'};font-size:13px;cursor:pointer">
535
+ ${rankFilterStrict ? '✓ 已筛选:可博弈(评分≥5 且 盈亏比>1) · 点此显示全部' : '🎯 只看可博弈(技术评分≥5 且 盈亏比>1)'}
536
+ </button>
537
+ <span style="font-size:12px;color:#888">符合条件 <b style="color:${strictCount ? '#4caf50' : '#888'}">${strictCount}</b> 只</span>
538
+ </div>`;
539
+
474
540
  html += `<div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;font-size:13px">
475
541
  <thead><tr style="color:#888;text-align:left;border-bottom:1px solid #2a3a4a">
476
542
  <th style="padding:10px 6px">#</th>
@@ -483,10 +549,14 @@
483
549
  <th style="padding:10px 6px;text-align:center" title="ROE/营收利润增速/负债,越优质越高">基本面</th>
484
550
  <th style="padding:10px 6px;text-align:center" title="公告关键词:利好+/利空−,50为中性">消息</th>
485
551
  <th style="padding:10px 6px">技术信号</th>
552
+ <th style="padding:10px 6px;text-align:center" title="风险收益比:止盈空间/止损空间,>1 才划算">盈亏比</th>
486
553
  <th style="padding:10px 6px;text-align:right" title="回测满仓复利净收益(扣费)">复利回测</th>
487
554
  </tr></thead><tbody>`;
488
555
 
556
+ let shown = 0;
489
557
  ok.forEach((r, i) => {
558
+ if (rankFilterStrict && !passStrict(r)) return; // 筛选模式:跳过不达标的,保留原排名号
559
+ shown++;
490
560
  const dir = r.changePct > 0 ? 'up' : r.changePct < 0 ? 'down' : 'flat';
491
561
  const sc = signalColor(r.signal, r.totalScore);
492
562
  const b = r.backtest;
@@ -509,9 +579,13 @@
509
579
  ${dimCell(f.score, f.label, fSub)}
510
580
  ${dimCell(r.news ? r.news.score : null, r.news ? r.news.label : null, r.news && r.news.hitCount ? r.news.hitCount + '条' : '')}
511
581
  <td style="padding:8px 6px"><span style="padding:2px 8px;border-radius:10px;font-size:12px;background:${sc}22;color:${sc}">${r.signal}</span></td>
582
+ <td style="padding:8px 6px;text-align:center;font-weight:bold;color:${rrColor(r.riskRewardRatio)}" title="技术综合评分 ${r.totalScore}">${r.riskRewardRatio != null ? r.riskRewardRatio : '-'}</td>
512
583
  ${btCell}
513
584
  </tr>`;
514
585
  });
586
+ if (rankFilterStrict && shown === 0) {
587
+ html += `<tr><td colspan="12" style="padding:20px;text-align:center;color:#ff9800;font-size:13px">没有股票同时满足 技术综合评分≥5 且 盈亏比>1 —— 当前多数标的要么动能不足、要么上方空间不够,空仓等待更稳妥。</td></tr>`;
588
+ }
515
589
  html += `</tbody></table></div>`;
516
590
 
517
591
  if (bad.length) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamuira/stock-analyzer",
3
- "version": "1.3.3",
3
+ "version": "1.3.4",
4
4
  "preferGlobal": true,
5
5
  "description": "A股/台股综合分析工具 - 技术面+估值+基本面+消息面四维评分、批量排名、含成本回测、买卖建议",
6
6
  "main": "server.js",