我做了半年 Polymarket BTC 5分钟交易机器人后,发现真正难的不是预测方向

做自动交易之前,我曾经认为,一个交易机器人的核心问题很简单:

能不能正确预测下一段行情是涨还是跌?

如果预测准确率足够高,那么剩下的事情似乎只是连接交易 API、下单,然后等待结果。

但在持续开发和测试一个 Polymarket BTC 5分钟 Up/Down 自动交易系统之后,我越来越觉得:

“预测方向”可能只是整个交易系统里最显眼的一层,却不是最难的一层。

真正困难的是:

当一个信号出现以后,系统应该如何判断这一次到底值不值得交易?

这也是我现在开发 PolyNexus 时越来越重视的一个原则:

Signal ≠ Trade

一个信号,不应该自动等于一笔交易。


一、BTC 5分钟市场看起来简单,实际上非常适合暴露系统问题

Polymarket 的 BTC 5分钟 Up/Down 市场,从表面上看非常直接。

每一个窗口只有两个结果:

  • Up

  • Down

时间也只有 5 分钟。

这很容易让人产生一种错觉:

只需要做一个分类模型,预测 Up 或 Down 就可以了。

但真正开始做系统以后,会发现问题远远不止这些。

例如:

  • 当前找到的是不是正确的市场?

  • 行情数据有没有中断?

  • 数据是否已经过期?

  • 信号出现以后,市场环境有没有改变?

  • 多个判断同时出现时应该相信谁?

  • 当前仓位应该是多少?

  • 账户余额是否允许交易?

  • 当前盘口价格是否仍然值得成交?

  • 订单到底有没有真正成交?

  • 部分成交怎么办?

  • 网络或者 API 出错以后怎么恢复?

  • 程序重启以后,之前的状态还能不能继续?

一个方向判断即使是正确的,只要其中任何一个环节出了问题,最后的实盘结果都可能完全不同。

所以后来我逐渐把这个项目从:

“BTC 方向预测机器人”

重新理解成:

一套围绕 BTC 5分钟市场运行的完整自动交易系统。

目前公开版本已经覆盖市场发现、数据检查、信号判断、状态管理、仓位、风险控制、订单执行、成交跟踪、结算、日志和运行恢复等多个环节。(GitHub)


二、真正的交易流程,比“预测 → 下单”长得多

如果把一个简单的交易 Bot 写成流程,大概是:

获取 BTC 数据
    ↓
判断 Up / Down
    ↓
下单

但我现在的系统更接近:

发现当前 BTC 5m 市场
        ↓
检查数据连续性和新鲜度
        ↓
生成候选判断
        ↓
结合历史状态和当前市场环境复核
        ↓
KEEP / ADJUST / STOP
        ↓
确定最终方向
        ↓
计算仓位
        ↓
账户和执行风险检查
        ↓
允许交易 / 阻止交易
        ↓
发送订单
        ↓
跟踪成交、失败或部分成交
        ↓
等待市场结算
        ↓
更新状态
        ↓
进入下一个 5 分钟窗口

这两个流程看起来只是多了几个步骤,但它们对应的是完全不同的设计思想。

前一种系统实际上认为:

只要信号成立,就应该交易。

后一种系统则把两个问题拆开:

第一,方向是什么?

以及:

第二,现在是否值得为这个方向承担风险?

我越来越认为,第二个问题至少和第一个问题一样重要。


三、交易机器人必须学会“不交易”

这也是我最近很关注的一个问题。

很多人评价一个交易机器人时,很自然会关注:

  • 胜率多高?

  • 一天交易多少次?

  • 捕捉多少机会?

但实际研究下来,我开始越来越重视另一个数字:

它拒绝了多少次交易?

因为市场不会永远处在适合某一种逻辑的环境里。

相同的价格变化,发生在:

  • 长时间低波动之后

  • 连续高波动期间

  • 震荡噪声环境

  • 突然发生结构变化的时候

意义可能完全不同。

因此,一个候选信号出现,并不意味着系统必须执行它。

最终结果可以是:

KEEP
保持当前判断

ADJUST
调整当前候选

STOP
不参与这个窗口

PolyNexus 当前公开历史回放中,18,633 个历史信号里有 348 次最终被系统 STOP,占约 1.87%。(GitHub)

这个比例本身并不是重点。

真正重要的是系统设计里的这个思想:

NO TRADE 也是一种合法的决策。

对于自动交易系统来说,“什么时候不要交易”,可能本身就是策略的一部分。


四、我越来越不相信“一个漂亮的回测数字”能说明全部问题

这是开发这个项目以后,我变化比较大的另一个观点。

很多量化研究最后会变成:

调整参数
↓
跑回测
↓
胜率提高
↓
继续调整
↓
找到一个漂亮数字

这样做最大的问题,是我们很容易在不知道的情况下,把历史数据里的偶然现象学进去。

PolyNexus 当前公开的历史代码回放区间为 2021-09-01 至 2026-09-01。

公开统计中:

  • 历史信号:18,633

  • 执行统计:18,285

  • STOP:348

  • 历史执行胜率:63.75%

  • 最长连续亏损:8

统计采用固定 +4 / -5 的标准化评分体系。(GitHub)

但我并不会把:

63.75% historical win rate

直接理解成:

实盘一定可以获得对应收益。

这是两个完全不同的概念。

原因很简单。

历史回放主要回答的是:

如果当前这套规则按照历史顺序运行,它的方向判断表现如何?

而真实交易还多了非常多变量,例如:

  • Polymarket 的真实成交价格

  • 买卖盘流动性

  • 手续费

  • 滑点

  • 网络延迟

  • API 状态

  • 部分成交

  • 下单失败

更重要的是,历史行情本身曾经参与过策略研究,因此整个五年区间不能被包装成一段完全没有接触过的纯 out-of-sample 数据。项目公开报告也明确保留了这个限制。(GitHub)

所以我现在越来越倾向于问:

这个回测到底证明了什么?

而不是:

这个回测数字看起来够不够漂亮?


五、没有“偷看未来”,也不代表没有过拟合

这是一个很容易被忽略的问题。

量化开发里,我们经常会检查:

代码有没有使用未来数据?

当然,这是必须检查的。

但即使完全没有 look-ahead bias,也仍然可能产生过拟合。

举一个很简单的例子。

假设最近一段行情里,某种情况连续导致策略亏损。

于是我找到一个规则:

如果出现条件 X,就不要交易。

重新回测以后发现:

  • 最近亏损少了

  • 胜率提高了

  • 回撤也改善了

这个规则看起来非常好。

但问题在于:

我之所以想到 X,本身就是因为我已经看到了最近这段亏损。

因此真正需要研究的不是:

X 能不能修复最近的数据?

而是:

X 有没有更稳定、更普遍的解释?

这也是为什么我现在越来越重视不同时间区间的验证、逐事件回放,以及新规则对原有历史决策有没有产生意外改变。


六、Research Code 和 Production Code 必须是同一个逻辑

这可能是整个项目里最“软件工程”的一个问题。

很多策略在研究阶段表现很好,但真正进入生产代码后会发生各种微妙变化:

Backtest:
A → B → C

Production:
A → B' → C

表面上看,两边的最终收益可能差不多。

但实际上,它们已经不是同一个策略了。

因此我现在认为,验证生产代码不能只看:

总胜率是不是差不多?

还应该尽可能进行 event-by-event replay

也就是逐个历史事件比较:

时间
市场窗口
候选来源
基础方向
后置处理
最终方向
STOP 状态
最终结果

如果一次代码修改理论上只应该影响某个局部模块,那么历史中其他没有被修改的事件最好仍然保持完全一致。

这其实和普通软件开发里的 regression testing 很像。

只不过这里 regression 的对象不是 UI 或 API,而是:

交易决策本身。


七、策略和交易系统,其实应该被分成三个层次

做了越来越多工程以后,我现在比较喜欢把一个自动交易系统拆成三个部分。

第一层:Research

研究层负责回答:

市场里到底有没有可重复的结构?

包括:

  • 历史研究

  • 不同时间区间表现

  • 稳定性

  • 市场状态变化

  • 过拟合检查

  • 新规则是否值得接受

这一层的工作不是下单。

而是尽量不要欺骗自己。


第二层:Decision

这一层负责:

现在到底应该做什么?

可能有多个候选判断。

系统需要结合:

  • 当前市场环境

  • 已经发生的状态

  • 候选之间的冲突

  • 当前条件是否仍然成立

最终只产生一个结果:

UP
DOWN
NO TRADE

具体策略规则、阈值和内部逻辑当然不会公开,因为这是系统真正的策略部分。


第三层:Execution

最后才是:

如何真正把这个决定变成一笔交易?

这里需要处理:

  • 市场发现

  • 账户余额

  • 仓位计算

  • 风险限制

  • Order Type

  • 成交确认

  • 部分成交

  • API 异常

  • Settlement

  • 状态持久化

  • 重启恢复

这也是为什么我现在越来越觉得:

一个交易机器人和一个交易策略,是两种不同的东西。

策略只是系统的一个模块。


八、为什么我还在继续研究 BTC 5分钟?

BTC 5分钟是一个非常有意思的实验环境。

每五分钟,一个新的窗口重新开始。

新的价格行为。

新的市场环境。

新的结果。

这意味着反馈速度非常快。

同时也意味着:

策略失效、环境变化、执行问题,都会更快暴露出来。

刚开始做这个项目时,我最关心的问题是:

哪个策略效果最好?

但现在我更经常问的是:

如果市场开始变化,我能多快发现原来的方法正在失效?

再往后,则是:

一个交易系统能不能不仅发现变化,而且对变化作出合理反应?

这可能也是我接下来很长一段时间都会继续研究的问题。


写在最后

开发 PolyNexus 到现在,我对自动交易最大的认知变化可能就是:

以前我认为:

好的交易机器人 = 好的预测策略。

现在我认为:

好的交易系统 = 研究 + 决策 + 风控 + 执行 + 验证 + 对“不确定”的处理。

一个信号可以是正确的。

但它未必值得交易。

一个历史策略可以表现很好。

但它未必能够适应今天的市场。

一个回测数字可以非常漂亮。

但它未必意味着实盘结果。

所以我现在越来越喜欢一句非常简单的话:

Signal ≠ Trade.

预测市场会往哪里走,只是第一步。

真正困难的是:

什么时候应该相信它,什么时候应该调整,什么时候应该什么都不做。

这才是我现在真正想解决的问题。


项目:PolyNexus / Polymarket BTC 5m Automated Trading System

GitHub:naka2027/polymarket-bot

研究博客:Naka Research

本文讨论的是个人量化研究与软件开发过程,不构成投资建议。历史回放结果不代表未来表现,自动交易存在本金损失风险。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐