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

Стратегии

Хеджированный кэрри финансирования ADA при минимальной ставке Binance: длинная позиция ADAUSDT на споте + короткая ADAUSDT USD-M бессрочная, пока среднее финансирование за последние 3 дней >= 0.01%/8ч; переход в нейтральную позицию при отрицательном значении (1H бары, нейтральная по дельте стратегия, около 50% времени на рынке)

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

AdaHedgedFundingCarryFloor1H

Сводка по итогам

AdaHedgedFundingCarryFloor1H пыталась получать финансирование ADA бессрочного фьючерса с помощью хеджированной пары: длинная позиция на споте и короткая в бессрочном фьючерсе. Условие входа — среднее финансирование за последние 3 дней не ниже протокольного минимума 0.01%/8ч. Предварительное исследование только финансирования (без прибыли и убытка по базису) выглядело многообещающе: чистый результат +3.22% на эпизод при 26 эпизодах. За 4 итераций в код добавили расчёт размера от общего капитала, сброс при достижении буфера до ликвидации и правила против частых сделок, но проверку он так и не прошёл. Запуск остановили, потому что статический анализ уровня 1 отметил поиск временной метки финансирования на основе abs() как заглядывание вперёд; поэтому бэктест, оптимизация и анализ аналитиком не проводились.

Гипотеза

Источник: 小草, «FMZ官方收费策略介绍», FMZ дайджест (https://www.fmz.com/digest-topic/6613),, раздел 1 «币安永续套取资金费率策略». В статье описаны четыре механизма. Здесь используется только раздел 1. Разделы 2-3 (фиксированные сетки для спотового и бессрочного рынков) отвергаются: это возврат к среднему на уровне баров без правила определения режима, то есть семейство стратегий, погрязших в комиссиях; в статье признаётся, что они работают только на боковом рынке. Раздел 4 (скальпер торгового потока HF, производный от Leeks-Reaper)……Показать большеСвернуть

Источник: 小草, «FMZ官方收费策略介绍», FMZ дайджест (https://www.fmz.com/digest-topic/6613),, раздел 1 «币安永续套取资金费率策略». В статье описаны четыре механизма. Здесь используется только раздел 1. Разделы 2-3 (фиксированные сетки для спотового и бессрочного рынков) отвергаются: это возврат к среднему на уровне баров без правила определения режима, то есть семейство стратегий, погрязших в комиссиях; в статье признаётся, что они работают только на боковом рынке. Раздел 4 (скальпер торгового потока HF, производный от Leeks-Reaper) отвергается согласно уроку L167: ему нужны ребейты и циклы короче секунды, а наш порт уже перешёл к -100%. Идея раздела 1 изложена заново с исходных принципов, а не перенесена. Подобранная вручную корзина из 30+ монет в статье заменена одной ликвидной монетой ONE (уроки L151 и L137). «Аварийный выход -0.2%» заменён правилом скользящего среднего. MECHANISM (одно предложение, инструмент опущен): ставка финансирования Binance USD-M = премия + clamp(процентная ставка - премия, ±0.05%), при фиксированной процентной ставке 0.03% в день. Поэтому всякий раз, когда премия по бессрочному контракту находится в пределах диапазона ограничения, держатели длинных позиций структурно платят держателям коротких позиций 0.01%/8ч (~11% APR), а в спекулятивных режимах — больше. Пара «длинная спотовая позиция / короткая позиция по бессрочному контракту» получает этот денежный поток без направленной рыночной экспозиции. Экономически платит держатель длинной позиции с плечом, который предпочитает экспозицию через бессрочный контракт покупке спотового актива. INSTRUMENTS: длинная позиция ADAUSDT.BINANCE_SPOT (CASH, 1x). Короткая хеджирующая позиция ADAUSDT.BINANCE (USD-M бессрочный контракт, номинал 1x, плечо на выделенную под маржу часть счёта около 2x). Сигнал: дополнительный ключ Binance USD-M funding_rate для ADAUSDT. Этот ключ собирается для BINANCE USD-M согласно уроку L160. Бары: 1-HOUR для обеих позиций, используются только для исполнения и проверки коэффициента хеджирования. Почему ADA: история ставок финансирования охватывает 6.6 лет (2020-01 и далее), средняя ставка финансирования за 8ч составляет +0.0124%, а в корпусе этот актив почти не использовался. BTC не используется (его доля концентрации превышает лимит). Для ETH нашлось только 9-13 эпизодов. LINK уже включён в конвейер как направленная сделка на финансировании. PRE-STUDY (только поток финансирования, на момент времени, запускать до предложения стратегии; базисный P&L NOT учтён): средняя ставка финансирования за последние 9 начислений (3 дней). Вход при >= 0.0100%/8ч, выход, когда среднее падает ниже 0. На интервале с ADAUSDT 2020-01 по 2026-09 это дало 26 эпизодов, медианное удержание — 31 дней, медиана собранного финансирования на эпизод — 0.69% от номинала, среднее — 3.52%. За вычетом комиссии за полный цикл в размере 0.30% (спот 0.20% + бессрочный контракт 0.10%) среднее составляет +3.22% на эпизод, а доля эпизодов с положительным чистым результатом равна 77%. Время в рынке — около 50%. За последние два года началось пять эпизодов. Варианты отбора, указанные согласно уроку L122: монета (ADA, выбрана из предварительного исследования ETH/DOGE/LINK/XRP/ADA/SOL монет из 6; все монеты дали положительный чистый результат, поэтому механизм не зависит от выбора), окно (3 дней = 9 начислений) и порог входа (0.01% = минимальная процентная ставка протокола, а не подогнанное число). Выход при 0 означает: «короткие позиции начинают платить».

Эта итерация отправлена повторно. В журнале фабрики указан только один бэктест для этого запуска (bt-...-i1), а единственный зарегистрированный файл стратегии — AdaHedgedFundingCarryFloor1H_v1.py (код итерации -1). Файлы отзывов для итерации 2-4 — побайтно идентичные копии первого отзыва, записанные с интервалом 3 минут. Значит, код с исправлениями по итогам отзыва 1-4 и доработками 1-4 так и не прошёл бэктест. В этой отправке логика осталась без изменений. (1) Размер позиции рассчитывается как капитал всего……Показать большеСвернуть

Эта итерация отправлена повторно. В журнале фабрики указан только один бэктест для этого запуска (bt-...-i1), а единственный зарегистрированный файл стратегии — AdaHedgedFundingCarryFloor1H_v1.py (код итерации -1). Файлы отзывов для итерации 2-4 — побайтно идентичные копии первого отзыва, записанные с интервалом 3 минут. Значит, код с исправлениями по итогам отзыва 1-4 и доработками 1-4 так и не прошёл бэктест. В этой отправке логика осталась без изменений. (1) Размер позиции рассчитывается как капитал всего портфеля × capital_frac/2, а не через min(). (2) Защита маржи бессрочного фьючерса: движок не умеет переводить средства между площадками (исполнитель выделяет каждой площадке фиксированные $100k), поэтому используются кредитное плечо площадки 3 и лимит номинала бессрочного фьючерса perp_eq × min(3 x 0.8, 1/(liq_buffer + reset_room)). (3) После сброса пара открывается снова в размере, пересчитанном от общего капитала, без периода ожидания. (4) При каждом закрытии записываются причина и время удержания; позиции, удерживавшиеся менее 24ч, отмечаются SHORT HOLD, чтобы можно было отследить пары длительностью 2 часов. Остальные сохранённые изменения: фильтр базиса финансирования AND при входе и выходе, минимальное удержание 24ч, период ожидания 24ч и закрытие при нарушении целостности хеджа. Единственное изменение этой итерации: при каждом открытии записывается номинал пары в процентах от капитала портфеля и ограничение, которое сработало (цель, perp_cap или spot_cap); при закрытии записывается номинал на входе, чтобы можно было проверить метрику «>= 40% капитала». Структурное ограничение: начальная пара составляет 40% портфеля, но после сброса буфера до ликвидации истощённый счёт бессрочных фьючерсов ограничивает повторно открытые пары примерно до 25-30% портфеля, поскольку движок не может переводить деньги между площадками. Доработка 5 (сначала пассивная часть бессрочного фьючерса) не реализована. Лимитная заявка SELL на закрытии бара была бы рыночной, поэтому в движке на основе баров исполнилась бы как тейкерская. Лимитная заявка выше цены закрытия оставила бы одностороннюю позицию примерно на 1H. Экономия составила бы около 0.06% на пару при среднем значении до исследования около 3.5% на эпизод.

verification_loop: проверка не пройдена (уровень 1 — статический анализ): - Заглядывание вперёд: дополнительное наблюдение выбирается по дистанции ABSOLUTE до временной метки бара; если оно ближе предыдущего, возвращается наблюдение NEXT. Используй self.supp_as_of(key) (последнее значение на момент бара или раньше) либо явный фильтр `ts <= bar.ts_init` — никогда abs(). (строка 241)

Реализация

Дельта-нейтральный кэрри финансирования ADA: длинная позиция ADAUSDT на споте + равная по количеству короткая позиция ADAUSDT USD-M в бессрочном фьючерсе, пока среднее финансирование за последние 9 значений (3 дней) за 8ч >= 0.01%/8ч (минимальная ставка Binance) и базис >= 0. Выход, когда среднее < 0 и базис <= 5bp, после минимального удержания 24ч. Принудительный выход, если среднее < -0.01%/8ч или данные финансирования устарели. Размер каждой пары рассчитывается от общего капитала портфеля (0.8 x всего / 2 на каждую сторону). Маржа счёта бессрочных фьючерсов защищена плечом площадки 3x и сбросом при достижении буфера до ликвидации. Непарные или неравные позиции закрываются; повторный вход запрещён на 24ч.

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

Проверка не пройдена (уровень 1 — статический анализ): - Заглядывание вперёд: дополнительное наблюдение выбирается по дистанции ABSOLUTE до временной метки бара; если оно ближе предыдущего, возвращается наблюдение NEXT. Используй self.supp_as_of(key) (последнее значение на момент бара или раньше) либо явный фильтр `ts <= bar.ts_init` — никогда abs(). (строка 241)

Когда парная позиция открыта и _entry_px==0, задать _entry_px по значению avg_px_open позиции по бессрочному контракту.

Опорное значение проверки хеджа _entry_px и флаг _rehedge_pending хранятся только в памяти. После перезапуска бумажной торговли или торговли на реальном счёте с открытой парой _entry_px=0, а проверка повторного хеджирования 40% незаметно отключается до конца эпизода. В комментарии написано «сохраняется после перезапуска», но восстановление этих значений по открытым позициям не предусмотрено.

Необязательно: записывать счётчик «naked_leg_unwind», чтобы такие события отображались в диагностике.

Обе стороны отправляются как независимые рыночные ордера. Если один из них отклонен (например, на спотовой стороне CASH не хватает денежных средств после комиссий), защита от непокрытой позиции закроет другую сторону на следующем баре. Это безопасно, но обходится в полный цикл сделок; при плече 1.0 и 0.5 capital_frac такой сбой должен быть редким. Альтернативы этому нет; аналитик должен принять это к сведению.

Оставьте это только в том случае, если базовый контракт это допускает.

Переопределение min_bars_required() перекрывает базовый метод (предупреждение статического анализа). Это безвредно, поскольку ценовые индикаторы не используются, а окно финансирования проходит отдельную проверку полноты.

Анализ

См. workspace/discussions/60066445-7e7a-4e07-a878-4abd7f7ab7ec/iteration_1_feedback.md. Исправления: (1) рассчитывать размер каждой пары от общего капитала портфеля (бессрочные фьючерсы плюс спот) × capital_frac / 2 на каждую сторону, а не через min(); (2) защитить маржу позиции в бессрочном фьючерсе плечом площадки (например, 3, с ограничением номинала на уровне perp_eq × плечо × 0.8) либо перебалансировать оба счёта при каждом сбросе, если движок умеет переводить средства между площадками; (3) после сброса……Показать большеСвернуть

См. workspace/discussions/60066445-7e7a-4e07-a878-4abd7f7ab7ec/iteration_1_feedback.md. Исправления: (1) рассчитывать размер каждой пары от общего капитала портфеля (бессрочные фьючерсы плюс спот) × capital_frac / 2 на каждую сторону, а не через min(); (2) защитить маржу позиции в бессрочном фьючерсе плечом площадки (например, 3, с ограничением номинала на уровне perp_eq × плечо × 0.8) либо перебалансировать оба счёта при каждом сбросе, если движок умеет переводить средства между площадками; (3) после сброса хеджа снова открывать позицию полного перебалансированного размера; (4) выяснить, почему две пары (2021-05-19 и 2021-06-22) закрылись через 2 часов без финансирования. Ожидаемое изменение метрики: номинал позиции в бессрочном фьючерсе должен оставаться не ниже 40% капитала в каждом эпизоде (сейчас около 2-6%), а прибыль и убыток от финансирования за 2023-2025 должны вырасти примерно с $50-650 в год до нескольких тысяч. Если после исправления чистая доходность на эпизод с учётом примерно 0.30% за сделку туда и обратно на двух площадках всё ещё ниже 0.30% номинала, отказаться от стратегии как от fee_edge. Отдельно: парные значения ±7% в плоские дни передать команде тестового стенда; это не исправление стратегии. ## Доработки из библиотеки (проверь их, не считай верными заранее) Курс по арбитражу финансирования в библиотеке (51bitquant class_20/21/22) описывает такой же кэрри: длинная позиция на споте и короткая в бессрочном фьючерсе. Отличия от этой стратегии: размер рассчитывается исходя из фиксированного целевого количества, позиция в бессрочном фьючерсе защищается правилом дистанции до ликвидации, а не частыми сбросами; для входа и выхода одновременно требуются условие по финансированию BOTH и условие по спреду (базису); если хедж нарушен, позиция на споте сразу закрывается. Эти изменения устраняют уменьшение номинала и частые сделки из-за комиссий, которые привели к результату -0.027% на сделку. 1. [размер позиции] Фиксированный целевой размер от общего капитала портфеля + сброс по дистанции до ликвидации вместо повторного хеджирования 40%: при входе в каждый эпизод установить целевое количество монет Q = capital_frac * (perp_eq + spot_eq) / 2 / цена, где capital_frac = 0.8 (номинал на каждую сторону — около 40% общего капитала). Установить кредитное плечо конфигурации = 3 на площадке бессрочных фьючерсов и ограничить их номинал значением perp_eq * 3 * 0.8. Удалить rehedge_move = 0.40. Вместо этого использовать правило буфера до ликвидации: сбрасывать пару только когда perp_eq < 0.35 * perp_notional (при указанных размерах это примерно рост на 80% ADA от входа). После сброса открывать позицию на уровне min(Q_new, лимит бессрочного фьючерса), где Q_new снова рассчитывается от общего капитала, никогда от min(perp_eq, spot_eq). — Аналитик обнаружил, что номинал снизился с $50k примерно до $2k, поскольку размер позиции на основе min() следовал за истощённым счётом бессрочных фьючерсов после каждого сброса 40%; в результате доход от финансирования упал до $46-154 в год. Программа курса использует фиксированное «initial_target_pos» (要对冲的最大的目标数量) и набирает его, пока хватает средств. Она защищает короткую сторону с помощью «close_before_liquidation_pct» (позиция закрывается только при приближении цены к цене ликвидации), а не при достижении фиксированного изменения цены. В заметках class_20 ликвидация (爆仓导致仓位清算) указана как основной риск, которым нужно управлять. Меньше сбросов также означает меньше сделок туда и обратно на двух площадках 0.30%. (источник: 套利软件策略参数说明和使用 p.1; 套利介绍 p.1; 第十五课: 为什么合约(期货)危险? p.1) 2. [вход] Условие по двум параметрам: финансирование AND базис должны согласовываться при входе и выходе. Рассчитывать basis_t = perp_close / spot_close - 1 при каждом согласованном закрытии 1H. Открывать позицию ENTER, только если funding_mean_9 >= 0.0001 AND basis_t >= 0.0 (бессрочный фьючерс не торгуется с дисконтом к споту). Обычный выход EXIT разрешён, только если funding_mean_9 < 0.0 AND basis_t <= +0.0005; так мы не закроем позицию при широком положительном базисе, за который пришлось бы платить по короткой стороне. Принудительный выход EXIT независимо от базиса, если funding_mean_9 < -0.0001 или данные финансирования устарели (оставить max_funding_age_hours = 24). — В курсе прибыль описана как «价差+资金费率» (спред плюс финансирование). В списке рисков сказано: «平仓的时候价差扩大,赚的资金费率没有覆盖手续费和价差»: расширение спреда при закрытии может свести на нет полученное финансирование. Программа открывает позицию, только когда соблюдены оба условия «open_spread_ptc» и «open_rate_pct», и закрывает, только когда соблюдены оба условия «close_spread_ptc» и «close_rate_pct» (要同时满足价差和资金费率). Текущая стратегия полностью игнорирует базис, а 50% её пар убыточны; поэтому прибыль и убыток по базису при входе и выходе могут быть источником потерь. (источник: 套利软件策略参数说明和使用 p.1; 套利介绍 p.1) 3. [фильтр] Защита от частых сделок: минимальная длительность эпизода и период ожидания до повторного входа. Игнорировать обычный выход (условия принудительного выхода остаются в силе), пока пара не действует в течение 3 расчётных периодов финансирования (24ч). После любого выхода запрещать повторный вход на 24ч (3 расчётных периода). Записывать в журнал причину каждого закрытия пары ранее чем через 24ч, чтобы выяснить, почему сработали проверка устаревших данных финансирования, повторное хеджирование или сигнал для пар длительностью 2021-05-19 и 2021-06-22 два часа (-$823, -$1037, нулевое финансирование). — Первый риск, указанный в курсе: «资金费率没有了,亏了手续费»: финансирование прекращается, и остаются только убытки на комиссиях. Если открыть и закрыть пару в течение 2 часов, полная стоимость сделки туда и обратно составит около 0.30%, а получить даже одно начисление финансирования за 8ч не удастся. По той же причине правило выхода с двумя условиями из class_22 работает как гистерезис. Минимум в 24ч гарантирует, что после каждой оплаченной сделки туда и обратно позиция будет открыта как минимум на 3 расчётных периода (при минимальной ставке это около 0.03%, больше в спекулятивных режимах). (источник: 套利介绍 p.1; 套利软件策略参数说明和使用 p.1) 4. [стоп] Проверка целостности хеджа: закрывать непарную сторону при расхождении объёмов. При каждом закрытии 1H во время кэрри сравнивать объёмы открытых позиций в монетах. Если |spot_qty - perp_qty| / max(spot_qty, perp_qty) > 0.05 либо одна из сторон отсутствует (ликвидирована, отклонена или исполнена частично), закрыть избыточную или непарную позицию рыночной заявкой на этом баре и считать эпизод завершённым. Разрешать повторный вход только при выполнении обычного условия входа и периода ожидания. — Программа курса продаёт соответствующую спотовую позицию, если бессрочный фьючерс ликвидирован или автоматически сокращён ('爆仓会卖出相应的现货,降低单边敞口风险'; '防止交易所减仓,也会卖出相应的现货'). В списке рисков курса указано '对冲不及时,造成仓位敞口风险'. В документации спредов vnpy сказано, что пассивная сторона должна хеджировать сразу после исполнения активной (对冲必须尽可能及时). Два отдельных счёта на разных площадках и округление до минимального номинала могут создать здесь одностороннюю позицию, что добавит направленный риск ADA в портфель, который должен быть нейтрален по дельте. (источник: 套利软件策略参数说明和使用 p.1; 套利介绍 p.1; 价差交易模块 p.1) 5. [издержки] Сначала пассивная сторона бессрочного фьючерса, затем рыночный хедж спотом при исполнении: считать бессрочный фьючерс активной стороной. При сигнале на закрытии бара выставлять лимитную заявку на ADAUSDT.BINANCE по цене закрытия бара (короткий вход / закрытие покупкой) со сроком действия 2 баров. После исполнения выставлять рыночную заявку на спот на следующем баре. Если лимитная заявка не исполнилась за 2 баров, отменить её и выставить обе стороны рыночными заявками. При наших комиссиях (мейкер для бессрочного фьючерса 0.02% против тейкера 0.05%; спот 0.10% в обоих случаях) стоимость сделки туда и обратно на двух площадках снижается примерно с 0.30% до 0.24% от номинала, если лимитные заявки исполняются. — Основной способ снизить издержки в программе курса — выставлять одну сторону мейкерской заявкой ('合约是maker(0.02%)', вторая сторона — тейкерская). Модуль спредов vnpy сначала исполняет активную сторону и сразу хеджирует пассивной. Сейчас доходность на сделку составляет -0.027% при стоимости сделки туда и обратно 0.30%, поэтому экономия 0.06% на каждой паре существенна. Само по себе это не решает проблему доходности, и частоту исполнения нужно подтвердить бэктестом. (источник: 套利软件策略参数说明和使用 p.1; 价差交易模块 p.1)

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

Проверка не пройдена (уровень 1 — статический анализ): - Заглядывание в будущее: дополнительное наблюдение выбирается по расстоянию ABSOLUTE до временной метки бара; при этом возвращается наблюдение NEXT, если оно ближе предыдущего. Используйте self.supp_as_of(key) (последнее значение на момент бара или раньше) либо явный фильтр `ts <= bar.ts_init` — никогда не используйте abs(). (строка 223)

Проверка не пройдена (уровень 1 — статический анализ): - Заглядывание в будущее: дополнительное наблюдение выбирается по расстоянию ABSOLUTE до временной метки бара; при этом возвращается наблюдение NEXT, если оно ближе предыдущего. Используйте self.supp_as_of(key) (последнее значение на момент бара или раньше) либо явный фильтр `ts <= bar.ts_init` — никогда не используйте abs(). (строка 239)

Сводка по итогам

Для поиска ставок финансирования на заданный момент времени необходимо использовать self.supp_as_of()/self.supp_window() или явный фильтр ts <= bar.ts_init; любое сопоставление временных меток по расстоянию abs() — это критическая ошибка уровня 1, блокирующая стратегию до запуска бэктеста.

После 4 итераций запуск остановили на цикле проверки. Статический анализ уровня 1 продолжал отклонять код из-за заглядывания вперёд: дополнительное наблюдение финансирования выбиралось по абсолютной дистанции до временной метки бара (строка 241), из-за чего могло вернуться следующее значение.

Дельта-нейтральная стратегия переноса доходности на финансировании ADA: держать длинную позицию на споте ADAUSDT и короткую позицию по бессрочному контракту ADAUSDT USD-M, пока среднее значение финансирования за последние 9 начислений (3 дней) не ниже минимальной процентной ставки Binance 0.01%/8ч, и закрыть все позиции, когда среднее становится отрицательным. Цель — получать структурный платеж, который лонги выплачивают шортам.

Для этого запуска нет метрик бэктеста или оптимизации в конвейере: отчет о бэктесте пуст, отчет об оптимизации не сформирован. Приведены только числа из предварительного исследования гипотезы, учитывавшего только финансирование и исключавшего P&L по базису: 26 эпизодов за период с 2020-01 по 2026-09, среднее значение +3.22% на эпизод после учета комиссии 0.30% за полный цикл, 77% эпизодов с положительным чистым результатом и около 50% времени на рынке.

Причина отказа

verification_loop: проверка не пройдена (уровень 1 — статический анализ): - Заглядывание в будущее: дополнительное наблюдение выбирается по расстоянию ABSOLUTE до временной метки бара; при этом возвращается наблюдение NEXT, если оно ближе предыдущего. Используйте self.supp_as_of(key) (последнее значение на момент бара или раньше) либо явный фильтр `ts <= bar.ts_init` — никогда не используйте abs(). (строка 241)

Обзор бэктеста

Шарп
0,23
Общая доходность
5,85%
Максимальная просадка
0,45%
Всего сделок
102
Доля прибыльных
50,0%
Профит-фактор
1,06

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