接上回:观潮锐评记——让 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 (熊市) | 28 | 7 | 100% |
| mild_bull (温和牛) | 9 | 9 | 78% |
| mild_bear (温和熊) | 13 | 1 | 0%(样本=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)穿不过去。
换个说法:当系统自己都不太确定(评分低),又检测到了矛盾信号(冲突存在),这种时候的判断大概率是错的。
从数据到规则:护栏第四条
观潮原来有三条行为护栏:
- 🚨 追高检测:近 5 日涨幅超 8%(美股 15%)
- 📊 分析频次提醒:一天分析超 5 只不同票
- 🎣 抄底警告:连续 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 条数据定的规则。不过有两个理由让我觉得这个规则比较稳健:
- 逻辑自洽:系统自己都犹豫(低分)且检测到了矛盾(冲突),凭什么让用户去冒险?这不需要数据也说得通。
- 单调性:阈值不管定在 40 还是 60,都不改变规则的方向——分数越低、冲突越多,就越应该观望。50 只是「哪里画线」的问题,不是「要不要画线」的问题。
随着更多信号回填(下周三首批 10d 数据到期),这个阈值可以继续调整。
闭环的意义
观潮从 3/11 诞生到今天,第一次完成了一个完整的自我进化闭环:
记录信号 → 回填结果 → 分析规律 → 生成规则 → 部署上线
↑ |
└──────────── 新信号继续记录 ←────────────────────┘
这比加任何新功能都重要。
做信号追踪的时候(第三篇),我写过一句话:「信号追踪系统现在只是在默默记分,但这些数据未来会成为改进引擎的燃料。」
今天兑现了。
第二篇写行为护栏的时候我也说过:「行为护栏比信号本身更值钱。」当时是直觉,现在有数据支撑了——拦住一次 -9.3% 的亏损,比抓到一次 +1% 的小涨有价值得多。
下一步
- 3/26(周三):首批 10d 回填数据到期,更长的时间窗口会暴露更多规律
- 持续积累:52 条信号里只有 18 条完成回填,需要至少 50+ 条才能认真对待统计数字
- 阈值校准:随着样本增加,50 分的阈值可能需要微调
- 更多规则?比如「bear 体制下的看多信号要打折」——数据还不够,先记着
观潮还很年轻,12 天,52 条信号。但它已经学会做一件很多人类投资者一辈子不做的事——回头看自己的判断对不对,然后改。

