Files
Hermes-Skills/lottery-hk/references/2026-08-20-candidate-sparsity-diagnosis.md
T

5.1 KiB

候选数稀疏诊断 + 实装 fix (2026-08-20 v1.4.0)

触发

lottery_特码_cron.sh cron 推送出现以下信号:

  • "🏆 特码候选" 表只有 2-3 行(而非 5 行)
  • 用户问 "号码就这么两个吗?" / "候选号能不能多几个?"

用户偏好(2026-08-20 实锤)

用户原话: "可以 4-5 个号合适"

之前 (2026-08-20 上午) skill 建议是"尊重数据稀疏,不要硬凑"。用户直接说不要这个, 要 4-5 个号。实装 flip:

旧哲学 (尊重数据) 新哲学 (v1.4.0 实装, 用户向)
推送末尾加"⚠️ 今天稀疏" 直接补到 5 个, 末尾标"兜底占位"
不动 most_common(8) 显式补足 top.append((n, 0))
不解码 火烧/六肖 解码本年生肖号, +1/+2

不要重新回去 "尊重数据" 那套 — 用户否决过。

根因(参考, 已不再是阻断)

get_te_ma_candidates() 用 weights = Counter(), 最终候选数 = Counter 实际条数, 由 sol.2344a.cc 挂牌页决定:

字段 权重 命中率
正版彩图挂 (彩图挂直接给号) +5 ~50% (常只有 1-2 个号)
另版挂 +3 ~30%
尾数 X尾 +2 (本) / +1 (+10/+20/+30) ~70%
六肖 / 出肖 / 火烧 v1.4.0 起解码本年生肖号 (+1 / +2) 100%
玄机诗诗象 (NN) +3 ~60%
三一玄数 +2 (硬编码 3/1/13/31) 100%
六信红字 "大数偏多" +1 (25-49 全加) 100%

常见稀疏组合: 当天挂牌帖只发了 正版彩图挂 = 2, 9 两个号 → weights = {2:5, 9:5} → 2 个候选。

实装的 fix (3 改动一起)

1. 挂牌页抓取放宽

lottery_特码.py::get_te_ma_candidates() 第 198 行:

# ❌ 旧
gua_links = re.findall(...)[:3]
# ✅ 新 (v1.4.0)
gua_links = re.findall(...)[:8]

多抓几页挂牌, 挂牌稀疏时也有足够数据源。

2. 火烧/六肖 解码本年生肖号

之前 火烧 / 六肖 / 出肖 字段只记录不直接给号。现在加生肖→本数映射:

SX_TO_BENSHENG = {
    '鼠': 23, '牛': 22, '虎': 21, '兔': 20, '龙': 19, '蛇': 18,
    '马': 17, '羊': 16, '猴': 15, '鸡': 14, '狗': 13, '猪': 12,
}
# 火烧 命中某生肖 → 该号 +2 (本年生肖权重高)
# 六肖/出肖 每命中一个生肖 → 该号 +1

示例: 091 期挂牌 火烧=鸡 → 加 14 (+2 权重); 六肖=兔狗龙鼠牛蛇 → 加 20, 19, 22 (各 +1)。

3. format_te_ma_result 兜底

候选数 < 4 时, weights.most_common(8) + 显式补足到 5 个:

top = weights.most_common(8)
if len(top) < 4:
    need = 5 - len(top)
    existing = {n for n, _ in top}
    for n in range(1, 50):
        if n not in existing:
            top.append((n, 0))  # 权重 0 = 占位, 排最后
            existing.add(n)
            if len(top) >= 5:
                break

关键: most_common() 不返回权重 0 的号, 必须用 top.append((n, 0)) 显式扩展。

来源标记也得变 — get_src(num, w) 在 w == 0 时返回 "兜底占位 (挂牌稀疏)", 不再是 fallback "其他挂牌提示"。

验证 (2026-08-20 Nq=091 期)

跑 bash ~/.hermes/scripts/lottery_特码_cron.sh 输出 8 候选, 重点分配 5 个 ¥15=5/4/3/2/1:

排序 特码 权重 来源
🥇 35 4 挂牌 另版挂 (35) + 挂牌 尾数 5尾 (+30)
🥈 2 2 挂牌 尾数 2尾 (本)
🥉 22 2 挂牌 尾数 2尾 (+20) + 挂牌 六肖 牛=22
4 5 2 挂牌 尾数 5尾 (本)
5 14 2 挂牌 火烧 鸡=14 (本年生肖)
6 12 1 挂牌 尾数 2尾 (+10)
7 32 1 挂牌 尾数 2尾 (+30)
8 15 1 挂牌 尾数 5尾 (+10)

配套 wrapper 修复: cron Qi→Nq 二次修正

lottery_特码_cron.sh 第 9-19 行之前取 Qi (已开期), cron 推的是已开期 (无前瞻意义)。这次硬规则: d['Nq'] + fallback '088'。

# ❌ 旧
QI=$(... d['Qi'] ...)

# ✅ 新 (v1.4.0)
TARGET=$(... d['Nq'] ...)

改这两文件后必须 grep "Qi" 确认 runtime 路径全用 Nq。

配套 cron schedule 修复: verify_lottery 14:30→22:30

668dcf3ec54d lottery-draw-result 之前 schedule=30 14 * * 0,2,4 (= 北京 22:00, 开彩前 30 分钟), v_xg.json 还停在 Qi=089, 无 090 期数据 → verify 报"未找到分析文件"。改 30 22 * * 0,2,4 (北京 22:30, 开彩后 1 小时), 等 v_xg.json 更新到 Qi 后再跑。

回退条件

如果用户明确说 "不要兜底, 太离谱了" / "不要解码生肖, 玄学污染":

  • 删除 format_te_ma_result 里的 if len(top) < 4 块
  • 保留 (1) 挂牌抓 3→8 + (2) 火烧/六肖 解码本年生肖号
  • 保留 (3) cron wrapper Qi→Nq + verify schedule 修正 (这两个跟候选数无关)

跟单场景的类比

okx-auto-position 信号源缺失闸 (2026-08-18 v4.5.53) 是同种"数据告诉你没有就跳过"模式:

  • trader='未知' → 跳过,推"信号源未知", 不要硬凑 trader

两个 skill 区别:

  • lottery 候选: 用户明确要"补到 4-5 个号" → 兜底 ✅
  • okx 跟单 trader: 数据告诉你没有 trader → 跳过 ✅

判断标准:用户原话, 不是哲学一致性。