candidate-pool 2.2.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 +85 -0
- package/eod/data/preopen-2026-10-22.json +1818 -0
- package/eod/lib/market.js +50 -0
- package/eod/lib/preopen_report.js +418 -0
- package/eod/lib/preopen_rules.js +190 -0
- package/eod/lib/preopen_store.js +105 -0
- package/eod/lib/report.js +23 -15
- package/eod/lib/screen.js +13 -25
- package/eod/preopen.config.js +185 -0
- package/eod/preopen_backfill.js +87 -0
- package/eod/preopen_screener.js +375 -0
- package/eod/tail.config.js +46 -19
- package/gen_candidates.js +5 -1
- package/package.json +5 -1
package/eod/tail.config.js
CHANGED
|
@@ -30,7 +30,10 @@ const RANGES = [
|
|
|
30
30
|
];
|
|
31
31
|
|
|
32
32
|
module.exports = {
|
|
33
|
-
|
|
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:不依赖外部日历,靠行情时间戳 + 本地时钟判断)
|
|
@@ -103,15 +106,21 @@ module.exports = {
|
|
|
103
106
|
// 3. 初筛过滤(FR-03 / Q5–Q10)—— 尾盘口径 ≠ R01 隔夜口径,独立配置
|
|
104
107
|
// =========================================================================
|
|
105
108
|
filter: {
|
|
106
|
-
// 当日涨幅区间(%)。上限若放到 9% 会引入接近涨停买不到的标的(Q5
|
|
107
|
-
|
|
109
|
+
// 当日涨幅区间(%)。上限若放到 9% 会引入接近涨停买不到的标的(Q5)。
|
|
110
|
+
// 2026-10-22 回溯调参(docs/backtest/01-复盘.md):341 条候选分桶显示
|
|
111
|
+
// 2–3% 贴下限桶持一夜均 -1.11%、涨超 2% 命中率仅 8%(5–7% 桶 29%);
|
|
112
|
+
// 涨幅也是全部原始特征里与次日收益相关最强的(ρ=+0.150)。
|
|
113
|
+
// 故下限 2.0 → 3.0,把最弱的一段挡在门外。
|
|
114
|
+
chgPctMin: 3.0,
|
|
108
115
|
chgPctMax: 7.0,
|
|
109
116
|
// 量比下限(Q6)。14:50 的即时量比天然偏小,1.2 是「已有温和放量」的起点;
|
|
110
117
|
// 想更严可提到 1.5,想放宽可降到 1.0。
|
|
111
118
|
volRatioMin: 1.2,
|
|
112
|
-
// 换手率区间(%)(Q9
|
|
119
|
+
// 换手率区间(%)(Q9):过低无人气,过高警惕出货。
|
|
120
|
+
// 2026-10-22 回溯调参:10–20% 桶 30 只持一夜均 -3.70%、胜率仅 17%,
|
|
121
|
+
// 是全表最差的一段(换手与收益 ρ=-0.141)。上限 20 → 10。
|
|
113
122
|
turnoverMin: 2.0,
|
|
114
|
-
turnoverMax:
|
|
123
|
+
turnoverMax: 10.0,
|
|
115
124
|
// 流通市值区间(亿)(Q10):与 candidate-pool 现有口径一致,便于横向对照
|
|
116
125
|
floatCapMinYi: 20,
|
|
117
126
|
floatCapMaxYi: 500,
|
|
@@ -139,29 +148,44 @@ module.exports = {
|
|
|
139
148
|
},
|
|
140
149
|
|
|
141
150
|
// =========================================================================
|
|
142
|
-
// 5. 强度打分(FR-06 / Q11)—— 总分 100
|
|
151
|
+
// 5. 强度打分(FR-06 / Q11)—— 总分 100,五项可解释
|
|
152
|
+
// 2026-10-22 回溯调参(docs/backtest/01-复盘.md):
|
|
153
|
+
// · 删「板块强度」项:341 条候选中该项 100% 拿满 15 分(常量,零区分度),
|
|
154
|
+
// 还让环境组均分(32.8/35)反超个股自身组(29.1/65),分数被背景分主导;
|
|
155
|
+
// · 删除后余下五项按原权重比例重新分配并取整:30/20/15/10/10 → 35/24/18/12/11
|
|
156
|
+
// (不按相关系数加权——各分项 |ρ| 均 <0.1,那是噪声不是信号,比例分配最稳);
|
|
157
|
+
// · 总分本身与次日收益几乎不相关(ρ=+0.044),故新增 minTotal 只作粗过滤,
|
|
158
|
+
// 排序区分度请直接看涨幅(ρ=+0.150,报告已对 chg≥5% 加标记)。
|
|
143
159
|
// =========================================================================
|
|
144
160
|
score: {
|
|
145
161
|
weights: {
|
|
146
|
-
tailMomentum:
|
|
147
|
-
volume:
|
|
148
|
-
position:
|
|
149
|
-
avgLine:
|
|
150
|
-
|
|
151
|
-
turnoverFit: 10, // 换手适中度:3%–10% 满分,向两端递减
|
|
162
|
+
tailMomentum: 35, // 尾盘动能:14:30→14:50 涨幅线性映射,+2% 封顶
|
|
163
|
+
volume: 24, // 量能:量比 1.2 → 0 分,3.0 → 满分
|
|
164
|
+
position: 18, // 位置:距日内高点越近越高
|
|
165
|
+
avgLine: 12, // 均价线强度:现价 ÷ 均价 的超出幅度
|
|
166
|
+
turnoverFit: 11, // 换手适中度:3%–7% 满分,向两端递减
|
|
152
167
|
},
|
|
153
168
|
// 尾盘动能:段涨幅达到该值即拿满分(%)
|
|
154
169
|
tailMomentumFullPct: 2.0,
|
|
155
170
|
// 量能:达到该量比即满分
|
|
156
171
|
volRatioFull: 3.0,
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
//
|
|
172
|
+
// 均价线:超出均价该百分比即满分(%)。
|
|
173
|
+
// 2026-10-22 回溯调参:原 1.0% 时 89% 候选贴满分(均值 9.6/10),
|
|
174
|
+
// 该项已无区分度且与收益轻微负相关(ρ=-0.088)。满分线 1.0 → 1.5。
|
|
175
|
+
avgLineFullPct: 1.5,
|
|
176
|
+
// 换手适中区间(%):落在此区间满分。
|
|
177
|
+
// 2026-10-22 随 turnoverMax 20→10 同步由 10 → 7:
|
|
178
|
+
// 上限收窄后若甜区仍顶到 10%,3–10% 全满分,「过高警惕出货」的扣分就没了。
|
|
160
179
|
turnoverSweetLow: 3.0,
|
|
161
|
-
turnoverSweetHigh:
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
180
|
+
turnoverSweetHigh: 7.0,
|
|
181
|
+
// 候选入选总分下限(低于此不进报告)。
|
|
182
|
+
// 2026-10-22 回溯调参新增:旧分制下 45–55 分段 84 只持一夜均 -1.32%、命中 12%,
|
|
183
|
+
// 是全部分数段里最差的一段。删除 sector 常量项后总分整体下移约 7 分
|
|
184
|
+
// (均值 61.9 → 50.1),旧 55 的等效新总分 ≈ 47,故下限取 **47**
|
|
185
|
+
// (= 决策批准的切分线在新分制下的等效值;若照抄 55 会等效旧 ~59.4,
|
|
186
|
+
// 回溯显示边际收益仅 +1pt 命中率却再砍 36% 产量,不值)。
|
|
187
|
+
// 注:尾盘此前没有总分下限(初筛+分时校验过即入选),此项为新增。
|
|
188
|
+
minTotal: 47,
|
|
165
189
|
// 分时结构加分项(不计入 100 分,单独展示,避免权重膨胀)
|
|
166
190
|
// 段内上涨分钟占比低于该值时在报告中标注「尾盘拉升不连贯」
|
|
167
191
|
tailUpRatioWarn: 0.55,
|
|
@@ -191,6 +215,9 @@ module.exports = {
|
|
|
191
215
|
// 观察模式(14:30~14:50)另存 eod-<交易日>-obs.json,不污染正式口径;
|
|
192
216
|
// 一天一个文件,多次观察靠 runs[] 留痕(--stamp 才会在文件名里带时点)。
|
|
193
217
|
keepRunHistory: 20, // 每个文件最多保留多少条运行历史
|
|
218
|
+
// raw/(快照+分时原始存档)**永久保留**(2026-10-22 确认):
|
|
219
|
+
// 它是「改打分权重后离线重算历史」的唯一凭据(.tmp/smoke_newcfg.js 即靠它冒烟),
|
|
220
|
+
// 单份几 MB,磁盘成本可忽略;删除 = 该日历史永远只能按旧口径分析。
|
|
194
221
|
},
|
|
195
222
|
|
|
196
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
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "A股短线选股工具包:次日候选池初筛(R01 量能验证突破 + R07 板块内补涨)与尾盘选股(14:50 口径),数据取自腾讯公开行情接口,输出单文件双语 HTML 报告",
|
|
5
5
|
"bin": {
|
|
6
6
|
"candidate-pool": "bin/candidate-pool.js",
|
|
@@ -53,6 +53,10 @@
|
|
|
53
53
|
"tail:intraday": "node eod/tail_screener.js --intraday",
|
|
54
54
|
"tail:replay": "node eod/tail_screener.js --replay",
|
|
55
55
|
"tail:selftest": "node eod/lib/trading.selftest.js",
|
|
56
|
+
"preopen": "node eod/preopen_screener.js",
|
|
57
|
+
"preopen:watchlist": "node eod/preopen_screener.js --scope watchlist",
|
|
58
|
+
"preopen:baseline": "node eod/preopen_screener.js --baseline",
|
|
59
|
+
"preopen:backfill": "node eod/preopen_backfill.js",
|
|
56
60
|
"paths": "node gen_candidates.js --paths",
|
|
57
61
|
"paths:selftest": "node paths.selftest.js",
|
|
58
62
|
"init": "node gen_candidates.js --init",
|