Перейти к содержимому
Все стратегии

Стратегии

SOL Расхождение потока тейкеров китов и розницы — длинные и короткие позиции (BINANCE USD-M Perp, сигнал по TRADE-TICK, бары решения 15m, торговать в сторону крупных агрессоров, когда мелкие выбирают другую сторону, разделение размера по фиксированному номиналу, мало параметров)

Итог: Отменено

SolWhaleVsRetailTakerFlowDivergenceLS15m

SOL Расхождение потока тейкеров китов и розницы — длинные и короткие позиции (BINANCE USD-M Perp, сигнал по TRADE-TICK, бары решения 15m, торговать в сторону крупных агрессоров, когда мелкие выбирают другую сторону,…

Гипотеза

LONG-SHORT, одноинструментальная стратегия MICROSTRUCTURE на SOLUSDT.BINANCE, основанная на TRADE TICKS, а не на барах. Сигнал разделяет агрессивный поток тейкеров по TRADE SIZE и торгует DIVERGENCE между двумя группами: когда агрессоры LARGE (отдельные сделки выше фиксированного номинала USD — институциональный/китовый поток) в сумме BUYING, а агрессоры SMALL (розничные) в сумме SELLING, открывается позиция LONG; когда крупные агрессоры в сумме SELLING на фоне покупок розничных участников, открывается позиция……Показать большеСвернуть

LONG-SHORT, одноинструментальная стратегия MICROSTRUCTURE на SOLUSDT.BINANCE, основанная на TRADE TICKS, а не на барах. Сигнал разделяет агрессивный поток тейкеров по TRADE SIZE и торгует DIVERGENCE между двумя группами: когда агрессоры LARGE (отдельные сделки выше фиксированного номинала USD — институциональный/китовый поток) в сумме BUYING, а агрессоры SMALL (розничные) в сумме SELLING, открывается позиция LONG; когда крупные агрессоры в сумме SELLING на фоне покупок розничных участников, открывается позиция SHORT. Так закрываются два наиболее нарушаемых измерения квот: горизонт short_1m_15m (4.7% против целевого значения >=10%) и направление, не ограниченное только длинными позициями (long_only составляет 84.1% при пределе <=55%). Кроме того, используется DATA PRIMITIVE, почти не применяемый портфелем, — исходные тики сделок с разделением по размеру. Используется Binance, несмотря на превышение веса (74.1%); это намеренное и обоснованное исключение: стратегии нужна многолетняя история тиков SUB-HOURLY, которую Hyperliquid структурно не может предоставить (его свечной API выдаёт около 5000 свечей на интервал, поэтому для 15m доступно лишь около 7 недель). Перенос на площадку с недостаточным весом гарантировал бы отказ из-за нехватки истории. SOL выбран вместо BTC/ETH ради запаса по комиссиям: типичное часовое движение 1-3 примерно равно 2x движения крупного актива, поэтому круговая стоимость фьючерсной сделки около 0.10% занимает гораздо меньшую долю целевого движения. Конструкция намеренно минимальна (4 параметров) и, что особенно важно, для разделения крупных и мелких сделок использует фиксированный порог номинала FIXED USD, а не скользящий процентиль размера: процентиль требует заново сортировать буфер размеров сделок на каждом баре — именно такой шаблон O(n) на бар привёл к пяти последовательным тайм-аутам Layer-3 300s.

Результат с нулём сделок вызван сбоем DATA-WINDOW, а не неверным порогом; прежде чем что-либо менять, я проверил обе части этого утверждения. (1) Песочница работала на барах 1-MINUTE, чей лимит около 20 тыс. баров охватывает примерно 28 дней до самых новых баров. Собранная история тиков сделок SOLUSDT.BINANCE в каталоге охватывает период 2026-04-29..2026-07-17; эти интервалы не пересекаются, поэтому on_trade_tick ни разу не сработал, суммарные значения обеих групп остались 0, а расхождение было постоянным и……Показать большеСвернуть

Результат с нулём сделок вызван сбоем DATA-WINDOW, а не неверным порогом; прежде чем что-либо менять, я проверил обе части этого утверждения. (1) Песочница работала на барах 1-MINUTE, чей лимит около 20 тыс. баров охватывает примерно 28 дней до самых новых баров. Собранная история тиков сделок SOLUSDT.BINANCE в каталоге охватывает период 2026-04-29..2026-07-17; эти интервалы не пересекаются, поэтому on_trade_tick ни разу не сработал, суммарные значения обеих групп остались 0, а расхождение было постоянным и равнялось 0.0 — никакой порог не мог его активировать. (2) Я воспроизвёл точную логику групп на всех собранных 8.54 млн тиков SOL: 3,331 баров 15m с потоком, охват large_imb в пределах ±0.28, small_imb в пределах ±0.18, расхождение p5/p95 = -0.224/+0.195; условие CURRENT (entry_thresh 0.18 плюс строгая проверка противоположного знака розничного потока) срабатывает на 430 таких барах — 12.9%. Значит, условие входа не слишком строгое. Я намеренно не стал ослаблять NOT: это добавило бы лишь сделки с небольшим расхождением, которые не покрывают круговую стоимость около 0.10%. Исправление — в выборе бара для решения: bar_type меняется с 1-MINUTE на 15-MINUTE; именно это соответствует гипотезе, сформулированной в её заголовке, и полностью охватывает историю тиков в окне песочницы длительностью около 208 дней. Изменения кода ограничены документацией измеренного масштаба сигнала (прежняя оценка розничного потока ±0.05 была неверной), счётчиками и диагностической строкой on_stop, показывающей тики/flow_bars/entry_fires. Благодаря этому будущий отчёт с нулём сделок сможет различить отсутствие потока и несрабатывание условия, которые иначе неразличимы. Вся логика сигнала, входа, выхода и размера позиции осталась побайтно идентичной; теперь _param_bounds соответствует проверенным параметрам.

verification_loop: sandbox_timeout: Проверка не пройдена (Layer 3 — бэктест в песочнице): проверка работоспособности превысила лимит времени 300 с на окне примерно 20000 баров (208 дней SOLUSDT.BINANCE-15-MINUTE-LAST-EXTERNAL). Обычно это означает, что объём работы на каждом баре растёт вместе с историей — например, повторное сканирование всего ряда финансирования/дополнительных данных или пересоздание списка с вызовом min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Предварительно отсортируйте массивы временных меток ONCE в __init__ и используйте bisect либо кэшируйте результаты поиска по временной метке, чтобы стоимость обработки бара составляла O(log n), а не O(n).

Реализация

Длинно-короткая микроструктурная стратегия на тиках сделок по бессрочному контракту SOLUSDT.BINANCE USD-M с барами принятия решений длительностью 15 минут. Каждая агрессивная сделка тейкера классифицируется по номиналу FIXED USD (large_usd) как поток китов или розничных участников; подписанный номинальный дисбаланс каждой группы накапливается за скользящее окно из баров 15m с потоком. Торгуемый сигнал — расхождение large_imbalance - small_imbalance: позиция LONG открывается, только если киты в сумме покупают,……Показать большеСвернуть

Длинно-короткая микроструктурная стратегия на тиках сделок по бессрочному контракту SOLUSDT.BINANCE USD-M с барами принятия решений длительностью 15 минут. Каждая агрессивная сделка тейкера классифицируется по номиналу FIXED USD (large_usd) как поток китов или розничных участников; подписанный номинальный дисбаланс каждой группы накапливается за скользящее окно из баров 15m с потоком. Торгуемый сигнал — расхождение large_imbalance - small_imbalance: позиция LONG открывается, только если киты в сумме покупают, WHILE розничные участники в сумме продают и расхождение превышает entry_thresh; позиция SHORT открывается только при обратных условиях. Выходы: жёсткий стоп 1.2%, тейк-профит 0.8% (в несколько раз больше круговой стоимости тейкера около 0.10%), неблагоприятный разворот расхождения, временной стоп на 12 баров и выход при схлопывании расхождения, если сделка уже прошла 0.15%. Сложность составляет O(1) на тик и O(lookback) на бар; процентиль размера и повторное сканирование истории не используются. Если в окне нет потока тиков, оба дисбаланса равны 0, и стратегия воздерживается от торговли, не подменяя данные ценовым прокси.

Результаты верификации

sandbox_timeout: Проверка не пройдена (Layer 3 — бэктест в песочнице): проверка работоспособности превысила лимит времени 300 с на окне примерно 20000 баров (208 дней SOLUSDT.BINANCE-15-MINUTE-LAST-EXTERNAL). Обычно это означает, что объём работы на каждом баре растёт вместе с историей — например, повторное сканирование всего ряда финансирования/дополнительных данных или пересоздание списка с вызовом min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Предварительно отсортируйте массивы временных меток ONCE в __init__ и используйте bisect либо кэшируйте результаты поиска по временной метке, чтобы стоимость обработки бара составляла O(log n), а не O(n).

История итераций

Проверка не пройдена (Layer 3 — бэктест в песочнице): сделки не созданы Тип использованного бара: SOLUSDT.BINANCE-15-MINUTE-LAST-EXTERNAL, обработано баров: 204740 Диагностика: should_enter() возвращала сторону 0 раз за 204732 проверенных баров -> ваше условие ENTRY CONDITION ни разу не сработало. Ослабьте логику входа / пороги. Убедитесь, что стратегия создаёт сделки на заданных данных и параметрах.

Проверка не пройдена (уровень 4 — проверка QA): - Указанное в гипотезе условие входа не реализовано. В заголовке и описании триггер сформулирован прямо: «Торгуй в направлении крупных агрессоров WHEN SMALL AGGRESSORS TAKE THE OTHER SIDE» / «если агрессоры LARGE имеют чистую позицию BUYING, а агрессоры SMALL — чистую позицию SELLING, открывай LONG». В итерации 2 удалена проверка противоположных знаков (large_imb > 0 > small_imb) и заменена на (large_imb > 0) AND (расхождение >= 0.15). Это не одно и то же: при……Показать большеСвернуть

Проверка не пройдена (уровень 4 — проверка QA): - Указанное в гипотезе условие входа не реализовано. В заголовке и описании триггер сформулирован прямо: «Торгуй в направлении крупных агрессоров WHEN SMALL AGGRESSORS TAKE THE OTHER SIDE» / «если агрессоры LARGE имеют чистую позицию BUYING, а агрессоры SMALL — чистую позицию SELLING, открывай LONG». В итерации 2 удалена проверка противоположных знаков (large_imb > 0 > small_imb) и заменена на (large_imb > 0) AND (расхождение >= 0.15). Это не одно и то же: при large_imb=0.50, small_imb=+0.30 расхождение равно 0.20, и возникает сигнал LONG, хотя у розничных участников чистая позиция BUYING — как и у китов, то есть именно такая конфигурация, которую гипотеза исключает. Теперь стратегия торгует дисбаланс китов с относительным перекосом, а не расхождение китов и розничных участников, поэтому заявленное преимущество не соответствует фактически торгуемому. Обрати внимание на возникшую асимметрию знаков: 135 коротких позиций против 88 длинных. - Структура выходов не позволяет покрыть комиссии. Тейк-профита NO, нет и целевого минимального движения цены — выходы возможны только по жёсткому стопу 1.5%, при схлопывании расхождения (|сигнал| < 0.05) и при смене его знака. Для входа требуется |расхождение| >= 0.15, а выход срабатывает при |расхождение| < 0.05; позиции закрываются при затухании шумового потока со средним удержанием около 1ч23м, без требования, чтобы цена прошла расстояние, достаточное для покрытия примерно 0.10% комиссий тейкера за сделку туда и обратно. Песочница подтверждает, что проблема в самой структуре: total_commission 19,362 USD = 94.83% валовой прибыли, оборот 2788%, avg_trade_return_pct -0.0536% при минимальном пороге для фьючерсов 0.15%. - Ключевая предпосылка гипотезы о данных не выполнена, поэтому результатам последующего анализа нельзя доверять. Гипотеза выбирает Binance именно потому, что стратегии «нужна многолетняя история тиков SUB-HOURLY». В обосновании самого разработчика указано, что покрытие сделками SOLUSDT.BINANCE составляет около 30 дней (32 файлов parquet, 2026-06-18..2026-07-17) против примерно 204,740 баров (около 5.8 лет): примерно у 98.6% баров нулевой поток тиков и нулевое расхождение. Песочница запускалась на data_days=35 с 223 сделками. Оптимизация и проверки переобучения и отложенной выборки на микроструктурной выборке за 35 дней и 223 сделок дадут шум, а бэктестинг по всей истории покажет 5.8 лет ровной кривой капитала вокруг активного окна длиной 35 дня, искажая все метрики, которые изучает аналитик. - Плечо считывается через getattr(self.config, 'leverage', 1.0). Именно такой шаблон ранее отклонила проверка leverage_set_but_unused для другой стратегии (AvaxVolatilitySpikeWickRejectionFadeLS15m, итерация 1): статический анализатор не распознаёт обращение через getattr как использование плеча. Здесь уровень Layer-1 пройден, но эта проверка выполняется после уровня Layer 3 и, вероятно, заблокирует стратегию по той же причине. - Размер позиции агрессивен относительно стопа: плечо capital_frac 0.5 x 2.0 означает 100% капитала в номинальной стоимости позиции на сделку (в песочнице avg_position_pct 126%), поэтому жёсткий стоп 1.5% приводит к потере около 3% капитала на каждой убыточной сделке, закрытой по стопу. При наблюдаемом max_consecutive_losses=14 потери быстро накапливаются (max_drawdown 59%). - Во время прогрева, если базовый шаблон не вызывает calculate_signal до min_bars_required, тики накапливаются в self._cur, не фиксируются и не сбрасываются, поэтому первый зафиксированный бакет может объединять поток за сколь угодно долгий период. Кроме того, дековые очереди пополняются один раз на каждый бар принятия решения вне зависимости от наличия данных тиков, поэтому бары с нулевым потоком незаметно размывают скользящее окно (оба дисбаланса достигают ровно 0.0).

Проверка не пройдена (Layer 3 — бэктест в песочнице): сделки не созданы Тип использованного бара: SOLUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL, обработано баров: 40747 Диагностика: should_enter() возвращала сторону 0 раз за 40687 проверенных баров -> ваше условие ENTRY CONDITION ни разу не сработало. Ослабьте логику входа / пороги. Убедитесь, что стратегия создаёт сделки на заданных данных и параметрах.

Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.