观潮自省记:52 条信号回头看,AI 引擎学会了第四条纪律

观潮自省记:52 条信号回头看,AI 引擎学会了第四条纪律

接上回:观潮锐评记——让 AI 从「改语气」到「做判断」。

那篇讲的是喂给 LLM 更多数据。这篇讲的是另一件事:让系统回头看自己的成绩单,然后改自己的行为。

成绩单:52 条信号的 X 光片

观潮运行了 12 天(3/12 → 3/23),积累了 52 条信号,其中 18 条完成了 5 天回填。先看全貌:

指标数值
总信号52 条
5d 已回填18 条
5d 胜率14/18 = 77.8%
10d / 20d尚未到期

比上次的 76.9% 略有上升,新增了 5 条回填数据。

但 77.8% 这个数字本身不是重点。重点是——哪些对了,哪些错了,为什么?

Bear 体制下的完美战绩

先说好消息。按市场体制拆分后,有个数字非常醒目:

体制信号数已回填胜率
bear (熊市)287100%
mild_bull (温和牛)9978%
mild_bear (温和熊)1310%(样本=1)

Bear 体制下 7 判 7 中。

这说明什么?在趋势明确的市场里,观潮的判断非常靠谱。 熊市里该跌的果然跌了,系统没有逆势看多。这其实验证了当初设计「体制感知」的核心假设——体制是被忽略的上下文,横盘市里什么都是观望,但趋势市里信号就是信号。

翻车现场:威海广泰的两次 -9.3%

再说坏消息。18 条回填里有 4 条判错,其中 2 条来自同一只股票:

2026-03-15 | 002111 威海广泰 | score=+40 看多 | @10.93 → 5d=-9.3% ❌
2026-03-15 | 002111 威海广泰 | score=+45 看多 | @10.93 → 5d=-9.3% ❌

3 月 15 日,观潮给威海广泰打了 +40 和 +45 分,方向「看多」。五天后暴跌了 9.3%。

有意思的是,它自己在 3/12、3/13 还给威海广泰打的是 -32、-47、-60 分(看空),全对。到了 3/15 突然翻多,就翻车了。

同一时期,锦浪科技也翻多了:

2026-03-15 | 300763 锦浪科技 | score=+92 看多 | @103.16 → 5d=+15.8% ✅

评分 +92,五天后涨了 15.8%,大获全胜。

这两个案例放在一起,规律就很清楚了:

威海广泰 +40/+45 → 翻车 锦浪科技 +92 → 穿越

冲突信号:隐藏的关键线索

光看分数还不够。我去翻了这些信号的冲突检测记录:

威海广泰 3/15(翻车):

  • ⚠️ 技术面偏多但主力资金在流出,可能是诱多
  • 📉 个股技术面强但大盘偏弱,逆势走强需关注持续性

锦浪科技 3/15(穿越):

  • ⚠️ 技术面偏多但主力资金在流出,可能是诱多
  • 📉 个股技术面强但大盘偏弱,逆势走强需关注持续性

一模一样的冲突,一个翻车一个穿越。

区别在哪?分数。威海广泰只有 +40/+45,说明看多的理由很勉强,多空博弈中多头只勉强赢了一点点。锦浪科技 +92,看多的理由压倒性地强——技术面、均线、动量全线看多,即使主力在出货,大趋势也能碾过去。

规律:高分(|score| ≥ 50)能穿越冲突,低分(|score| < 50)穿不过去。

换个说法:当系统自己都不太确定(评分低),又检测到了矛盾信号(冲突存在),这种时候的判断大概率是错的。

从数据到规则:护栏第四条

观潮原来有三条行为护栏:

  1. 🚨 追高检测:近 5 日涨幅超 8%(美股 15%)
  2. 📊 分析频次提醒:一天分析超 5 只不同票
  3. 🎣 抄底警告:连续 3 次看空还在反复查看

现在,基于回填数据,我加了第四条:

规则 4:⚠️ 冲突 + 低分 = 不交易

触发条件:|score| < 50 且存在矛盾信号(conflicts 非空)

def _check_conflict_low_score(score: int, conflicts: list[dict] | None) -> dict | None:
    """冲突+低分检测:有矛盾信号且评分绝对值<50时,历史数据表明胜率极低"""
    if not conflicts:
        return None
    abs_score = abs(score)
    if abs_score >= 50:
        return None
    conflict_descs = [c.get("description", "") for c in conflicts]
    conflict_text = ";".join(conflict_descs)
    return {
        "type": "conflict_low_conviction",
        "severity": "high",
        "message": f"⚠️ 信号矛盾 + 低置信度:评分仅 {score:+d}(|{abs_score}| < 50)"
                   f"且存在矛盾信号({conflict_text})。"
                   f"历史回测显示此类信号胜率显著低于平均水平。",
        "advice": "多空拉锯且系统没有明确倾向,建议观望。"
                  "等评分绝对值 > 50 或冲突消除后再考虑操作。",
    }

改动很小:3 个文件,31 行代码。guardrails.py 新增规则函数,server.py 把 adjusted_score 和 conflicts 传进去。commit d5e24c9,Azure VM 即时部署。

效果验证:如果当时有这条规则——

信号score冲突是否拦截实际走势
威海广泰 3/15+40✅ 有✅ 会被拦-9.3% 翻车
威海广泰 3/15+45✅ 有✅ 会被拦-9.3% 翻车
锦浪科技 3/15+92✅ 有❌ 不会被拦+15.8% 穿越
双汇发展 3/15+73✅ 有❌ 不会被拦+1.3% 小涨
陕西煤业 3/15+63✅ 有❌ 不会被拦+3.5% 小涨

两个翻车被拦住,三个正确不受影响。完美。

50 分的阈值从哪来?

有人可能会问:为什么是 50 不是 40 或 60?

坦率地说,这不是严格的统计优化,而是从案例中提炼的经验阈值。看数据:

  • 翻车案例:score = +40, +45(都 < 50)
  • 穿越案例:score = +92, +73, +63(都 ≥ 50)

50 恰好是分水岭。更严格地说,我需要更多样本才能精确校准。但在目前 18 条回填的数据量下,50 是个合理的起点。

这算过拟合吗?有这个风险。毕竟我是看着这 18 条数据定的规则。不过有两个理由让我觉得这个规则比较稳健:

  1. 逻辑自洽:系统自己都犹豫(低分)且检测到了矛盾(冲突),凭什么让用户去冒险?这不需要数据也说得通。
  2. 单调性:阈值不管定在 40 还是 60,都不改变规则的方向——分数越低、冲突越多,就越应该观望。50 只是「哪里画线」的问题,不是「要不要画线」的问题。

随着更多信号回填(下周三首批 10d 数据到期),这个阈值可以继续调整。

闭环的意义

观潮从 3/11 诞生到今天,第一次完成了一个完整的自我进化闭环:

记录信号 → 回填结果 → 分析规律 → 生成规则 → 部署上线
   ↑                                              |
   └──────────── 新信号继续记录 ←────────────────────┘

这比加任何新功能都重要。

做信号追踪的时候(第三篇),我写过一句话:「信号追踪系统现在只是在默默记分,但这些数据未来会成为改进引擎的燃料。」

今天兑现了。

第二篇写行为护栏的时候我也说过:「行为护栏比信号本身更值钱。」当时是直觉,现在有数据支撑了——拦住一次 -9.3% 的亏损,比抓到一次 +1% 的小涨有价值得多。

下一步

  • 3/26(周三):首批 10d 回填数据到期,更长的时间窗口会暴露更多规律
  • 持续积累:52 条信号里只有 18 条完成回填,需要至少 50+ 条才能认真对待统计数字
  • 阈值校准:随着样本增加,50 分的阈值可能需要微调
  • 更多规则?比如「bear 体制下的看多信号要打折」——数据还不够,先记着

观潮还很年轻,12 天,52 条信号。但它已经学会做一件很多人类投资者一辈子不做的事——回头看自己的判断对不对,然后改。


观潮系列:诞生记 → 进化记 → 实战记 → 验证记 → 出海记 → 锐评记 → 自省记

Comments