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

Стратегии

Лестничная стратегия следования за трендом SOL Spot с масштабированием шагов по волатильности: добавлять одну долю 25% капитала при каждом движении на +1 сигм от цены последней ребалансировки, убирать одну долю при движении на -1 сигм, выходить при нуле долей; только длинные позиции, без плеча (SOLUSDT.BINANCE_SPOT 4H, чистый OHLCV)

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

SolSpotVolScaledStepLadder

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

SolSpotVolScaledStepLadder переосмысливает лестницу ценовых шагов FMZ как стратегию следования за трендом на споте SOL, использующую масштабирование шагов по волатильности, 25% долей и только длинные позиции, на свечах 4H. Базовый бэктест примерно за 5.7 лет показал высокую доходность +2581%, но коэффициент Шарпа составил 0.33, максимальная просадка — 78.7%, бета — 0.63, а информационный коэффициент — -0.54; это означает, что стратегия уступила простому удержанию SOL. После 2 итераций аналитик отказался от неё при проверке бэктеста: это бета без преимущества следования за трендом, поэтому до оптимизации, анализа и проверки риска дело не дошло. Аналитик также отметил показатель -7.43% avg_trade_return_pct, знак которого расходится с положительным PF и положительным PnL USD, и запросил проверку тестовой обвязки.

Гипотеза

Адаптировано из дайджест-статьи FMZ «Python版追涨杀跌策略» автора 发明者量化-小小梦 (https://www.fmz.com/digest-topic/4908, разделы «策略代码» и «策略简单分析», 2020-01-11). Это изложение с нуля, а не точный перенос (L167). В исходной версии используется лестница ценовых шагов без индикаторов. Она сохраняет опорную цену. Если цена поднимается выше опорной более чем на 5%, стратегия покупает долю; если опускается ниже более чем на 5%, продаёт долю. После каждой сделки опорная цена перемещается к текущей. Мы сохраняем эту лестницу, но……Показать большеСвернуть

Адаптировано из дайджест-статьи FMZ «Python版追涨杀跌策略» автора 发明者量化-小小梦 (https://www.fmz.com/digest-topic/4908, разделы «策略代码» и «策略简单分析», 2020-01-11). Это изложение с нуля, а не точный перенос (L167). В исходной версии используется лестница ценовых шагов без индикаторов. Она сохраняет опорную цену. Если цена поднимается выше опорной более чем на 5%, стратегия покупает долю; если опускается ниже более чем на 5%, продаёт долю. После каждой сделки опорная цена перемещается к текущей. Мы сохраняем эту лестницу, но меняем три параметра. (1) Сигналы проверяются при закрытии свечи 4H вместо цикла тикера с интервалом 500 мс. (2) Каждая доля составляет фиксированные 25% капитала, максимум — 4 долей. В исходной версии размер каждого ордера рассчитывается как часть оставшегося баланса, поэтому позиция никогда не становится нулевой; здесь ноль долей означает полное отсутствие позиции. (3) Шаг масштабируется по волатильности, а не задаётся фиксированным значением 5%: s = 1.0 x стандартного отклонения дневной доходности за последние 30 дней с ограничением [3%, 12%]. С экономической точки зрения это дискретная стратегия следования за трендом. На случайном блуждании её ожидаемое значение до комиссий равно нулю; прибыль возможна только при продолжении многодневной или многонедельной доходности спота SOL в том же направлении на масштабе около 1 сигм (горизонт временного импульса на крипторынке). Выбран спот SOL, поскольку в исходнике используется только длинная позиция на денежном счёте, спот ниже квоты (10.6% против >=15%), а SOL не входит в число чрезмерно сконцентрированных рядов BTC/ETH. В каталоге есть история спота SOL с шагом 4H начиная с 2020-08-11. Фильтра режима и дополнительных потоков данных нет.

Итерация 2 исправляет только критический дефект расчёта размера позиции, обнаруженный в QA. Для счёта CASH функция get_account_equity() возвращает остаток USDT, в котором уже не учтены удерживаемые SOL. Старая функция _slice_qty повторно вычитала held*price из этого остатка, ограничивая экспозицию примерно 56%. Теперь mtm = usdt + held*close, а размер каждого транша равен min(0.25*mtm, usdt*0.99). Проверка гарантирует, что held_value + номинал <= mtm, поэтому с CASH счёта никогда не запрашиваются средства сверх……Показать большеСвернуть

Итерация 2 исправляет только критический дефект расчёта размера позиции, обнаруженный в QA. Для счёта CASH функция get_account_equity() возвращает остаток USDT, в котором уже не учтены удерживаемые SOL. Старая функция _slice_qty повторно вычитала held*price из этого остатка, ограничивая экспозицию примерно 56%. Теперь mtm = usdt + held*close, а размер каждого транша равен min(0.25*mtm, usdt*0.99). Проверка гарантирует, что held_value + номинал <= mtm, поэтому с CASH счёта никогда не запрашиваются средства сверх доступных. Теперь четыре транша достигают примерно 100% капитала, как и предусмотрено гипотезой. Логика сигналов, уровней и якоря не менялась. Что касается предупреждения о реестре от QA: добавления и сокращения сводятся в одну позицию, поэтому avg_trade_return_pct отражает целый эпизод с несколькими траншами, а не один транш. Оценивайте результат по кривой капитала и комиссиям на уровне исполнений. Опасение QA по поводу наличия преимущества остаётся в силе: у лестничной стратегии нулевое матожидание на случайном блуждании. Результат зависит от сохранения трендов SOL и может в основном обеспечиваться бычьими ралли 2021 и 2023-24.

premise_falsified: на достаточной выборке (109 эпизодов лестницы за 5.7 лет) лестница шагов с масштабированием по волатильности на споте SOL не показывает преимущества следования за трендом сверх беты с уменьшенной экспозицией. Бета равна 0.63, корреляция — 0.85, экспозиция — 85%, средняя позиция — 95% капитала, информационный коэффициент — -0.54; стратегия уступает покупке и удержанию SOL. Максимальная просадка — 78.7% за 773 дней, около 0.8x от собственной циклической просадки SOL примерно в 95% (урок 170:……Показать большеСвернуть

premise_falsified: на достаточной выборке (109 эпизодов лестницы за 5.7 лет) лестница шагов с масштабированием по волатильности на споте SOL не показывает преимущества следования за трендом сверх беты с уменьшенной экспозицией. Бета равна 0.63, корреляция — 0.85, экспозиция — 85%, средняя позиция — 95% капитала, информационный коэффициент — -0.54; стратегия уступает покупке и удержанию SOL. Максимальная просадка — 78.7% за 773 дней, около 0.8x от собственной циклической просадки SOL примерно в 95% (урок 170: фильтр беты) при стандартном пороге для спота 15%. Коэффициент Шарпа равен 0.33, при 95% CI от -0.40 до 1.11 (PSR 0.77); показатель PF равен 1.36 при доле прибыльных сделок 13.8%, а подряд может быть до 25 убыточных сделок. Прибыль почти полностью получена во время бычьих движений 2021 и 2023 SOL; все стрессовые окна кризисов, кроме апреля 2025, убыточны. Базовый результат значительно ниже порога оптимизации, а оптимизация может только ухудшить его. Опасение QA подтвердилось. Отдельно отмечено: avg_trade_return_pct (-7.43%) имеет знак, противоположный PF 1.36 и положительному среднему PnL USD. Вероятно, проблема связана со знаменателем номинала позиции при наращивании долей; причина не проверена, поэтому отправьте это на проверку тестовой обвязки. Код ошибки первого отчёта: no_edge (бета, а не проблема комиссий).

Реализация

Лестница шагов на споте SOL со свечами 4H, только длинные позиции. Она сохраняет опорную цену. Каждый шаг волатильности +1 выше опорной цены добавляет долю стоимостью 25% капитала по текущей рыночной стоимости, максимум — 4 долей. Шаг равен 1x стандартного отклонения дневной доходности за 30 дней с ограничением до 3-12%. Каждый шаг -1 ниже опорной цены убирает одну долю; ноль долей означает отсутствие позиции. После каждого шага опорная цена сбрасывается на цену закрытия.

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

Либо возвращайте небольшое значение min_bars_required (например, 2) и разрешайте торговлю только при len(self._closes) == maxlen внутри calculate_signal (до заполнения возвращайте 0.0), либо рассчитывайте дневную доходность по буферу self._bars базового шаблона, который уже заполнен во время прогрева.

Буфер волатильности прогревается дважды. min_bars_required() возвращает 182, а базовый шаблон NOT вызывает calculate_signal(), пока len(self._bars) < min_bars (_maybe_process_primary сразу возвращает управление). Поэтому self._closes начинает заполняться только на свече 183. В течение следующих примерно 2 дней _daily_stdev() возвращает 0, а шаг ограничивается значением step_min=3%. Ещё примерно 30 дней после этого шаг рассчитывается по менее чем 30 дневным доходностям, а не по указанному в гипотезе окну в 30 дней. Решения по лестнице в этот период используют шумный или минимальный шаг. Это происходит один раз за бэктест и повторяется после каждого перезапуска узла бумажной торговли, поскольку дек не сохраняется.

Рассчитывайте число долей по исполненной позиции (например, round(held*price / номинал доли на момент добавления) или увеличивайте _slices в on_order_filled, а не при отправке ордера.

Учёт траншей оптимистичен для реальной торговли. В should_exit путь добавления выполняет self._slices += 1 сразу после _submit_entry_instrument(), но эта вспомогательная функция может молча не отправить ордер (защита от повторной отправки, пока ордер обрабатывается; рынок не готов; период разогрева). Аналогично, should_enter задаёт _slices=1 и перемещает якорь до того, как базовый шаблон проверит размер и минимальный номинал. В бэктесте рыночные ордера исполняются в рамках события, поэтому это не влияет на полученные результаты. В реальной торговле отброшенное добавление оставляет _slices больше фактически удерживаемого количества, поэтому последующие сокращения продают held/_slices — слишком малое количество.

Аналитик: оценивайте по кривой капитала и издержкам на уровне исполнений, а не по avg_trade_return_pct. Не сравнивайте это поле с нижней границей комиссий для этой стратегии.

В реестре наблюдается расхождение знаков: avg_trade_return_pct равен -7.43%, тогда как total_return равен +2581%, а PF — 1.36 (L116). Я проверил долларовый реестр, и он сходится точно: 15 прибыльных сделок x $645.6 тыс. = $9.68 млн, 94 убыточных сделок x $75.6 тыс. = $7.10 млн, чистый итог = $2.58 млн = 2581% от $100 тыс., и PF 9.68/7.10 = 1.36. Следовательно, это не дефект учёта в стратегии. Отрицательное среднее значение доходности в процентах связано с реинвестированием прибыли (выигрышные сделки происходят при значительно большем капитале) и объединением нескольких траншей: одна «сделка» в реестре — целый эпизод добавлений и сокращений, с trades_count 938 исполнениями против 109 позиций. avg_holding_bars=0.0 при периоде удержания 15.8 дней — артефакт метрики тестового стенда.

Кроме исправления прогрева, ничего не требуется.

Статический анализ указывает, что min_bars_required затеняет базовый метод. Переопределение сделано намеренно и допускается контрактом базового класса («Переопределяйте при необходимости»), однако см. описание взаимодействия с прогревом выше.

Результаты песочницы больше похожи на бету SOL с уменьшенной экспозицией, чем на преимущество следования за трендом. Бета равна 0.63, корреляция с покупкой и удержанием — 0.85, информационный коэффициент — -0.54; стратегия уступает простому удержанию SOL. Максимальная просадка составляет 78.7% (CI 72-99.8%), значительно превышая любой минимальный порог просадки для спота, и длилась 773 дней. Все стрессовые окна кризисов убыточны: china_ban -48%, rate_shock -55%, FTX -44%. Результат обеспечен 15 прибыльными эпизодами из 109; подряд бывает до 25 убыточных сделок, а единственный крупнейший выигрыш составил +$2.43M. Денежная прибыль на сделку зависит от сложного процента: выигрыши пришлись на период, когда капитал был велик. Аналитику: (1) сравнить с покупкой и удержанием при экспозиции 95% за тот же период; (2) проверить концентрацию по годам в 2021 и 2023-24; (3) вероятнее всего, ограничивающим условием служит порог просадки, а не комиссии. Шаги составляют 3-12% против примерно 0.2% за круговую сделку на споте, поэтому проблема не в приемлемости комиссий.

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

Шарп
0,33
Общая доходность
2581,22%
Максимальная просадка
78,68%
Всего сделок
109
Доля прибыльных
13,8%
Профит-фактор
1,36

Механизм реализован согласно гипотезе: только длинные позиции, лестница из 25% долей, шаги с масштабированием по волатильности и возможность полностью выйти в кэш. entry_diag показывает 109 входов, ни один не был пропущен.

Комиссии не являются проблемой. Комиссия составляет 5.2% от валовой прибыли, влияние — 12.1%, а 3-12% шагов значительно превышают примерно 0.2% за круговую сделку на споте.

Выборка сделок достаточна: 109 эпизодов (938 исполнений) за 2,069 дней.

Доходность похожа на бету с уменьшенной экспозицией SOL, а не на преимущество следования за трендом. Бета равна 0.63, корреляция с покупкой и удержанием — 0.85, экспозиция — 85%, средняя позиция — 95% капитала, а информационный коэффициент — -0.54; значит, стратегия уступает простому удержанию SOL. Опасение QA подтвердилось.

Максимальная просадка составляет 78.7% (CI 72-99.8%) и длилась 773 дней. По сравнению с циклической просадкой SOL при покупке и удержании около -95% 2021-22 это примерно 0.8x, что запускает фильтр беты (урок 170). Она также значительно превышает стандартный порог для спота 15%.

Коэффициент Шарпа статистически незначим: 0.33, 95% CI -0.40–1.11, PSR 0.77. Это значительно ниже базового порога для оптимизации (Sharpe >= 1.0 и PF >= 1.5; здесь PF равен 1.36).

Прибыль сосредоточена в нескольких годах: +1834% в 2021 и +940% в 2023. Показатели 2020, 2022, 2025 и 2026 отрицательны. Все стрессовые окна кризисов отрицательны, кроме тарифного окна 2025.

Результат зависит от редких крупных выигрышей: доля прибыльных сделок — 13.8%, подряд бывает до 25 убыточных, а 15 прибыльных эпизодов обеспечивают основную часть результата; крупнейший выигрыш в одиночку составил $2.43M.

Данные реестра противоречат друг другу: avg_trade_return_pct равен -7.43%, тогда как PF равен 1.36, а avg_trade_pnl_usd составляет +$23.7k. Вероятно, проблема связана со знаменателем для отдельной позиции при наращивании долей; механизм не проверен. В любом случае показатель в процентах не достигает минимального порога жизнеспособности.

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

Проверка не пройдена (уровень 4 — проверка QA) [класс=code_defect]: - [edge_concern] Дискретная трендовая стратегия с наращиванием позиции по уровням имеет нулевое матожидание на случайном блуждании. В песочнице результат обеспечивается терцилем стрессовой волатильности (+422% из +772%); все 2022 стрессовых окон убыточны, а просадка длится 770 дней, поэтому несколько бычьих импульсов SOL могут доминировать. После исправления размера позиции проверьте концентрацию по годам и сохраняется ли результат без 2021 и……Показать большеСвернуть

Проверка не пройдена (уровень 4 — проверка QA) [класс=code_defect]: - [edge_concern] Дискретная трендовая стратегия с наращиванием позиции по уровням имеет нулевое матожидание на случайном блуждании. В песочнице результат обеспечивается терцилем стрессовой волатильности (+422% из +772%); все 2022 стрессовых окон убыточны, а просадка длится 770 дней, поэтому несколько бычьих импульсов SOL могут доминировать. После исправления размера позиции проверьте концентрацию по годам и сохраняется ли результат без 2021 и 2023-24. - [критично] При расчёте размера транша стоимость удерживаемой позиции дважды вычитается из денежных средств, поэтому изменение №2 из гипотезы (фиксированный транш размером 25% от капитала, до 4 траншей) не реализовано. Для счёта BINANCE_SPOT CASH функция get_account_equity() проходит через resolve_account_equity и возвращает только остаток USDT. Уже купленные SOL из этого остатка исключены. Затем _slice_qty рассчитывает free_cash = капитал - held_qty*цена, повторно вычитая стоимость удерживаемых SOL, а транш = min(USDT*0.25, free_cash*0.99). Расчёт от капитала E: транш 1 = 0.25E; транш 2 = 0.1875E (25% от оставшихся USDT, что соответствует заложенному в исходном коде расчёту «доли от оставшегося баланса», который гипотеза явно заменила); транш 3 составляет около 0.12E (ограничивает свободная наличность); для транша 4 выполняется free_cash <= 0, поэтому он никогда не выставляется. Следовательно, максимальная экспозиция составляет около 56% капитала, а не 100%, и ещё сильнее сокращается при росте цены между добавлениями, поскольку величина удерживаемой позиции в деньгах увеличивается. Результат песочницы avg_position_pct из 54.7% соответствует этому пределу. При сокращении позиции затем продаются 1/траншей позиции, набранной траншами разного размера. Лестница экспозиции протестированной стратегии не соответствует описанной в гипотезе. (строка 105) — исправление: Рассчитывайте переоценённый по рынку капитал как mtm = usdt_balance + held_qty*close. Размер каждого транша рассчитывайте как номинал = slice_frac * mtm (или slice_frac * капитал на момент первого входа, если транши должны иметь фиксированный долларовый размер), ограничивая фактически доступными свободными денежными средствами: номинал = min(slice_frac*mtm, usdt_balance*cash_buffer). Не вычитайте held*price из баланса USDT повторно. Перед отправкой ордера проверяйте условие (held_qty*close + номинал) <= mtm, чтобы с CASH счёта никогда не запрашивались средства сверх доступных. - [предупреждение] Реестр сделок не сходится (L116/L140). avg_trade_return_pct составляет -5.93% по 137 «сделкам», тогда как total_return составляет +772%, а PF — 1.51, avg_holding_bars — 0.0, и trades_count (878 исполнений) отличается от total_trades (137). Добавления и сокращения объединяются в одну позицию NETTING, поэтому каждая «сделка» — это целый эпизод с несколькими траншами, а знаменатель для показателя на сделку не равен задействованному номиналу. Экономику на сделку нельзя сравнивать с круговой сделкой на споте за ~0.20%, пока в реестре каждый транш не будет учтён относительно собственного номинала. (строка 137) — исправление: Строго говоря, менять стратегию не нужно. Аналитику следует оценивать результат по кривой капитала и комиссиям на уровне исполнений (commission_pct_of_gross 4.7%, проскальзывание 5.3%), а не по avg_trade_return_pct. - [предупреждение] min_bars_required переопределяет базовый метод (статический анализ base_shadow). Здесь это лишь задаёт разогрев в 30*6+2 баров, что разумно. Дек _closes ограничен по длине (maxlen), поэтому предупреждение о неограниченном росте — ложноположительное. Расчёт волатильности выполняется за O(30) на бар, без повторного сканирования истории для каждого бара. (строка 60) — исправление: Оставьте переопределение, если это допускается базовым контрактом.

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

Лестничная стратегия следования за трендом только на споте и только с длинными позициями, которая большую часть времени имеет около 85% вложений, в основном несёт бету и просадку базового актива. Прежде чем доверять заявленной доходности, сравните информационный коэффициент с покупкой и удержанием. Несовпадение знака avg_trade_return_pct для наращиваемых позиций также следует отправить на проверку тестовой обвязки.

При проверке бэктеста аналитик решил отказаться от стратегии до оптимизации (premise_falsified / no_edge): доходность выглядела как уменьшенная бета SOL, а стратегия не прошла ни по одному критерию optimize-bar (коэффициент Шарпа, PF, коэффициент Шарпа CI, просадка относительно спотового эталона 15%, информационное отношение, средняя доходность сделки). Основная прибыль пришлась на бычьи ралли 2021 и 2023, а все кризисные стрессовые окна, кроме апреля 2025, принесли убыток.

Лестница шагов только для длинных позиций, без плеча, на споте SOL и свечах 4H, адаптированная из стратегии FMZ покупки на росте и продажи на падении: добавлять одну долю в размере 25% капитала (максимум 4) при каждом движении на +1 сигм от цены последней ребалансировки и убирать одну долю при каждом движении на -1 сигм; шаг задаётся скользящим стандартным отклонением дневной доходности за 30 дней с ограничением до 3-12%. Расчёт основан на сохранении многодневного тренда SOL.

За 2,069 дней (август 2020 — апрель 2026) базовый бэктест охватил 109 эпизодов лестницы (938 исполнений) и дал общую доходность +2581%. Коэффициент Шарпа составил лишь 0.33 (95% CI -0.40–1.11), показатель PF равен 1.36, доля прибыльных сделок — 13.8%, а максимальная просадка — 78.7% за 773 дней. Бета составила 0.63, корреляция с покупкой и удержанием — 0.85, информационный коэффициент — -0.54, а заявленный показатель avg_trade_return_pct равен -7.43%.

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