如何回测预测市场策略

一份分步讲解:从拉取第一条快照,到运行一次带有真实成交模拟的完整回测。

为什么预测市场的回测不一样

预测市场和加密货币现货不同。价格被限定在 0 到 1 之间,市场有固定的到期时间,流动性分布也和 BTC/USDT 订单簿完全不同。在 Binance 上有效的策略,在 Polymarket 上不一定有效。你需要预测市场专用的数据,而且需要订单簿深度,而不只是价格源。

第 1 步:获取历史数据

PolyTest 是一个 Polymarket 回测 API,让交易者回放历史订单簿,并在加密货币预测市场上测试交易策略。在 polytest.io 注册,开始 3 天免费试用,拿到 API 密钥,就可以开始发请求了。5 分钟之内你就能访问真实的快照数据。

# List BTC 5-minute markets
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.polytest.io/api/v1/markets?coin=btc&market_type=5m&limit=20"

第 2 步:理解数据

每条快照包含:最优买价、最优卖价、中间价、价差、成交量、8 档订单簿深度(双边)、标的币种的参考价格,以及毫秒级时间戳。订单簿深度是关键区别:没有它,你只是在对着中间价回测,而中间价完全无法告诉你实际成交会是什么样子。

第 3 步:避免前视偏差

最常见的回测错误,就是用未来的数据做过去的决策。PolyTest 的快照是时点数据:每一条都准确反映了市场在那一刻的样子。按时间顺序处理它们,只使用在决策时刻已经可以获得的数据。永远不要偷看下一条快照来决定现在要做什么。

第 4 步:模拟真实成交

大多数回测就是在这里失效的。如果你假设自己能按中间价买入,结果会比现实好看得多。用订单簿深度数据来模拟成交:逐档遍历,在每个价位消耗可用流动性,计算包含滑点在内的平均成交价。如果卖方流动性很薄,一笔中间价为 0.52 的 100 份订单,实际可能以 0.527 成交。

function simulateFill(
  orderbook: { price: number; size: number }[],
  quantity: number
) {
  let filled = 0;
  let cost = 0;

  for (const level of orderbook) {
    const fillAtLevel = Math.min(level.size, quantity - filled);
    cost += fillAtLevel * level.price;
    filled += fillAtLevel;
    if (filled >= quantity) break;
  }

  return {
    avgPrice: cost / filled,
    filled,
    slippage: cost / filled - orderbook[0].price,
  };
}

第 5 步:考虑时间因素

Polymarket Up/Down 市场在特定时间结算。一个 14:00 开始的 5 分钟 BTC 市场在 14:05 结算。你的策略需要知道何时入场,以及市场何时收盘。PolyTest 快照带有毫秒级时间戳,你可以精确地建模入场时机。不要假设你能在开盘时入场:等你看到价格时,它可能已经变了。

第 6 步:衡量真正重要的指标

在预测市场中,单看胜率会产生误导。要跟踪:扣除滑点后的盈亏、最大回撤、夏普比率(如果你持续运行该策略),以及结果在不同市场条件下如何变化。一个在趋势行情中赚钱的策略,可能在震荡行情中持续亏损。用 PolyTest 的时间范围过滤功能在不同时期进行测试。

常见错误

对着中间价回测,而不是模拟订单簿成交。忽略价差:Polymarket Up/Down 的价差可能达到 2-5 美分,会迅速吃掉利润空间。只在单一币种或时间周期上测试,就认为结果可以推广。对过短的时间窗口过度拟合。没有考虑到如果你的交易规模较大,你的订单本身会推动市场。