Your Backtest Is Lying: How Cohort Data Exposes the Gaps
By @CoinMarketMan - 14-Jul-2026
你的回测在说谎:队列数据如何揭露盲区
你跑完了回测。持仓量急剧攀升,资金费率翻转为负,信号触发,模拟盈亏回正。夏普比率看起来很干净,胜率在 200 笔交易中保持稳定。于是你上线实盘,不到两周,策略开始亏损。
问题很少出在信号本身。真正的问题在于信号无法告诉你的事情。无论推动资金费率翻转的钱包历史上是盈利交易者还是连续被爆仓的散户,资金费率翻转就是资金费率翻转。持仓量急增看起来一模一样,不管它是由 Smart Money 队列钱包建仓驱动,还是由 Giga-Rekt 钱包在亏损方向加仓驱动。你的回测把两种场景一视同仁,因为它根本无法区分两者。
这个区别,正是队列数据所填补的空白。HyperTracker 将 Hyperliquid 上的每一个钱包归入 16 个行为队列之一:8 个按账户规模划分(Shrimp 到 Leviathan),8 个按历史总盈亏划分(Money Printer 到 Giga-Rekt)。当你把这套分类叠加进回测,你问的问题就不再是"信号触发了吗?",而是"这笔交易的多空双方分别是谁?"
标准回测的盲点
Hyperliquid 上的大多数回测使用价格、成交量、持仓量和资金费率。这些数据可以从交易所的公开 API 获取,在单独测试中构建方向性信号已经够用。但问题在于它们遗漏了什么。
以一个简单的做多信号为例:持仓量急剧上升,同时资金费率维持平稳或略微为负。标准解读是:新资金正在进入多头仓位,而无需支付过高的持仓成本,这意味着是真实的做多意愿,而非杠杆投机。在回测中,这个模式在数百笔交易中能产生略微正向的优势。
但聚合的持仓量并不告诉你,你看到的是谁的做多意愿。如果持仓量增加主要来自 Money Printer 队列(历史总盈利超过 $1M 的钱包,区段 ID 8)和 Smart Money 队列(总盈利 $100K-$1M,区段 ID 9),你看到的大概率是知情建仓。如果同样的持仓量急增主要由 Giga-Rekt 钱包(历史亏损超过 $1M,区段 ID 15)和 Full Rekt 钱包(亏损 $1M 至 $100K,区段 ID 14)驱动,那所谓的"做多意愿"更可能是割肉离场或报复性交易。
两种场景产生相同的持仓量图表,触发相同的信号。但预期结果存在实质性差异,因为推动行情的资金质量很重要。
历史数据的覆盖范围(以及止步之处)
在把队列上下文引入回测之前,你需要了解实际可用的数据以及它能追溯多远。HyperTracker 的历史端点根据数据类型有不同的回溯窗口。
历史最深的数据是持仓记录。个人持仓快照大约可回溯 10 个月至 2025 年 4 月,为你重建任意时间点的市场状态提供了原始素材。成交记录(个人交易记录)覆盖从 2025 年 7 月起约 6.5 个月,可用于构建价格序列和分析逐笔执行情况。
队列专属数据的窗口更短。逐币种队列指标——告诉你每个区段在某资产上如何持仓的端点——每次 API 调用约提供 4 周的回溯数据。这是队列回测的关键约束:除非当时你已经采集了数据,否则无法事后查询 Money Printer 队列六个月前在 BTC 上的操作。
队列偏向(衡量某队列在所有资产上的方向性倾斜)的窗口更短:滚动 12 小时窗口。订单快照(止损、止盈、限价单集群)约可回溯 3 周。热力图和排行榜仅为当前数据,没有历史存档。
开发者提示: 实际含义很简单。如果你想用有意义的深度运行队列感知回测,从现在就开始采集数据。设置一个定时任务,每 5 分钟调用一次队列指标端点并将响应写入数据库,一个月后你就有一个月的数据,三个月后你就有三个月的数据,以此类推。API 的 4 周回溯窗口是滚动的,更早的数据会自动淘汰,除非你自行存储。
在现有回测中叠加队列过滤器
你不需要从头重建回测引擎。最简洁的做法是把队列过滤器作为信号后置门控。你现有的信号负责生成候选交易,队列过滤器决定哪些候选执行、哪些跳过。
过滤器分三个阶段运作:
第一阶段:原始信号触发。 你现有的逻辑——无论是什么——识别出一个交易机会。持仓量急增、资金费率背离、价格突破、均线交叉。信号本身不变。
第二阶段:队列查询。 信号触发的那一刻,查询相关资产的队列指标。你需要关注两件事:哪些队列在你信号方向上持仓,哪些队列在反方向持仓。
第三阶段:信念门控。 如果历史盈利队列(Money Printer、Smart Money、Consistent Grinder)与你信号方向一致,执行交易。如果历史亏损队列(Giga-Rekt、Full Rekt、Semi-Rekt)是主要驱动力,且盈利队列站在对立方,跳过。如果情况混杂,缩小仓位或直接放弃。
查询和门控逻辑的实际代码如下:
import requests
BASE_URL = "https://ht-api.coinmarketman.com/api/external"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# PnL-based cohort segment IDs
PROFITABLE = [8, 9, 10] # Money Printer, Smart Money, Consistent Grinder
UNPROFITABLE = [13, 14, 15] # Semi-Rekt, Full Rekt, Giga-Rekt
def fetch_cohort_metrics(coin):
resp = requests.get(
f"{BASE_URL}/cohort/metrics",
headers=HEADERS,
params={"coin": coin}
)
resp.raise_for_status()
return resp.json()
def cohort_conviction(metrics, signal_direction):
"""
Returns 'pass', 'skip', or 'reduce' based on
whether profitable cohorts align with the signal.
signal_direction: 'long' or 'short'
"""
profitable_net = 0
unprofitable_net = 0
for cohort in metrics:
seg = cohort.get("segmentId")
long_n = cohort.get("longNotional", 0)
short_n = cohort.get("shortNotional", 0)
net = long_n - short_n # positive = net long
if seg in PROFITABLE:
profitable_net += net
elif seg in UNPROFITABLE:
unprofitable_net += net
# Determine alignment
if signal_direction == "long":
aligned = profitable_net > 0 and unprofitable_net < profitable_net
opposed = profitable_net < 0
else:
aligned = profitable_net < 0 and unprofitable_net > profitable_net
opposed = profitable_net > 0
if aligned:
return "pass"
elif opposed:
return "skip"
else:
return "reduce"
在实时回测循环中,每次信号触发时调用 cohort_conviction(),用返回结果控制是否执行。获得 "pass" 的交易以满仓执行,获得 "reduce" 的交易以部分仓位执行(比例自行决定),获得 "skip" 的交易直接不执行。
构建数据采集流水线
由于队列指标只有 4 周回溯窗口,任何认真的回测工作都需要持续采集数据。流水线结构简单:定时脚本调用 API,解析响应,写入持久化存储。
import requests
import json
import sqlite3
from datetime import datetime
BASE_URL = "https://ht-api.coinmarketman.com/api/external"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
COINS = ["BTC", "ETH", "SOL", "HYPE"]
def collect_cohort_snapshot(db_path="cohort_history.db"):
conn = sqlite3.connect(db_path)
conn.execute("""
CREATE TABLE IF NOT EXISTS cohort_snapshots (
timestamp TEXT, coin TEXT, segment_id INTEGER,
long_notional REAL, short_notional REAL,
total_notional REAL, raw_json TEXT
)
""")
ts = datetime.utcnow().isoformat() + "Z"
for coin in COINS:
resp = requests.get(
f"{BASE_URL}/cohort/metrics",
headers=HEADERS,
params={"coin": coin}
)
if resp.status_code != 200:
continue
for cohort in resp.json():
conn.execute(
"INSERT INTO cohort_snapshots VALUES (?,?,?,?,?,?,?)",
(ts, coin, cohort.get("segmentId"),
cohort.get("longNotional", 0),
cohort.get("shortNotional", 0),
cohort.get("totalNotional", 0),
json.dumps(cohort))
)
conn.commit()
conn.close()
通过 cron 或 systemd 定时器每 5 分钟运行一次。每次调用 4 个币种,每个周期发出 4 次 API 请求,每天共 1,152 次调用。免费套餐每天 100 次调用不足以支撑持续采集,但 $179/mo 的 Pulse 套餐提供每月 50,000 次调用,足以 24/7 采集多个资产的数据,还有富余。
采集数个星期后,你就拥有足够的历史队列数据,可以开始运行真正考量每次行情双方是谁的回测了。
你的回测应该回答的三个问题
一旦队列数据叠加进回测,你就能提出仅靠价格数据无法回答的问题:
1. 当聪明钱方向一致时,胜率如何变化?
把你的基础策略跑两遍:一遍不加队列过滤器,一遍加上。对比胜率。如果过滤后的版本胜率明显更高但交易总数减少,队列过滤器正在发挥作用:剔除了拖累平均表现的低信念交易。
取舍始终如一。过滤器减少交易次数,交易次数越少,复利增长越慢,但低质量交易引发的回撤也越少。如果过滤后的夏普比率提升,即便总盈亏持平,说明策略的资本效率更高,也更容易加仓扩规模。
2. 哪个队列的方向一致性最重要?
并非所有队列的预测权重相同。逐一测试每个队列作为过滤器的效果。仅凭 Money Printer 队列的方向一致性能改善结果吗?Leviathan 队列(永续合约权益超过 $5M 的钱包,区段 ID 7)呢?规模型队列和盈亏型队列衡量的是不同维度,哪个更重要取决于你交易的资产和时间框架。
对于 BTC、ETH 这类高市值资产,盈亏型队列往往更有参考价值,因为市场足够深,单纯的规模并不能预测方向。对于中市值和长尾资产,规模型队列可能更重要,因为单个 Whale 或 Leviathan 钱包建仓,在总持仓量中占比更大。
3. 队列分歧能否预测回撤?
队列数据在回测中最高价值的用途之一是回撤分析。梳理回测中最严重的亏损连续期,查看入场时的队列构成。如果最严重的回撤始终发生在信号方向与亏损队列一致、盈利队列站在对立方的时刻,你就找到了策略的结构性弱点,而标准回测永远不会揭示这一点。
这是队列感知回测的真正回报。你不仅在提升平均表现,你在识别策略最脆弱的具体条件。这比提高几个基点的平均收益更有价值。
用队列数据回测的常见陷阱
队列数据提供了强大的视角,但也引入了自身的失效模式。
对特定队列过度拟合。 如果你把策略优化为只跟随 Money Printer 队列,回测效果极佳,问它一个问题:你交易的是真实信号,还是在向测试期间碰巧正确的一小批钱包拟合?Money Printer 队列代表市场的一个窄小切片,完全依赖单一区段持仓的策略是脆弱的。
忽视队列机制变化。 钱包会随时间在队列间移动。一月份还是 Smart Money 的钱包,经历一连串亏损后到六月可能已经变成 Semi-Rekt。HyperTracker 根据历史总盈亏动态重新分类钱包,队列标签是动态的。假设队列成员静态不变的回测会高估信号质量,因为它所追踪的部分"聪明钱"持仓,实际上是当时聪明但现在已不再聪明的钱包产生的。
延迟假设。 我们的数据每 5 分钟刷新一次,完整状态刷新需要 15 至 20 分钟。在回测中,你在每个时间戳上都有完美数据。在实盘交易中,你看到的数据始终滞后几分钟。在回测中模拟这个延迟:使用上一个快照的队列数据,而非当前时间戳的数据。如果信号只在使用当前 K 线队列数据时才有效,它在实盘中就无效。
混淆相关性与因果性。 聪明钱的持仓方向并不导致价格朝某个方向运动。它是一个同步指标:盈利钱包比亏损钱包更频繁地站在正确一方。这种关系是概率性的,而非决定性的。把队列方向一致性视为在多笔交易中提升期望值的过滤器,而非任何单笔交易的保证。
开始为你的回测采集队列数据
免费套餐提供每天 100 次 API 调用。足够你搭建采集流水线的原型,并在扩规模之前验证信号质量。
每个回测都是对现实的简化模型。问题在于哪些简化会让你亏钱。把所有资金视为等同、忽视资金流背后是谁、假设持仓量不管来源如何都是一回事:这些简化看似无害,直到你把策略上线实盘,眼睁睁看着实际表现跑输模拟曲线。队列数据不能让你的回测完美,但它能让谎言变少,而这已经足以改变结果。