candidate-pool 3.0.0 → 3.0.1

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/CHANGELOG.md CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  所有变动按 **Conventional Commits** 约定分类,由 `changelogen` 自动生成。
4
4
 
5
+ ## v3.0.1
6
+
7
+ [compare changes](https://github.com/GuoSirius/candidate-pool/compare/v3.0.0...v3.0.1)
8
+
9
+ ### 🚀 新功能 (Features)
10
+
11
+ - **preopen:** 归档补贴线样本与淘汰统计支撑日后调参 ([c8d206b](https://github.com/GuoSirius/candidate-pool/commit/c8d206b))
12
+ - 次日候选快照记录当时规则常量与生成时间 ([3cc1b72](https://github.com/GuoSirius/candidate-pool/commit/3cc1b72))
13
+
14
+ ### 📚 文档 (Documentation)
15
+
16
+ - **eod:** 尾盘原始存档永久保留策略落注释并补复盘第8.6节 ([6ba4fef](https://github.com/GuoSirius/candidate-pool/commit/6ba4fef))
17
+
18
+ ### 📦 杂项维护 (Chores)
19
+
20
+ - **eod:** 尾盘口径版本号升到 2 并写明版本切段规则 ([5a6921a](https://github.com/GuoSirius/candidate-pool/commit/5a6921a))
21
+ - Obs run 2026-10-22 (0 candidates) ([4d44623](https://github.com/GuoSirius/candidate-pool/commit/4d44623))
22
+ - 尾盘选股 2026-10-22 ([2e0e85b](https://github.com/GuoSirius/candidate-pool/commit/2e0e85b))
23
+
24
+ ### ❤️ Contributors
25
+
26
+ - 郭之存 ([@siriusSupreme](https://github.com/siriusSupreme))
27
+
5
28
  ## v3.0.0
6
29
 
7
30
  [compare changes](https://github.com/GuoSirius/candidate-pool/compare/v2.2.0...v3.0.0)
@@ -2,16 +2,21 @@
2
2
  "tradeDate": "2026-10-22",
3
3
  "scope": "universe",
4
4
  "mode": "preopen",
5
- "generatedAt": "2026-10-22T03:50:37.762Z",
5
+ "generatedAt": "2026-10-22T06:20:58.507Z",
6
6
  "marketDate": "2026-10-22",
7
7
  "meta": {
8
8
  "snapshotCount": 6177,
9
9
  "baselineCount": 5558,
10
10
  "validQuotes": 6177,
11
11
  "marketDate": "2026-10-22",
12
- "elapsedMs": 1,
12
+ "elapsedMs": 0,
13
13
  "recordCount": 18,
14
- "runCount": 6
14
+ "runCount": 7,
15
+ "rejByReason": {
16
+ "停牌/无成交": 68,
17
+ "ST/退市风险": 467,
18
+ "无基线K线": 619
19
+ }
15
20
  },
16
21
  "runs": [
17
22
  {
@@ -119,6 +124,612 @@
119
124
  "sz002565",
120
125
  "sz300107"
121
126
  ]
127
+ },
128
+ {
129
+ "at": "2026-10-22T06:20:58.507Z",
130
+ "count": 18,
131
+ "codes": [
132
+ "sh600293",
133
+ "sh603278",
134
+ "sz002388",
135
+ "sz002724",
136
+ "sz300839",
137
+ "sz002696",
138
+ "sh601566",
139
+ "sh603332",
140
+ "sz002076",
141
+ "sh603138",
142
+ "sh601999",
143
+ "sz002929",
144
+ "sz002181",
145
+ "sz300296",
146
+ "sz002313",
147
+ "sz002238",
148
+ "sz002565",
149
+ "sz300107"
150
+ ]
151
+ }
152
+ ],
153
+ "nearMiss": [
154
+ {
155
+ "code": "sz001216",
156
+ "name": "华瓷股份",
157
+ "sector": "家居用品",
158
+ "board": "主板",
159
+ "open": 26.39,
160
+ "prevClose": 25.2,
161
+ "price": 27.72,
162
+ "auctionChgPct": 4.722222222222228,
163
+ "auctionVolRatio": 1.5839112556182462,
164
+ "yesterdayChgPct": 9.995635093845468,
165
+ "trend": {
166
+ "maBull": false,
167
+ "newHigh20": false,
168
+ "newHigh60": false,
169
+ "slope20": 0.1493813039119404
170
+ },
171
+ "p1": {
172
+ "auctionChgPct": 4.722222222222228,
173
+ "auctionVolRatio": 1.5839112556182462,
174
+ "highOpen": true,
175
+ "nearLimit": false,
176
+ "volOk": true,
177
+ "score": 0.5722222222222227,
178
+ "ok": true
179
+ },
180
+ "p2": {
181
+ "yesterdayChgPct": 9.995635093845468,
182
+ "auctionChgPct": 4.722222222222228,
183
+ "applicable": true,
184
+ "verdict": "符合预期·健康高开",
185
+ "score": 0.7,
186
+ "risk": false
187
+ },
188
+ "p3": {
189
+ "ma5": 23.79,
190
+ "ma10": 23.493999999999996,
191
+ "ma20": 24.265500000000003,
192
+ "ma60": 17.73516666666666,
193
+ "maBull": false,
194
+ "newHigh20": false,
195
+ "newHigh60": false,
196
+ "slope20": 0.1493813039119404,
197
+ "volPriceUp": false,
198
+ "score": 0,
199
+ "ok": false
200
+ },
201
+ "label": "弱转强·符合",
202
+ "risk": false,
203
+ "total": 44.5,
204
+ "scoreItems": {
205
+ "p1": 0.57,
206
+ "p2": 0.7,
207
+ "p3": 0
208
+ },
209
+ "stamp": "20261022142051",
210
+ "belowMin": 0.5
211
+ },
212
+ {
213
+ "code": "sz002307",
214
+ "name": "北新路桥",
215
+ "sector": "基础建设",
216
+ "board": "主板",
217
+ "open": 3.39,
218
+ "prevClose": 3.08,
219
+ "price": 3.39,
220
+ "auctionChgPct": 10.064935064935066,
221
+ "auctionVolRatio": 6.372999611853115,
222
+ "yesterdayChgPct": 1.650165016501659,
223
+ "trend": {
224
+ "maBull": false,
225
+ "newHigh20": true,
226
+ "newHigh60": false,
227
+ "slope20": 0.04836211130842176
228
+ },
229
+ "p1": {
230
+ "auctionChgPct": 10.064935064935066,
231
+ "auctionVolRatio": 6.372999611853115,
232
+ "highOpen": true,
233
+ "nearLimit": true,
234
+ "volOk": true,
235
+ "score": 1,
236
+ "ok": true
237
+ },
238
+ "p2": {
239
+ "yesterdayChgPct": 1.650165016501659,
240
+ "auctionChgPct": 10.064935064935066,
241
+ "applicable": false,
242
+ "verdict": "非强势股",
243
+ "score": 0,
244
+ "risk": false
245
+ },
246
+ "p3": {
247
+ "ma5": 2.996,
248
+ "ma10": 2.995,
249
+ "ma20": 2.9850000000000003,
250
+ "ma60": 3.0051666666666668,
251
+ "maBull": false,
252
+ "newHigh20": true,
253
+ "newHigh60": false,
254
+ "slope20": 0.04836211130842176,
255
+ "volPriceUp": true,
256
+ "score": 0.3,
257
+ "ok": false
258
+ },
259
+ "label": "竞价涨停",
260
+ "risk": false,
261
+ "total": 44,
262
+ "scoreItems": {
263
+ "p1": 1,
264
+ "p2": 0,
265
+ "p3": 0.3
266
+ },
267
+ "stamp": "20261022142051",
268
+ "belowMin": 1
269
+ },
270
+ {
271
+ "code": "sz300369",
272
+ "name": "绿盟科技",
273
+ "sector": "软件开发",
274
+ "board": "创业板",
275
+ "open": 11.1,
276
+ "prevClose": 10.14,
277
+ "price": 9.91,
278
+ "auctionChgPct": 9.467455621301756,
279
+ "auctionVolRatio": 1.5751430948281342,
280
+ "yesterdayChgPct": -1.934235976789156,
281
+ "trend": {
282
+ "maBull": false,
283
+ "newHigh20": false,
284
+ "newHigh60": false,
285
+ "slope20": 1.3003734600095525
286
+ },
287
+ "p1": {
288
+ "auctionChgPct": 9.467455621301756,
289
+ "auctionVolRatio": 1.5751430948281342,
290
+ "highOpen": true,
291
+ "nearLimit": true,
292
+ "volOk": true,
293
+ "score": 1,
294
+ "ok": true
295
+ },
296
+ "p2": {
297
+ "yesterdayChgPct": -1.934235976789156,
298
+ "auctionChgPct": 9.467455621301756,
299
+ "applicable": false,
300
+ "verdict": "非强势股",
301
+ "score": 0,
302
+ "risk": false
303
+ },
304
+ "p3": {
305
+ "ma5": 10.22,
306
+ "ma10": 10.345,
307
+ "ma20": 9.626500000000002,
308
+ "ma60": 8.141499999999999,
309
+ "maBull": false,
310
+ "newHigh20": false,
311
+ "newHigh60": false,
312
+ "slope20": 1.3003734600095525,
313
+ "volPriceUp": false,
314
+ "score": 0.3,
315
+ "ok": false
316
+ },
317
+ "label": "竞价涨停",
318
+ "risk": false,
319
+ "total": 44,
320
+ "scoreItems": {
321
+ "p1": 1,
322
+ "p2": 0,
323
+ "p3": 0.3
324
+ },
325
+ "stamp": "20261022142051",
326
+ "belowMin": 1
327
+ },
328
+ {
329
+ "code": "sh601858",
330
+ "name": "中国科传",
331
+ "sector": "出版",
332
+ "board": "主板",
333
+ "open": 26.5,
334
+ "prevClose": 25.29,
335
+ "price": 25.13,
336
+ "auctionChgPct": 4.784499802293407,
337
+ "auctionVolRatio": 1.3443719350468448,
338
+ "yesterdayChgPct": 0.15841584158415856,
339
+ "trend": {
340
+ "maBull": true,
341
+ "newHigh20": false,
342
+ "newHigh60": false,
343
+ "slope20": 1.5330041157153385
344
+ },
345
+ "p1": {
346
+ "auctionChgPct": 4.784499802293407,
347
+ "auctionVolRatio": 1.3443719350468448,
348
+ "highOpen": true,
349
+ "nearLimit": false,
350
+ "volOk": true,
351
+ "score": 0.5784499802293408,
352
+ "ok": true
353
+ },
354
+ "p2": {
355
+ "yesterdayChgPct": 0.15841584158415856,
356
+ "auctionChgPct": 4.784499802293407,
357
+ "applicable": false,
358
+ "verdict": "非强势股",
359
+ "score": 0,
360
+ "risk": false
361
+ },
362
+ "p3": {
363
+ "ma5": 25.82,
364
+ "ma10": 24.506,
365
+ "ma20": 22.779000000000003,
366
+ "ma60": 22.089833333333328,
367
+ "maBull": true,
368
+ "newHigh20": false,
369
+ "newHigh60": false,
370
+ "slope20": 1.5330041157153385,
371
+ "volPriceUp": true,
372
+ "score": 0.7,
373
+ "ok": true
374
+ },
375
+ "label": "竞价强+趋势",
376
+ "risk": false,
377
+ "total": 41.2,
378
+ "scoreItems": {
379
+ "p1": 0.58,
380
+ "p2": 0,
381
+ "p3": 0.7
382
+ },
383
+ "stamp": "20261022142051",
384
+ "belowMin": 3.8
385
+ },
386
+ {
387
+ "code": "sh600202",
388
+ "name": "哈空调",
389
+ "sector": "通用设备",
390
+ "board": "主板",
391
+ "open": 5.75,
392
+ "prevClose": 5.57,
393
+ "price": 5.9,
394
+ "auctionChgPct": 3.2315978456014305,
395
+ "auctionVolRatio": 1.5994322720833378,
396
+ "yesterdayChgPct": 10.079051383399218,
397
+ "trend": {
398
+ "maBull": false,
399
+ "newHigh20": false,
400
+ "newHigh60": false,
401
+ "slope20": 0.5195222576047026
402
+ },
403
+ "p1": {
404
+ "auctionChgPct": 3.2315978456014305,
405
+ "auctionVolRatio": 1.5994322720833378,
406
+ "highOpen": true,
407
+ "nearLimit": false,
408
+ "volOk": true,
409
+ "score": 0.4231597845601431,
410
+ "ok": true
411
+ },
412
+ "p2": {
413
+ "yesterdayChgPct": 10.079051383399218,
414
+ "auctionChgPct": 3.2315978456014305,
415
+ "applicable": true,
416
+ "verdict": "符合预期·健康高开",
417
+ "score": 0.7,
418
+ "risk": false
419
+ },
420
+ "p3": {
421
+ "ma5": 5.33,
422
+ "ma10": 5.384,
423
+ "ma20": 5.2405,
424
+ "ma60": 5.022833333333333,
425
+ "maBull": false,
426
+ "newHigh20": false,
427
+ "newHigh60": false,
428
+ "slope20": 0.5195222576047026,
429
+ "volPriceUp": false,
430
+ "score": 0.04482084660176347,
431
+ "ok": false
432
+ },
433
+ "label": "弱转强·符合",
434
+ "risk": false,
435
+ "total": 40.7,
436
+ "scoreItems": {
437
+ "p1": 0.42,
438
+ "p2": 0.7,
439
+ "p3": 0.04
440
+ },
441
+ "stamp": "20261022142049",
442
+ "belowMin": 4.3
443
+ },
444
+ {
445
+ "code": "sz002811",
446
+ "name": "郑中设计",
447
+ "sector": "装修装饰Ⅱ",
448
+ "board": "主板",
449
+ "open": 24.23,
450
+ "prevClose": 24.16,
451
+ "price": 24.32,
452
+ "auctionChgPct": 0.2897350993377401,
453
+ "auctionVolRatio": 1.5484105552287475,
454
+ "yesterdayChgPct": 10.018214936247727,
455
+ "trend": {
456
+ "maBull": true,
457
+ "newHigh20": true,
458
+ "newHigh60": true,
459
+ "slope20": 2.21836007406237
460
+ },
461
+ "p1": {
462
+ "auctionChgPct": 0.2897350993377401,
463
+ "auctionVolRatio": 1.5484105552287475,
464
+ "highOpen": false,
465
+ "nearLimit": false,
466
+ "volOk": true,
467
+ "score": 0,
468
+ "ok": false
469
+ },
470
+ "p2": {
471
+ "yesterdayChgPct": 10.018214936247727,
472
+ "auctionChgPct": 0.2897350993377401,
473
+ "applicable": true,
474
+ "verdict": "偏弱高开",
475
+ "score": 0.3,
476
+ "risk": false
477
+ },
478
+ "p3": {
479
+ "ma5": 21.512,
480
+ "ma10": 20.209,
481
+ "ma20": 18.2025,
482
+ "ma60": 14.088,
483
+ "maBull": true,
484
+ "newHigh20": true,
485
+ "newHigh60": true,
486
+ "slope20": 2.21836007406237,
487
+ "volPriceUp": true,
488
+ "score": 1,
489
+ "ok": true
490
+ },
491
+ "label": "趋势向上",
492
+ "risk": false,
493
+ "total": 40.5,
494
+ "scoreItems": {
495
+ "p1": 0,
496
+ "p2": 0.3,
497
+ "p3": 1
498
+ },
499
+ "stamp": "20261022142051",
500
+ "belowMin": 4.5
501
+ },
502
+ {
503
+ "code": "sh688651",
504
+ "name": "盛邦安全",
505
+ "sector": "软件开发",
506
+ "board": "科创板",
507
+ "open": 26.57,
508
+ "prevClose": 23.59,
509
+ "price": 24.38,
510
+ "auctionChgPct": 12.632471386180576,
511
+ "auctionVolRatio": 2.9621258077692887,
512
+ "yesterdayChgPct": 1.7248814144027458,
513
+ "trend": {
514
+ "maBull": false,
515
+ "newHigh20": false,
516
+ "newHigh60": false,
517
+ "slope20": -0.2669899265151553
518
+ },
519
+ "p1": {
520
+ "auctionChgPct": 12.632471386180576,
521
+ "auctionVolRatio": 2.9621258077692887,
522
+ "highOpen": true,
523
+ "nearLimit": true,
524
+ "volOk": true,
525
+ "score": 1,
526
+ "ok": true
527
+ },
528
+ "p2": {
529
+ "yesterdayChgPct": 1.7248814144027458,
530
+ "auctionChgPct": 12.632471386180576,
531
+ "applicable": false,
532
+ "verdict": "非强势股",
533
+ "score": 0,
534
+ "risk": false
535
+ },
536
+ "p3": {
537
+ "ma5": 22.688,
538
+ "ma10": 23.534000000000002,
539
+ "ma20": 24.016000000000002,
540
+ "ma60": 23.080333333333332,
541
+ "maBull": false,
542
+ "newHigh20": false,
543
+ "newHigh60": false,
544
+ "slope20": -0.2669899265151553,
545
+ "volPriceUp": true,
546
+ "score": 0,
547
+ "ok": false
548
+ },
549
+ "label": "竞价涨停",
550
+ "risk": false,
551
+ "total": 35,
552
+ "scoreItems": {
553
+ "p1": 1,
554
+ "p2": 0,
555
+ "p3": 0
556
+ },
557
+ "stamp": "20261022142050",
558
+ "belowMin": 10
559
+ },
560
+ {
561
+ "code": "sz001360",
562
+ "name": "南矿集团",
563
+ "sector": "专用设备",
564
+ "board": "主板",
565
+ "open": 18.58,
566
+ "prevClose": 16.89,
567
+ "price": 18.58,
568
+ "auctionChgPct": 10.005920663114253,
569
+ "auctionVolRatio": 0.34013942850844564,
570
+ "yesterdayChgPct": -2.3134759976865205,
571
+ "trend": {
572
+ "maBull": false,
573
+ "newHigh20": false,
574
+ "newHigh60": false,
575
+ "slope20": -1.23294209634293
576
+ },
577
+ "p1": {
578
+ "auctionChgPct": 10.005920663114253,
579
+ "auctionVolRatio": 0.34013942850844564,
580
+ "highOpen": true,
581
+ "nearLimit": true,
582
+ "volOk": true,
583
+ "score": 1,
584
+ "ok": true
585
+ },
586
+ "p2": {
587
+ "yesterdayChgPct": -2.3134759976865205,
588
+ "auctionChgPct": 10.005920663114253,
589
+ "applicable": false,
590
+ "verdict": "非强势股",
591
+ "score": 0,
592
+ "risk": false
593
+ },
594
+ "p3": {
595
+ "ma5": 16.642,
596
+ "ma10": 17.173000000000002,
597
+ "ma20": 18.5015,
598
+ "ma60": 17.373333333333335,
599
+ "maBull": false,
600
+ "newHigh20": false,
601
+ "newHigh60": false,
602
+ "slope20": -1.23294209634293,
603
+ "volPriceUp": false,
604
+ "score": 0,
605
+ "ok": false
606
+ },
607
+ "label": "竞价涨停",
608
+ "risk": false,
609
+ "total": 35,
610
+ "scoreItems": {
611
+ "p1": 1,
612
+ "p2": 0,
613
+ "p3": 0
614
+ },
615
+ "stamp": "20261022142051",
616
+ "belowMin": 10
617
+ },
618
+ {
619
+ "code": "sz002212",
620
+ "name": "天融信",
621
+ "sector": "软件开发",
622
+ "board": "主板",
623
+ "open": 7.71,
624
+ "prevClose": 7.01,
625
+ "price": 7.15,
626
+ "auctionChgPct": 9.985734664764623,
627
+ "auctionVolRatio": 2.72469097228101,
628
+ "yesterdayChgPct": -0.8486562942008558,
629
+ "trend": {
630
+ "maBull": false,
631
+ "newHigh20": false,
632
+ "newHigh60": false,
633
+ "slope20": -0.027021167628641214
634
+ },
635
+ "p1": {
636
+ "auctionChgPct": 9.985734664764623,
637
+ "auctionVolRatio": 2.72469097228101,
638
+ "highOpen": true,
639
+ "nearLimit": true,
640
+ "volOk": true,
641
+ "score": 1,
642
+ "ok": true
643
+ },
644
+ "p2": {
645
+ "yesterdayChgPct": -0.8486562942008558,
646
+ "auctionChgPct": 9.985734664764623,
647
+ "applicable": false,
648
+ "verdict": "非强势股",
649
+ "score": 0,
650
+ "risk": false
651
+ },
652
+ "p3": {
653
+ "ma5": 6.9799999999999995,
654
+ "ma10": 7.192,
655
+ "ma20": 7.178999999999999,
656
+ "ma60": 6.730166666666664,
657
+ "maBull": false,
658
+ "newHigh20": false,
659
+ "newHigh60": false,
660
+ "slope20": -0.027021167628641214,
661
+ "volPriceUp": false,
662
+ "score": 0,
663
+ "ok": false
664
+ },
665
+ "label": "竞价涨停",
666
+ "risk": false,
667
+ "total": 35,
668
+ "scoreItems": {
669
+ "p1": 1,
670
+ "p2": 0,
671
+ "p3": 0
672
+ },
673
+ "stamp": "20261022142051",
674
+ "belowMin": 10
675
+ },
676
+ {
677
+ "code": "sz301221",
678
+ "name": "光庭信息",
679
+ "sector": "汽车零部件",
680
+ "board": "创业板",
681
+ "open": 28.68,
682
+ "prevClose": 26.3,
683
+ "price": 27.67,
684
+ "auctionChgPct": 9.049429657794672,
685
+ "auctionVolRatio": 4.573239112066979,
686
+ "yesterdayChgPct": 1.1927664486341083,
687
+ "trend": {
688
+ "maBull": false,
689
+ "newHigh20": false,
690
+ "newHigh60": false,
691
+ "slope20": -0.23298974041729253
692
+ },
693
+ "p1": {
694
+ "auctionChgPct": 9.049429657794672,
695
+ "auctionVolRatio": 4.573239112066979,
696
+ "highOpen": true,
697
+ "nearLimit": true,
698
+ "volOk": true,
699
+ "score": 1,
700
+ "ok": true
701
+ },
702
+ "p2": {
703
+ "yesterdayChgPct": 1.1927664486341083,
704
+ "auctionChgPct": 9.049429657794672,
705
+ "applicable": false,
706
+ "verdict": "非强势股",
707
+ "score": 0,
708
+ "risk": false
709
+ },
710
+ "p3": {
711
+ "ma5": 25.357999999999997,
712
+ "ma10": 25.749000000000002,
713
+ "ma20": 26.204,
714
+ "ma60": 27.061833333333322,
715
+ "maBull": false,
716
+ "newHigh20": false,
717
+ "newHigh60": false,
718
+ "slope20": -0.23298974041729253,
719
+ "volPriceUp": true,
720
+ "score": 0,
721
+ "ok": false
722
+ },
723
+ "label": "竞价涨停",
724
+ "risk": false,
725
+ "total": 35,
726
+ "scoreItems": {
727
+ "p1": 1,
728
+ "p2": 0,
729
+ "p3": 0
730
+ },
731
+ "stamp": "20261022142051",
732
+ "belowMin": 10
122
733
  }
123
734
  ],
124
735
  "close": null,
@@ -132,7 +743,7 @@
132
743
  "prevClose": 4.75,
133
744
  "price": 5.23,
134
745
  "auctionChgPct": 10.10526315789475,
135
- "auctionVolRatio": 1.6735267842371704,
746
+ "auctionVolRatio": 3.8293021870760677,
136
747
  "yesterdayChgPct": 9.953703703703699,
137
748
  "trend": {
138
749
  "maBull": true,
@@ -142,7 +753,7 @@
142
753
  },
143
754
  "p1": {
144
755
  "auctionChgPct": 10.10526315789475,
145
- "auctionVolRatio": 1.6735267842371704,
756
+ "auctionVolRatio": 3.8293021870760677,
146
757
  "highOpen": true,
147
758
  "nearLimit": true,
148
759
  "volOk": true,
@@ -178,7 +789,7 @@
178
789
  "p2": 1,
179
790
  "p3": 1
180
791
  },
181
- "stamp": "20261022115003",
792
+ "stamp": "20261022142048",
182
793
  "groupRank": 1,
183
794
  "bestInGroup": true,
184
795
  "groupSize": 1
@@ -192,7 +803,7 @@
192
803
  "prevClose": 13.19,
193
804
  "price": 14.51,
194
805
  "auctionChgPct": 9.931766489764971,
195
- "auctionVolRatio": 8.166654739328013,
806
+ "auctionVolRatio": 8.312967402583462,
196
807
  "yesterdayChgPct": 10.008340283569627,
197
808
  "trend": {
198
809
  "maBull": true,
@@ -202,7 +813,7 @@
202
813
  },
203
814
  "p1": {
204
815
  "auctionChgPct": 9.931766489764971,
205
- "auctionVolRatio": 8.166654739328013,
816
+ "auctionVolRatio": 8.312967402583462,
206
817
  "highOpen": true,
207
818
  "nearLimit": true,
208
819
  "volOk": true,
@@ -238,7 +849,7 @@
238
849
  "p2": 1,
239
850
  "p3": 1
240
851
  },
241
- "stamp": "20261022115010",
852
+ "stamp": "20261022142049",
242
853
  "groupRank": 1,
243
854
  "bestInGroup": true,
244
855
  "groupSize": 1
@@ -252,7 +863,7 @@
252
863
  "prevClose": 9.1,
253
864
  "price": 8.19,
254
865
  "auctionChgPct": 10.000000000000009,
255
- "auctionVolRatio": 2.7903327495621717,
866
+ "auctionVolRatio": 2.839307880910683,
256
867
  "yesterdayChgPct": 10.036275695284157,
257
868
  "trend": {
258
869
  "maBull": true,
@@ -262,7 +873,7 @@
262
873
  },
263
874
  "p1": {
264
875
  "auctionChgPct": 10.000000000000009,
265
- "auctionVolRatio": 2.7903327495621717,
876
+ "auctionVolRatio": 2.839307880910683,
266
877
  "highOpen": true,
267
878
  "nearLimit": true,
268
879
  "volOk": true,
@@ -298,7 +909,7 @@
298
909
  "p2": 1,
299
910
  "p3": 1
300
911
  },
301
- "stamp": "20261022114954",
912
+ "stamp": "20261022142051",
302
913
  "groupRank": 1,
303
914
  "bestInGroup": true,
304
915
  "groupSize": 1
@@ -312,7 +923,7 @@
312
923
  "prevClose": 10.19,
313
924
  "price": 11.21,
314
925
  "auctionChgPct": 10.009813542688928,
315
- "auctionVolRatio": 9.040166713455848,
926
+ "auctionVolRatio": 9.652169218476688,
316
927
  "yesterdayChgPct": 10.043196544276455,
317
928
  "trend": {
318
929
  "maBull": true,
@@ -322,7 +933,7 @@
322
933
  },
323
934
  "p1": {
324
935
  "auctionChgPct": 10.009813542688928,
325
- "auctionVolRatio": 9.040166713455848,
936
+ "auctionVolRatio": 9.652169218476688,
326
937
  "highOpen": true,
327
938
  "nearLimit": true,
328
939
  "volOk": true,
@@ -358,7 +969,7 @@
358
969
  "p2": 1,
359
970
  "p3": 0.94
360
971
  },
361
- "stamp": "20261022114945",
972
+ "stamp": "20261022142051",
362
973
  "groupRank": 1,
363
974
  "bestInGroup": true,
364
975
  "groupSize": 2
@@ -372,7 +983,7 @@
372
983
  "prevClose": 16.6,
373
984
  "price": 19.92,
374
985
  "auctionChgPct": 12.590361445783138,
375
- "auctionVolRatio": 0.8533113970793121,
986
+ "auctionVolRatio": 0.90933122693604,
376
987
  "yesterdayChgPct": 15.598885793871876,
377
988
  "trend": {
378
989
  "maBull": true,
@@ -382,7 +993,7 @@
382
993
  },
383
994
  "p1": {
384
995
  "auctionChgPct": 12.590361445783138,
385
- "auctionVolRatio": 0.8533113970793121,
996
+ "auctionVolRatio": 0.90933122693604,
386
997
  "highOpen": true,
387
998
  "nearLimit": true,
388
999
  "volOk": true,
@@ -418,7 +1029,7 @@
418
1029
  "p2": 1,
419
1030
  "p3": 0.74
420
1031
  },
421
- "stamp": "20261022115009",
1032
+ "stamp": "20261022142051",
422
1033
  "groupRank": 1,
423
1034
  "bestInGroup": true,
424
1035
  "groupSize": 1
@@ -430,9 +1041,9 @@
430
1041
  "board": "主板",
431
1042
  "open": 11.28,
432
1043
  "prevClose": 10.52,
433
- "price": 10.88,
1044
+ "price": 10.1,
434
1045
  "auctionChgPct": 7.2243346007604625,
435
- "auctionVolRatio": 1.8798338286199776,
1046
+ "auctionVolRatio": 2.272475903810422,
436
1047
  "yesterdayChgPct": 10.041841004184082,
437
1048
  "trend": {
438
1049
  "maBull": true,
@@ -442,7 +1053,7 @@
442
1053
  },
443
1054
  "p1": {
444
1055
  "auctionChgPct": 7.2243346007604625,
445
- "auctionVolRatio": 1.8798338286199776,
1056
+ "auctionVolRatio": 2.272475903810422,
446
1057
  "highOpen": true,
447
1058
  "nearLimit": false,
448
1059
  "volOk": true,
@@ -478,7 +1089,7 @@
478
1089
  "p2": 1,
479
1090
  "p3": 0.7
480
1091
  },
481
- "stamp": "20261022115012",
1092
+ "stamp": "20261022142051",
482
1093
  "groupRank": 1,
483
1094
  "bestInGroup": true,
484
1095
  "groupSize": 1
@@ -490,9 +1101,9 @@
490
1101
  "board": "主板",
491
1102
  "open": 11.2,
492
1103
  "prevClose": 10.24,
493
- "price": 9.92,
1104
+ "price": 9.69,
494
1105
  "auctionChgPct": 9.375,
495
- "auctionVolRatio": 1.7428483120986298,
1106
+ "auctionVolRatio": 2.103708536999515,
496
1107
  "yesterdayChgPct": 9.98925886143931,
497
1108
  "trend": {
498
1109
  "maBull": false,
@@ -502,7 +1113,7 @@
502
1113
  },
503
1114
  "p1": {
504
1115
  "auctionChgPct": 9.375,
505
- "auctionVolRatio": 1.7428483120986298,
1116
+ "auctionVolRatio": 2.103708536999515,
506
1117
  "highOpen": true,
507
1118
  "nearLimit": true,
508
1119
  "volOk": true,
@@ -538,7 +1149,7 @@
538
1149
  "p2": 1,
539
1150
  "p3": 0.33
540
1151
  },
541
- "stamp": "20261022115031",
1152
+ "stamp": "20261022142049",
542
1153
  "groupRank": 1,
543
1154
  "bestInGroup": true,
544
1155
  "groupSize": 1
@@ -550,9 +1161,9 @@
550
1161
  "board": "主板",
551
1162
  "open": 13.93,
552
1163
  "prevClose": 12.69,
553
- "price": 12.95,
1164
+ "price": 12.4,
554
1165
  "auctionChgPct": 9.771473601260826,
555
- "auctionVolRatio": 5.597470178528541,
1166
+ "auctionVolRatio": 6.381101059429456,
556
1167
  "yesterdayChgPct": 9.965337954939347,
557
1168
  "trend": {
558
1169
  "maBull": false,
@@ -562,7 +1173,7 @@
562
1173
  },
563
1174
  "p1": {
564
1175
  "auctionChgPct": 9.771473601260826,
565
- "auctionVolRatio": 5.597470178528541,
1176
+ "auctionVolRatio": 6.381101059429456,
566
1177
  "highOpen": true,
567
1178
  "nearLimit": true,
568
1179
  "volOk": true,
@@ -598,7 +1209,7 @@
598
1209
  "p2": 1,
599
1210
  "p3": 0.3
600
1211
  },
601
- "stamp": "20261022115026",
1212
+ "stamp": "20261022142050",
602
1213
  "groupRank": 1,
603
1214
  "bestInGroup": true,
604
1215
  "groupSize": 1
@@ -612,7 +1223,7 @@
612
1223
  "prevClose": 2.45,
613
1224
  "price": 2.7,
614
1225
  "auctionChgPct": 10.20408163265305,
615
- "auctionVolRatio": 4.659511494800941,
1226
+ "auctionVolRatio": 5.685601285850272,
616
1227
  "yesterdayChgPct": 9.865470852017943,
617
1228
  "trend": {
618
1229
  "maBull": false,
@@ -622,7 +1233,7 @@
622
1233
  },
623
1234
  "p1": {
624
1235
  "auctionChgPct": 10.20408163265305,
625
- "auctionVolRatio": 4.659511494800941,
1236
+ "auctionVolRatio": 5.685601285850272,
626
1237
  "highOpen": true,
627
1238
  "nearLimit": true,
628
1239
  "volOk": true,
@@ -658,7 +1269,7 @@
658
1269
  "p2": 1,
659
1270
  "p3": 0.3
660
1271
  },
661
- "stamp": "20261022115030",
1272
+ "stamp": "20261022142051",
662
1273
  "groupRank": 2,
663
1274
  "bestInGroup": false,
664
1275
  "groupSize": 2
@@ -672,7 +1283,7 @@
672
1283
  "prevClose": 15.38,
673
1284
  "price": 16.92,
674
1285
  "auctionChgPct": 10.013003901170347,
675
- "auctionVolRatio": 3.5998863962811103,
1286
+ "auctionVolRatio": 3.8582434514637907,
676
1287
  "yesterdayChgPct": 10.014306151645203,
677
1288
  "trend": {
678
1289
  "maBull": false,
@@ -682,7 +1293,7 @@
682
1293
  },
683
1294
  "p1": {
684
1295
  "auctionChgPct": 10.013003901170347,
685
- "auctionVolRatio": 3.5998863962811103,
1296
+ "auctionVolRatio": 3.8582434514637907,
686
1297
  "highOpen": true,
687
1298
  "nearLimit": true,
688
1299
  "volOk": true,
@@ -718,7 +1329,7 @@
718
1329
  "p2": 1,
719
1330
  "p3": 0
720
1331
  },
721
- "stamp": "20261022115001",
1332
+ "stamp": "20261022142046",
722
1333
  "groupRank": 1,
723
1334
  "bestInGroup": true,
724
1335
  "groupSize": 1
@@ -732,7 +1343,7 @@
732
1343
  "prevClose": 7.8,
733
1344
  "price": 8.58,
734
1345
  "auctionChgPct": 5.769230769230771,
735
- "auctionVolRatio": 4.304430886793615,
1346
+ "auctionVolRatio": 4.387771223045766,
736
1347
  "yesterdayChgPct": 10.014104372355437,
737
1348
  "trend": {
738
1349
  "maBull": true,
@@ -742,7 +1353,7 @@
742
1353
  },
743
1354
  "p1": {
744
1355
  "auctionChgPct": 5.769230769230771,
745
- "auctionVolRatio": 4.304430886793615,
1356
+ "auctionVolRatio": 4.387771223045766,
746
1357
  "highOpen": true,
747
1358
  "nearLimit": false,
748
1359
  "volOk": true,
@@ -778,7 +1389,7 @@
778
1389
  "p2": 0.7,
779
1390
  "p3": 0.49
780
1391
  },
781
- "stamp": "20261022115018",
1392
+ "stamp": "20261022142048",
782
1393
  "groupRank": 1,
783
1394
  "bestInGroup": true,
784
1395
  "groupSize": 2
@@ -790,9 +1401,9 @@
790
1401
  "board": "主板",
791
1402
  "open": 60,
792
1403
  "prevClose": 56.12,
793
- "price": 58.06,
1404
+ "price": 57.53,
794
1405
  "auctionChgPct": 6.913756236635793,
795
- "auctionVolRatio": 1.8411708953047536,
1406
+ "auctionVolRatio": 2.3222982543848687,
796
1407
  "yesterdayChgPct": 9.992163009404397,
797
1408
  "trend": {
798
1409
  "maBull": false,
@@ -802,7 +1413,7 @@
802
1413
  },
803
1414
  "p1": {
804
1415
  "auctionChgPct": 6.913756236635793,
805
- "auctionVolRatio": 1.8411708953047536,
1416
+ "auctionVolRatio": 2.3222982543848687,
806
1417
  "highOpen": true,
807
1418
  "nearLimit": false,
808
1419
  "volOk": true,
@@ -838,7 +1449,7 @@
838
1449
  "p2": 0.7,
839
1450
  "p3": 0.3
840
1451
  },
841
- "stamp": "20261022115021",
1452
+ "stamp": "20261022142051",
842
1453
  "groupRank": 1,
843
1454
  "bestInGroup": true,
844
1455
  "groupSize": 1
@@ -850,9 +1461,9 @@
850
1461
  "board": "主板",
851
1462
  "open": 11.49,
852
1463
  "prevClose": 11.14,
853
- "price": 10.75,
1464
+ "price": 10.27,
854
1465
  "auctionChgPct": 3.1418312387791802,
855
- "auctionVolRatio": 2.4050614621798636,
1466
+ "auctionVolRatio": 3.0640154071537915,
856
1467
  "yesterdayChgPct": 9.970384995064151,
857
1468
  "trend": {
858
1469
  "maBull": true,
@@ -862,7 +1473,7 @@
862
1473
  },
863
1474
  "p1": {
864
1475
  "auctionChgPct": 3.1418312387791802,
865
- "auctionVolRatio": 2.4050614621798636,
1476
+ "auctionVolRatio": 3.0640154071537915,
866
1477
  "highOpen": true,
867
1478
  "nearLimit": false,
868
1479
  "volOk": true,
@@ -898,7 +1509,7 @@
898
1509
  "p2": 0.7,
899
1510
  "p3": 0.73
900
1511
  },
901
- "stamp": "20261022114942",
1512
+ "stamp": "20261022142054",
902
1513
  "groupRank": 2,
903
1514
  "bestInGroup": false,
904
1515
  "groupSize": 2
@@ -910,9 +1521,9 @@
910
1521
  "board": "创业板",
911
1522
  "open": 5.96,
912
1523
  "prevClose": 5.63,
913
- "price": 6.2,
1524
+ "price": 6.36,
914
1525
  "auctionChgPct": 5.861456483126104,
915
- "auctionVolRatio": 1.3054835796871014,
1526
+ "auctionVolRatio": 1.6557754091173795,
916
1527
  "yesterdayChgPct": 20.04264392324093,
917
1528
  "trend": {
918
1529
  "maBull": false,
@@ -922,7 +1533,7 @@
922
1533
  },
923
1534
  "p1": {
924
1535
  "auctionChgPct": 5.861456483126104,
925
- "auctionVolRatio": 1.3054835796871014,
1536
+ "auctionVolRatio": 1.6557754091173795,
926
1537
  "highOpen": true,
927
1538
  "nearLimit": false,
928
1539
  "volOk": true,
@@ -958,7 +1569,7 @@
958
1569
  "p2": 0.7,
959
1570
  "p3": 0.3
960
1571
  },
961
- "stamp": "20261022115012",
1572
+ "stamp": "20261022142051",
962
1573
  "groupRank": 1,
963
1574
  "bestInGroup": true,
964
1575
  "groupSize": 1
@@ -970,9 +1581,9 @@
970
1581
  "board": "主板",
971
1582
  "open": 10.18,
972
1583
  "prevClose": 9.68,
973
- "price": 9.35,
1584
+ "price": 9.22,
974
1585
  "auctionChgPct": 5.165289256198347,
975
- "auctionVolRatio": 7.1302517231045845,
1586
+ "auctionVolRatio": 8.060967935271202,
976
1587
  "yesterdayChgPct": 9.999999999999986,
977
1588
  "trend": {
978
1589
  "maBull": false,
@@ -982,7 +1593,7 @@
982
1593
  },
983
1594
  "p1": {
984
1595
  "auctionChgPct": 5.165289256198347,
985
- "auctionVolRatio": 7.1302517231045845,
1596
+ "auctionVolRatio": 8.060967935271202,
986
1597
  "highOpen": true,
987
1598
  "nearLimit": false,
988
1599
  "volOk": true,
@@ -1018,7 +1629,7 @@
1018
1629
  "p2": 0.7,
1019
1630
  "p3": 0.3
1020
1631
  },
1021
- "stamp": "20261022114948",
1632
+ "stamp": "20261022142051",
1022
1633
  "groupRank": 1,
1023
1634
  "bestInGroup": true,
1024
1635
  "groupSize": 1
@@ -1030,9 +1641,9 @@
1030
1641
  "board": "主板",
1031
1642
  "open": 8.11,
1032
1643
  "prevClose": 7.61,
1033
- "price": 7.85,
1644
+ "price": 7.25,
1034
1645
  "auctionChgPct": 6.570302233902758,
1035
- "auctionVolRatio": 2.692484418435969,
1646
+ "auctionVolRatio": 3.0170273099935345,
1036
1647
  "yesterdayChgPct": 9.97109826589595,
1037
1648
  "trend": {
1038
1649
  "maBull": false,
@@ -1042,7 +1653,7 @@
1042
1653
  },
1043
1654
  "p1": {
1044
1655
  "auctionChgPct": 6.570302233902758,
1045
- "auctionVolRatio": 2.692484418435969,
1656
+ "auctionVolRatio": 3.0170273099935345,
1046
1657
  "highOpen": true,
1047
1658
  "nearLimit": false,
1048
1659
  "volOk": true,
@@ -1078,7 +1689,7 @@
1078
1689
  "p2": 0.7,
1079
1690
  "p3": 0.03
1080
1691
  },
1081
- "stamp": "20261022115012",
1692
+ "stamp": "20261022142051",
1082
1693
  "groupRank": 1,
1083
1694
  "bestInGroup": true,
1084
1695
  "groupSize": 1
@@ -1090,9 +1701,9 @@
1090
1701
  "board": "主板",
1091
1702
  "open": 8.95,
1092
1703
  "prevClose": 8.48,
1093
- "price": 8.53,
1704
+ "price": 8.12,
1094
1705
  "auctionChgPct": 5.54245283018866,
1095
- "auctionVolRatio": 3.310637606430227,
1706
+ "auctionVolRatio": 3.761221483198648,
1096
1707
  "yesterdayChgPct": 9.987029831387817,
1097
1708
  "trend": {
1098
1709
  "maBull": false,
@@ -1102,7 +1713,7 @@
1102
1713
  },
1103
1714
  "p1": {
1104
1715
  "auctionChgPct": 5.54245283018866,
1105
- "auctionVolRatio": 3.310637606430227,
1716
+ "auctionVolRatio": 3.761221483198648,
1106
1717
  "highOpen": true,
1107
1718
  "nearLimit": false,
1108
1719
  "volOk": true,
@@ -1138,7 +1749,7 @@
1138
1749
  "p2": 0.7,
1139
1750
  "p3": 0
1140
1751
  },
1141
- "stamp": "20261022115015",
1752
+ "stamp": "20261022142051",
1142
1753
  "groupRank": 1,
1143
1754
  "bestInGroup": true,
1144
1755
  "groupSize": 1
@@ -1150,9 +1761,9 @@
1150
1761
  "board": "创业板",
1151
1762
  "open": 8.02,
1152
1763
  "prevClose": 7.57,
1153
- "price": 7.84,
1764
+ "price": 7.68,
1154
1765
  "auctionChgPct": 5.944517833553498,
1155
- "auctionVolRatio": 1.3023706789984113,
1766
+ "auctionVolRatio": 1.4714892903442183,
1156
1767
  "yesterdayChgPct": -2.699228791773778,
1157
1768
  "trend": {
1158
1769
  "maBull": true,
@@ -1162,7 +1773,7 @@
1162
1773
  },
1163
1774
  "p1": {
1164
1775
  "auctionChgPct": 5.944517833553498,
1165
- "auctionVolRatio": 1.3023706789984113,
1776
+ "auctionVolRatio": 1.4714892903442183,
1166
1777
  "highOpen": true,
1167
1778
  "nearLimit": false,
1168
1779
  "volOk": true,
@@ -1198,7 +1809,7 @@
1198
1809
  "p2": 0,
1199
1810
  "p3": 0.7
1200
1811
  },
1201
- "stamp": "20261022115012",
1812
+ "stamp": "20261022142051",
1202
1813
  "groupRank": 1,
1203
1814
  "bestInGroup": true,
1204
1815
  "groupSize": 1
@@ -4,6 +4,9 @@
4
4
  * ---------------------------------------------------------------------------
5
5
  * 一天一份文件:preopen/data/preopen-YYYYMMDD.json
6
6
  * - records: code -> 候选明细(含 P1/P2/P3 分项、基线、标签、总分)
7
+ * - nearMiss: 贴线样本(总分落在 [minTotal-10, minTotal) 的 Top10,带完整分项)——
8
+ * 竞价特征无法事后从 K 线重建,被拒样本不留就无法回溯调「入选线」(2026-10-22 补)
9
+ * - meta.rejByReason: 各淘汰原因计数(漏斗/通过率分析)
7
10
  * - runs[]: 当日多次运行留痕(幂等:同文件整文件覆盖,records 按 code 唯一)
8
11
  * - close:收盘回填后追加当日收盘/涨跌幅/是否涨停/命中标记(preopen_backfill.js)
9
12
  *
@@ -27,10 +30,13 @@ function loadRun(cfg, tradeDate) {
27
30
 
28
31
  /**
29
32
  * 落库(幂等:同文件整文件覆盖,runs[] 追加本次运行)。
30
- * @param {object} p { cfg, tradeDate, scope, candidates, meta, marketDate }
33
+ * @param {object} p { cfg, tradeDate, scope, candidates, nearMiss?, rejByReason?, meta, marketDate }
34
+ * - nearMiss:贴线样本(总分 [minTotal-10, minTotal) 的 Top10,带完整分项),
35
+ * 供日后调「入选线」用;竞价特征无法事后重建,必须运行时留。语义 = 最近一次运行覆盖。
36
+ * - rejByReason:各淘汰原因计数(漏斗分析用)。
31
37
  * @returns {{file, recordCount, runCount}}
32
38
  */
33
- function saveRun({ cfg, tradeDate, scope, candidates, meta, marketDate }) {
39
+ function saveRun({ cfg, tradeDate, scope, candidates, nearMiss, rejByReason, meta, marketDate }) {
34
40
  const dir = path.join(paths.eodDir(), cfg.store.dataDir);
35
41
  fs.mkdirSync(dir, { recursive: true });
36
42
  const f = dataFile(cfg, tradeDate);
@@ -55,10 +61,13 @@ function saveRun({ cfg, tradeDate, scope, candidates, meta, marketDate }) {
55
61
  marketDate,
56
62
  meta: Object.assign({}, meta, { recordCount: Object.keys(records).length, runCount: runs.length }),
57
63
  runs,
64
+ // 贴线样本(最近一次运行覆盖);rejByReason 挂在 meta 里
65
+ nearMiss: Array.isArray(nearMiss) ? nearMiss : (prev.nearMiss || []),
58
66
  // 保留历史回填结果(若有)
59
67
  close: prev.close || null,
60
68
  records,
61
69
  };
70
+ if (rejByReason && Object.keys(rejByReason).length) doc.meta.rejByReason = rejByReason;
62
71
  fs.writeFileSync(f, JSON.stringify(doc, null, 2), 'utf8');
63
72
  return { file: f, recordCount: doc.meta.recordCount, runCount: runs.length };
64
73
  }
@@ -249,6 +249,7 @@ async function run() {
249
249
  // 规则 + 打分
250
250
  log('[3/4] 应用 P1/P2/P3 打分…');
251
251
  const candidates = [];
252
+ const nearMissAll = [];
252
253
  const gaps = [];
253
254
  for (const q of quotes) {
254
255
  const b = baseline.get(q.code);
@@ -261,10 +262,8 @@ async function run() {
261
262
  const p2 = PR.calcP2(q, b, cfg);
262
263
  const p3 = PR.calcP3(b, cfg);
263
264
  const sc = PR.scorePreopen(p1, p2, p3, cfg);
264
- if (sc.total < cfg.score.minTotal) continue;
265
-
266
265
  const sector = sectorOf(map, q.code) || UNKNOWN;
267
- candidates.push({
266
+ const rec = {
268
267
  code: q.code, name: q.name, sector,
269
268
  board: /sh68[89]/.test(q.code) ? '科创板' : /^sz30/.test(q.code) ? '创业板' : /^bj/.test(q.code) ? '北交所' : '主板',
270
269
  open: q.open, prevClose: q.prevClose, price: q.price,
@@ -277,9 +276,23 @@ async function run() {
277
276
  total: +sc.total.toFixed(1),
278
277
  scoreItems: { p1: +p1.score.toFixed(2), p2: +p2.score.toFixed(2), p3: +p3.score.toFixed(2) },
279
278
  stamp: q.stamp,
280
- });
279
+ };
280
+ if (sc.total < cfg.score.minTotal) {
281
+ // 贴线样本(2026-10-22 补):总分落在 [minTotal-10, minTotal) 的进归档 nearMiss 段。
282
+ // 竞价量比等特征无法事后从 K 线重建,被拒样本不留就无法回溯调「入选线」本身。
283
+ if (sc.total >= cfg.score.minTotal - 10) {
284
+ nearMissAll.push(Object.assign(rec, { belowMin: +(cfg.score.minTotal - sc.total).toFixed(1) }));
285
+ }
286
+ continue;
287
+ }
288
+ candidates.push(rec);
281
289
  }
282
290
  candidates.sort((a, b) => b.total - a.total);
291
+ nearMissAll.sort((a, b) => b.total - a.total);
292
+ const nearMiss = nearMissAll.slice(0, 10);
293
+ // 各淘汰原因计数(gaps 明细不落盘,只留统计——6000+ 只/天的明细太肥且没用)
294
+ const rejByReason = {};
295
+ for (const g of gaps) rejByReason[g.reason] = (rejByReason[g.reason] || 0) + 1;
283
296
 
284
297
  // 分组
285
298
  const bySector = new Map();
@@ -297,8 +310,9 @@ async function run() {
297
310
 
298
311
  const result = {
299
312
  candidates, groups, top: candidates.slice(0, cfg.group.topN),
300
- stats: { snapshotCount: quotes.length, baselineCount: baseline.size, candidateCount: candidates.length, groupCount: groups.length, gapCount: gaps.length },
313
+ stats: { snapshotCount: quotes.length, baselineCount: baseline.size, candidateCount: candidates.length, groupCount: groups.length, gapCount: gaps.length, rejByReason },
301
314
  gaps,
315
+ nearMiss,
302
316
  };
303
317
 
304
318
  log(`[4/4] 落库 + 报告 + 通知…`);
@@ -309,6 +323,7 @@ async function emitResult(p) {
309
323
  const { tradeDate, scope, result, marketDate } = p;
310
324
  const saved = store.saveRun({
311
325
  cfg, tradeDate, scope, candidates: result.candidates,
326
+ nearMiss: result.nearMiss, rejByReason: result.stats.rejByReason,
312
327
  meta: { snapshotCount: result.stats.snapshotCount, baselineCount: p.baselineCount, validQuotes: p.quotesCount, marketDate, elapsedMs: Date.now() - (p._t0 || Date.now()) },
313
328
  marketDate,
314
329
  });
@@ -30,7 +30,10 @@ const RANGES = [
30
30
  ];
31
31
 
32
32
  module.exports = {
33
- version: 1,
33
+ // 口径版本:写进每日归档 JSON 顶层与报告页脚,参数/打分口径变更时 +1,
34
+ // 回溯按版本切段(v1 = 2026-09-18~10-21 六项打分含 sector;v2 = 2026-10-22 起五项 35/24/18/12/11 + 新门槛)。
35
+ // ⚠️ 新旧版本的总分/分项不可直接横向比较,复盘对比必须先按 version 分组。
36
+ version: 2,
34
37
 
35
38
  // =========================================================================
36
39
  // 1. 交易时段(FR-01 / Q1:不依赖外部日历,靠行情时间戳 + 本地时钟判断)
@@ -212,6 +215,9 @@ module.exports = {
212
215
  // 观察模式(14:30~14:50)另存 eod-<交易日>-obs.json,不污染正式口径;
213
216
  // 一天一个文件,多次观察靠 runs[] 留痕(--stamp 才会在文件名里带时点)。
214
217
  keepRunHistory: 20, // 每个文件最多保留多少条运行历史
218
+ // raw/(快照+分时原始存档)**永久保留**(2026-10-22 确认):
219
+ // 它是「改打分权重后离线重算历史」的唯一凭据(.tmp/smoke_newcfg.js 即靠它冒烟),
220
+ // 单份几 MB,磁盘成本可忽略;删除 = 该日历史永远只能按旧口径分析。
215
221
  },
216
222
 
217
223
  // =========================================================================
package/gen_candidates.js CHANGED
@@ -50,7 +50,7 @@ const paths = require('./paths');
50
50
  const scaffold = require('./scaffold');
51
51
  // 规则引擎纯函数(R01/R07/R05/行业中位数/成交量单位/时区锚定)统一走 rules.js,
52
52
  // 单测见 rules.test.js,避免与 gen_candidates 内联实现漂移导致双份真相。
53
- const { lastClosedTradingDay, nextTradingDay, calcTurnover, computeSectors, calcR01, isLaggard, verifyR05 } = require('./rules');
53
+ const { lastClosedTradingDay, nextTradingDay, calcTurnover, computeSectors, calcR01, isLaggard, verifyR05, G } = require('./rules');
54
54
 
55
55
  // ---------- 数据源:腾讯公开行情接口(无需任何第三方 CLI / 内置技能)----------
56
56
  const QT_QUOTE = 'https://qt.gtimg.cn/q=';
@@ -423,6 +423,10 @@ async function main() {
423
423
  paths.ensureDir(path.dirname(snapshotPath)); // --dump 指向新目录时也要能写出去
424
424
  const snap = {
425
425
  anchor, target, limit, topN,
426
+ generatedAt: new Date().toISOString(),
427
+ // 快照当时的规则常量(rules.js G):日后调参(如 CHG_MIN 3→4)时,
428
+ // 历史门槛可按当时的常量重算,也可按新常量对 stocks[].chg 等原始值离线重切。
429
+ rulesG: { ...G },
426
430
  breadth, breadthIsAnchor, overview,
427
431
  stocks: stocks.map(s => { const c = Object.assign({}, s); delete c.kline; delete c.quote; delete c.minute; return c; }),
428
432
  sectors: validSectors.map(s => { const c = Object.assign({}, s); delete c.members; return c; }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "candidate-pool",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "A股短线选股工具包:次日候选池初筛(R01 量能验证突破 + R07 板块内补涨)与尾盘选股(14:50 口径),数据取自腾讯公开行情接口,输出单文件双语 HTML 报告",
5
5
  "bin": {
6
6
  "candidate-pool": "bin/candidate-pool.js",