有一整类网站每天早上都会发布免费的足球预测:赛程列表、一个推荐,有时旁边还带一个百分比。很多人会看。但几乎没人会核查,因为核查很费事——你得先记录开球前预测了什么,等比赛结果出来,还得知道自己当时实际能拿到什么价格。
这恰好就是我们给 Telegram tipster 做审计时,基础设施本来就会做的事。所以我们把它接到两个更知名的免费网站上,Statarea 和 Zulubet,开始测量。
这篇文章不是结论。它只是方法,加上第一天的数据。现在就公开,是为了以后没人能说我们是等数字看起来顺眼了才开始计时。
第 5 步是大多数“验证”服务会跳过的部分,但也正是它决定了前面那些数字到底有没有意义。
| Statarea | Zulubet | |
|---|---|---|
| 读取的公开预测 | 65 | 82 |
| 匹配到我们覆盖的赛程 | 19 | 28 |
| 目前已结算 | 19 | 5 |
| 命中 | 7 | 2 |
| 准确率 | 36.8% | 40.0% |
| 这些推荐的平均赔率 | 2.10 | 2.21 |
| 所需打平准确率 | 47.6% | 45.3% |
两者都低于按其推荐赔率需要达到的准确率。而且这两个数字都没什么意义,因为 19 条和 5 条已结算预测只是噪音。一场好的比赛日就能让它们波动十个百分点。我们还是照样公开,因为另一种做法——默默等到样本对谁有利再发声——正是这个行业口碑的来源。
一个月后真正重要的是最后两列。单看准确率从来不能说明问题:一个网站如果只推荐短赔热门,命中率可以到 70%,但依然可能亏钱;我们在一个热门 AI tipster 的 25,890 场比赛上已经详细测过。真正决定结果的是:在你当时实际能拿到的赔率下,准确率是否高于打平线;更进一步,就是 closing line value。
第一天读到的 147 条预测里,我们能匹配 47 条。这不是它们或我们的失败——这些网站覆盖的联赛远多于我们定价的 83 个联赛。某个我们不覆盖的联赛上的预测,不能被诚实评分,所以要单独剔除并计数,而不是悄悄丢掉,或者更糟,把它算成输。
这和我们审计 Telegram tipster 时看到的模式一样:在 46 个频道里,我们读到 1,279 条公开推荐,只能结算其中 567 条。可测子集总是比宣传记录小;任何不告诉你样本规模的审计,都不是在让你核查,而是在让你信它。
Statarea 只给一个 tip。Zulubet 会给主胜、平局、客胜的概率,并高亮最大的那个——这比大多数免费网站给得更多,也让这个网站可以用更严格的方式核查。
概率是可以证伪的说法。如果一个预测者在几百次里都说 70%,那结果就应该大约有 70% 的时候发生。如果实际只有 50%,这个数字就只是装饰。我们现在把 Zulubet 发布的每一个概率都和最终结果一起存下来,这样过一段时间,这个页面就不仅能回答“有没有跑赢收盘价”,还能回答“它给出的概率到底有没有校准”——这也是我们对自己的模型做的同类测试。顺便说一句,我们当时是在它表现比市场更差之后才把它公开的。
这两个页面会随着数据更新,在每个网站至少累计 30 条已结算预测之前,不会给出结论:
如果数字最后对其中任何一家有利,我们会照实说。我们已经公开过自己的亏损周,公开过自己的模型在校准上比市场更差,也公开过一个测量 bug,曾让我们自己的 closing line value 短暂虚高了三十个百分点。公开测量的意义就在于:结果不是我们能挑的。
方法说明:预测每天只从网站公开页面读取一次,使用可识别的 user agent;原始页面私下归档,绝不重新发布。赛程匹配使用球队名称标准化和别名表;无法匹配的推荐记为不可验证,且落在我们未覆盖比赛上的推荐视为超出范围——两者都不算输。检测时价格是我们在读取当下持有的该选项最佳 soft-bookmaker 价格。closing line value = 检测价格 ÷ sharp 收盘价 − 1,且必须是同一市场。我们与这两个网站都没有隶属关系,也没有任何商业关系。