Home>Blog>Your Backtest Is Lying: How Cohort Data Exposes the Gaps
Your Backtest Is Lying: How Cohort Data Exposes the Gaps

Your Backtest Is Lying: How Cohort Data Exposes the Gaps

By @CoinMarketMan - 14-Jul-2026

Ваш бэктест лжёт: как данные когорт выявляют слепые зоны

Вы запустили бэктест. Открытый интерес резко вырос, финансирование ушло в минус, сигнал сработал, а симулированный P&L вернулся положительным. Sharpe выглядит чисто. Процент выигрышей держится на 200 сделках. Вы запускаете стратегию в живую, и через две недели она начинает кровоточить.

Проблема редко в самом сигнале. Она в том, чего сигнал не может вам сказать. Разворот финансирования — это разворот финансирования вне зависимости от того, кто его двигает: исторически прибыльные трейдеры или серийные жертвы ликвидации. Скачок OI выглядит одинаково, вызван ли он тем, что кошельки когорты Smart Money накапливают позицию, или тем, что кошельки Giga-Rekt удваивают ставку на проигрышный тезис. Ваш бэктест относился к обоим сценариям одинаково, потому что не мог их различить.

Именно этот пробел заполняют данные когорт. HyperTracker классифицирует каждый кошелёк на Hyperliquid в одну из 16 поведенческих когорт: 8 по размеру счёта (от Shrimp до Leviathan) и 8 по совокупному PnL за всё время (от Money Printer до Giga-Rekt). Когда вы встраиваете эту классификацию в бэктест, вы перестаёте спрашивать «сработал ли сигнал?» и начинаете спрашивать «кто стоит по каждую сторону сделки?»

Слепое пятно стандартных бэктестов

Большинство бэктестов на Hyperliquid используют цену, объём, открытый интерес и ставки финансирования. Это данные, доступные через публичный API биржи, и их достаточно для построения направленных сигналов, которые хорошо тестируются изолированно. Проблема обнаруживается, когда видишь, что они упускают.

Рассмотрим простой лонг-сигнал: OI резко растёт, пока финансирование остаётся нейтральным или слегка отрицательным. Стандартная интерпретация: новые деньги заходят в лонги, не платя чрезмерный кэрри, что указывает на реальное убеждение, а не на заёмную спекуляцию. В бэктесте этот паттерн даёт скромное положительное преимущество на сотнях сделок.

Но агрегированный OI не говорит вам, чьё убеждение вы видите. Если рост OI идёт в основном от когорты Money Printer (кошельки с совокупной прибылью $1M+, segment ID 8) и когорты Smart Money (прибыль $100K-$1M, segment ID 9), скорее всего, вы наблюдаете информированное позиционирование. Если тот же скачок OI движется преимущественно кошельками Giga-Rekt (пожизненный убыток ниже -$1M, segment ID 15) и Full Rekt (от -$1M до -$100K, segment ID 14), «убеждение» скорее всего является капитуляцией или торговлей из мести.

Оба сценария дают одинаковый график OI. Оба запускают одинаковый сигнал. Но ожидаемый исход принципиально различается, поскольку качество капитала за движением имеет значение.

Cohort Blind Spot

Что покрывают исторические данные (и где они заканчиваются)

Прежде чем добавлять контекст когорт в бэктест, нужно понять, какие данные реально доступны и насколько далеко уходит история. Исторические эндпоинты HyperTracker имеют разные окна ретроспективы в зависимости от типа данных.

Самая глубокая история — в позициях. Снапшоты отдельных позиций уходят примерно на 10 месяцев назад, к апрелю 2025 года: сырой материал для воссоздания картины рынка в любой момент. Сделки (fills, записи об отдельных исполнениях) охватывают около 6,5 месяцев с июля 2025 года — полезны для построения ценовых рядов и анализа исполнения на уровне сделки.

Данные, специфичные для когорт, охватывают более короткий период. Метрики когорт по монетам — эндпоинт, показывающий, как каждый сегмент был позиционирован по конкретному активу, — предлагает около 4 недель ретроспективы на один запрос. Это ключевое ограничение для бэктестинга на основе когорт: вы не можете ретроактивно запросить, что когорта Money Printer делала с BTC полгода назад, если не собирали эти данные в своё время.

Bias когорты (направленный перекос по всем активам для конкретной когорты) охватывает ещё меньше: скользящее окно 12 часов. Снапшоты ордеров (стопы, тейк-профиты, кластеры лимитных ордеров) уходят примерно на 3 недели назад. Тепловые карты и лидерборды существуют только в текущем виде, без исторического архива.

Historical Data Map

Совет для разработчиков: практический вывод прост. Если вы хотите запускать бэктесты с учётом когорт с достаточной глубиной, начинайте собирать данные прямо сейчас. Cron-задача, вызывающая эндпоинт метрик когорт каждые 5 минут и записывающая ответы в базу данных, даст вам месяц данных за месяц, три месяца за три месяца, и так далее. Окно ретроспективы API в 4 недели скользящее, поэтому более ранние данные выпадают, если не хранить их самостоятельно.

Добавление фильтров когорт в существующий бэктест

Перестраивать движок бэктеста с нуля не нужно. Самый чистый подход — добавить фильтр когорт как постсигнальный шлюз. Ваш существующий сигнал генерирует кандидатов, а фильтр когорт решает, какие из них исполнить, а какие пропустить.

Фильтр работает в три этапа:

Этап 1: срабатывает сырой сигнал. Ваша существующая логика, какой бы она ни была, выявляет торговую возможность. Скачок OI, дивергенция финансирования, пробой цены, пересечение скользящих средних. Сигнал не меняется.

Этап 2: запрос к когортам. В момент срабатывания сигнала запрашиваются метрики когорт для соответствующего актива. Вы смотрите на два параметра: какие когорты позиционированы в направлении вашего сигнала и какие — против него.

Этап 3: шлюз убеждения. Если исторически прибыльные когорты (Money Printer, Smart Money, Consistent Grinder) согласуются с направлением вашего сигнала — исполняйте сделку. Если исторически убыточные когорты (Giga-Rekt, Full Rekt, Semi-Rekt) являются основными движущими силами, а прибыльные когорты позиционированы против вас — пропускайте. Если картина смешанная — уменьшайте размер позиции или полностью воздерживайтесь.

Cohort Filter Pipeline

Вот как выглядит логика запроса и шлюза на практике:

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()

Запускайте это каждые 5 минут через cron или systemd timer. При 4 монетах на один вызов вы делаете 4 API-запроса за цикл, то есть 1 152 вызова в сутки. Бесплатный уровень с 100 вызовами в день не покроет непрерывный сбор, но тариф Pulse за $179/мес даёт 50 000 вызовов в месяц: достаточно для круглосуточного сбора по нескольким активам с запасом.

Через несколько недель сбора у вас накопится достаточно исторических данных когорт, чтобы запускать бэктесты, действительно учитывающие, кто стоял по каждую сторону каждого движения.

Три вопроса, на которые должен отвечать ваш бэктест

После добавления данных когорт в бэктест вы можете задавать вопросы, недоступные бэктестам только по цене:

1. Как меняется процент выигрышей при совпадении с умными деньгами?

Запустите базовую стратегию дважды: без фильтра когорт и с ним. Сравните процент выигрышей. Если отфильтрованная версия даёт заметно более высокий процент при меньшем числе сделок, фильтр когорт делает своё дело: убирает слабоубедительные сетапы, которые тянут среднюю производительность вниз.

Компромисс всегда одинаков. Фильтры снижают количество сделок. Меньше сделок — медленнее сложный процент, но и меньше просадок от низкокачественных входов. Если отфильтрованный коэффициент Sharpe улучшается, даже когда общий P&L остаётся прежним, стратегия более капиталоэффективна и её проще масштабировать.

2. Какое совпадение когорт важнее всего?

Не все когорты имеют одинаковый прогностический вес. Тестируйте каждую когорту независимо в качестве фильтра. Улучшает ли результаты одно лишь совпадение с когортой Money Printer? А когорты Leviathan (кошельки с капиталом в перпах $5M+, segment ID 7)? Когорты по размеру и когорты по PnL измеряют разное, и то, что важнее, зависит от актива и таймфрейма.

Для активов с высокой капитализацией, таких как BTC и ETH, когорты по PnL, как правило, более информативны: рынок достаточно глубокий, чтобы размер сам по себе не предсказывал направленность. Для активов средней капитализации и длинного хвоста когорты по размеру могут иметь большее значение, поскольку один кошелёк Whale или Leviathan, входящий в позицию, представляет большую долю совокупного открытого интереса.

3. Предсказывает ли дивергенция когорт просадки?

Один из самых ценных вариантов использования данных когорт в бэктестинге — анализ просадок. Пройдитесь по худшим проигрышным сериям вашего бэктеста и проверьте, как выглядел состав когорт при входе. Если худшие просадки стабильно совпадают с моментами, когда ваш сигнал был согласован с убыточными когортами и противостоял прибыльным, вы нашли структурную слабость стратегии, которую стандартный бэктест никогда бы не выявил.

Вот в чём настоящая ценность бэктестинга с учётом когорт. Вы не просто улучшаете среднюю производительность: вы определяете конкретные условия, при которых ваша стратегия наиболее уязвима. Это стоит больше, чем несколько дополнительных базисных пунктов средней доходности.

Типичные ошибки при бэктестинге с данными когорт

Данные когорт добавляют мощную призму, но вносят и собственные точки отказа.

Переобучение под конкретную когорту. Если вы оптимизируете стратегию, следуя только когорте Money Printer, и бэктест выглядит великолепно, задайте себе вопрос: вы торгуете реальным сигналом или просто подгоняетесь под небольшую выборку кошельков, которые случайно оказались правы в тестовый период? Когорта Money Printer представляет узкий срез рынка. Любая стратегия, целиком зависящая от позиционирования одного сегмента, хрупка.

Игнорирование смены режима когорт. Со временем кошельки переходят между когортами. Кошелёк, бывший Smart Money в январе, к июню может стать Semi-Rekt после серии убытков. HyperTracker реклассифицирует кошельки на основе совокупного PnL за всё время, поэтому метки когорт динамичны. Бэктест, предполагающий статичное членство в когорте, завысит качество сигнала: часть «умных денег», за которыми он следовал, генерировалась кошельками, умными тогда, но уже не сейчас.

Допущения о задержке. Наши данные обновляются каждые 5 минут, с полным обновлением состояния каждые 15-20 минут. В бэктесте у вас есть идеальные данные на каждом таймстемпе. В живой торговле вы всегда смотрите на данные с задержкой в несколько минут. Встройте этот лаг в свой бэктест, используя данные когорт из предыдущего снапшота, а не текущего. Если сигнал работает только с данными когорт за текущую свечу, в продакшене он не работает.

Путаница между корреляцией и причинностью. Позиционирование умных денег не заставляет цену двигаться в определённом направлении. Это совпадающий индикатор: прибыльные кошельки склонны позиционироваться правильно чаще, чем убыточные. Связь вероятностная, а не детерминированная. Рассматривайте совпадение с когортами как фильтр, улучшающий ожидаемую ценность на многих сделках, а не как гарантию в каждой отдельной сделке.

Начните собирать данные когорт для своих бэктестов

Бесплатный уровень даёт 100 API-вызовов в день. Достаточно, чтобы прототипировать пайплайн сбора и убедиться в качестве сигнала до масштабирования.

Получить бесплатный API-ключ

Каждый бэктест — упрощённая модель реальности. Вопрос в том, какие упрощения обходятся вам деньгами. Считать весь капитал равнозначным, игнорировать, кто стоит за потоком, предполагать, что OI есть OI вне зависимости от источника: это упрощения, которые кажутся безобидными, пока вы не запускаете стратегию в живую и не наблюдаете, как она отстаёт от симулированной кривой. Данные когорт не делают ваш бэктест идеальным. Они делают ложь меньше — а этого достаточно, чтобы изменить исход.