Стратегии
Точный перенос Jesse KDJstrategy с исходными настройками по умолчанию — LTC Spot, дневные бары
Итог: Отменено
JesseKdjLtcSpotDaily
Сводка по итогам
В этом запуске KDJstrategy Jesse перенесена на дневные спотовые бары LTC; исходные параметры по умолчанию сохранены. Для исправления конфигурации и проблем с зависимыми ордерами потребовалось 3 итераций, после чего перенос заработал без ошибок. Бэктест за весь период показал убыток 39.1% примерно за 6 лет и 336 сделок; убыток был в шести из семи лет, во всех трёх режимах волатильности и даже до вычета комиссий. Аналитик отказался от стратегии при проверке бэктеста из-за отрицательного математического ожидания. Это подтвердило прежние опасения QA относительно преимущества; до оптимизации, оценки риска и перевода на следующий этап дело не дошло.
Гипотеза
Точно перенесите KDJstrategy сообщества Jesse с лицензией MIT на LTCUSDT.BINANCE_SPOT, используя бары 1-DAY, счёт CASH и без плеча. Сохраняйте исполняемую семантику Python, а не исправляйте комментарии. Настройки по умолчанию KDJ: fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0 и sequential=False. Рассчитывайте стохастик за девять баров, K как SMA за три бара, D как SMA для K за три бара и J=3*K-2*D. Рассчитывайте предыдущее J по свечам без текущей. Период ATR — 14. Сохраняйте инициализацию индикатора Jesse и сглаживание ATR; не заменяйте его вариантом на основе EMA KDJ. Источник: [KDJstrategy, зафиксированный коммит](https://github.com/jesse-ai/example-strategies/blob/7c91e0a37bf62165790120d730442e4f6eb00364/KDJstrategy/__init__.py).). Настройки по умолчанию сверены с [реализацией Jesse KDJ](https://raw.githubusercontent.com/jesse-ai/jesse/master/jesse/indicators/kdj.py);); стратегия не фиксирует версию зависимости Jesse.
Явный запрос на точное воспроизведение источника важнее создания нового механизма или смены направления. Спотовый рынок подходит, поскольку код открывает только длинные позиции, а помощник расчёта размера Jesse ограничивает номинал капиталом. Каталог дневных данных LTC существует локально. BINANCE_SPOT ниже целевого значения 15% и составляет 11%; несмотря на это, предложение увеличивает долю уже чрезмерно представленных категорий: одного символа, длинных позиций и дневных баров, поскольку изменение этих параметров изменило бы предоставленную стратегию. corpus_concentration пуст, поэтому нельзя установить долю недавних исследований LTC. Это эксперимент по воспроизведению, а не утверждение о доказанном структурном преимуществе KDJ.
Реализация
Перенос KDJstrategy Jesse на спотовый рынок LTCUSDT с дневными барами. Стохастик рассчитывается по 9 барам, K — это SMA за 3 баров, D — SMA для K за 3 баров, а J = 3K - 2D; всё на срезе из 240 свечей без последовательного режима. Стратегия открывает длинную позицию, когда J > (K и D), с семантикой Python `and`. Выход происходит, если позиция прибыльна и предыдущее J выше текущего, либо если J < (K и D). Вход — рыночный BUY со стоп-лоссом 2xATR(14), который размещается на площадке как дочерний ордер OTO. Размер позиции рассчитывается по risk_to_qty Jesse с риском 5% и ограничивается 100% капитала.
Итерация 3 исправляет только сбой уровня -3. NautilusTrader отклоняет ордер OUO, если его linked_order_ids пуст. В источнике нет ордера тейк-профит, к которому можно привязать стоп, поэтому стоп теперь ссылается на себя. Привязка к входу не сработала бы: к моменту отправки стопа вход уже исполнен, а движок сопоставления отклоняет ордер OUO, если связанный ордер закрыт. Все пути отмены и обновления OUO пропускают закрытые связи, поэтому самоссылка не влияет на результат. Стоп остаётся условным, поэтому базовый класс продолжает считать его защитным и вызывать should_exit. Я выполнил локальный бэктест на дневных барах LTC с 2019-01 по 2024-07. Он прошёл без ошибок и закрыл 273 сделок; средний результат сделки — -0.27%, коэффициент Шарпа — -0.24, максимальная просадка — 43.6%. Это перенос для воспроизведения: результаты слабые, но оценивать их должен аналитик. Сигнал, размер позиции и параметры не менялись.
Результаты верификации
Если в полной диагностике бэктеста обнаружатся отклонённые ордера, добавьте буфер только при срабатывании ограничения (например, max_notional_fraction 0.995) либо округляйте количество вниз до точности размера инструмента. Зафиксируйте это как инженерное отклонение, а не изменение правила.
Размер позиции рассчитывается по risk_to_qty: 5% капитала делится на расстояние до стопа 2xATR, затем умножается на цену; размер ограничен 100% капитала. sizing_fee_rate составляет 0, а sizing_precision — 8; при этом точность количества на спотовом рынке LTC грубее, и make_qty может округлить количество вверх. Когда ATR ниже примерно 2.5% цены, срабатывает ограничение; это происходит при низкой волатильности. Тогда рыночный BUY на 100% капитала вместе с комиссией 0.1% для счёта CASH может превысить свободные средства, и ордер будет отклонён. Это незаметно пропустит входы только при низкой волатильности. Исходная логика при этом не меняется, а песочница создала 335 сделок, поэтому эта проблема не блокирует работу.
Изменения не требуются. Сохраняйте переопределение согласованным с ограничениями базового шаблона.
Метод _submit_entry переопределяет базовый метод, чтобы отправить рыночный вход OTO с дочерним стоп-маркет ордером reduce-only; это соответствует self.stop_loss в Jesse. Я сравнил его с base_template._submit_entry: он сохраняет проверки прогрева, фиксации начального значения, паузы, готовности рынка и незавершённого входа, а также записывает такой вход. Проверка базового класса на короткую спотовую позицию заменена явной проверкой только BUY, что здесь эквивалентно. Стоп ссылается на себя как OUO, чтобы NautilusTrader принял его. Это необычно, но безвредно: у него нет связанного ордера, а песочница корректно закрыла каждую позицию (open_positions 0). Будущие изменения проверок базового класса не попадут в это переопределение.
Песочница охватила 2161 дней и 335 закрытых длинных сделок. avg_trade_return_pct составил -0.253% относительно порога +0.25% BINANCE_SPOT; PF 0.865, коэффициент Шарпа -0.28 (CI -1.11 до 0.47), максимальная просадка 44%, убыток во всех трёх режимах волатильности. Собственный запуск разработчика 2019-2024 подтверждает результат: -0.27% на сделку за 273 сделок. Комиссии составляют 9.25% валового результата, поэтому валовое преимущество примерно равно нулю; в зафиксированном плане нет настраиваемых параметров. Вход срабатывает всякий раз, когда J > D, что верно примерно в половине дней. Это шумный фильтр импульса осциллятора со средним удержанием около 2.8 дней; каждый раз он несёт издержки полного спотового цикла 0.20%. Ожидается, что бэктест за весь период подтвердит no_edge. Это опасение касается прибыльности, а не корректности, поэтому оно не препятствует работе.
Обзор бэктеста
- Шарп
- -0,30
- Общая доходность
- -39,11%
- Максимальная просадка
- 44,10%
- Всего сделок
- 336
- Доля прибыльных
- 46,7%
- Профит-фактор
- 0,86
Перенос точно соответствует источнику и работает без ошибок: 336 сделок только в длинную позицию за 2173 дней, без пропущенных входов, с корректным учётом, без нереализованных позиций в конце и на надёжной выборке.
Характер сделок соответствует исходной логике: входы при J > D, около 44% времени на рынке, удержание примерно 2.8 дней и отсутствие коротких позиций.
avg_trade_return_pct составляет -0.281% относительно порога +0.25% BINANCE_SPOT.
PF равен 0.856, коэффициент Шарпа — -0.30 (CI -1.09 до 0.50), общая доходность — -39.1%, максимальная просадка — 44.1% против заранее заданного 30%, а самая длинная просадка длилась 1005 дней.
Убыток был в шести из семи лет; положительным оказался только 2020. Все три режима волатильности были убыточными, как и пять из шести стрессовых периодов.
Валовая прибыль/убыток до комиссий и влияния на цену составляет около -$10.6 тыс.; стратегия убыточна даже до издержек.
Прогноз не содержит информации: IC 0.011, t = 0.5.
Альфа составляет -11.5% в год, информационное отношение — -0.62, бета — 0.12; результат хуже, чем у стратегии «купи и держи» для LTC.
В плане нет настраиваемых параметров, поэтому оптимизировать нечего.
История итераций
Проверка не пройдена (уровень 1.5 — согласованность гипотезы и конфигурации) [класс=hypothesis_mismatch]: - optimization_plan фиксирует плечо на уровне 1.0
Проверка не пройдена (уровень 3 — бэктест в песочнице): значение `linked_order_ids` было `None` или пустым, когда `contingency_type` OUO Использованный тип бара: LTCUSDT.BINANCE_SPOT-1-DAY-LAST-EXTERNAL, обработано баров: 0 Убедитесь, что стратегия совершает сделки с указанными данными и параметрами.
Сводка по итогам
Условие осциллятора J > D выполняется примерно в половине дней, удержание длится около 2.8 дней; на дневных барах LTC оно не несёт прогнозной информации и не покрывает издержки полного спотового цикла 0.20%. Поэтому от переноса с фиксированными настройками по умолчанию не следует ожидать преимущества.
На этапе проверки бэктеста вынесен вердикт «отказаться» из-за отрицательного математического ожидания (преимущества нет): средняя доходность сделки -0.281% против порога +0.25% BINANCE_SPOT, убыток до комиссий и просадка выше заранее заданного 30%. В плане не было настраиваемых параметров, поэтому оптимизация не могла изменить результат; до оптимизации и следующих этапов дело не дошло.
Точный перенос KDJstrategy сообщества Jesse с лицензией MIT и фиксированными настройками по умолчанию: SMA-основа, KDJ 9/3/3, где J=3K-2D, стоп ATR(14); дневные бары LTCUSDT.BINANCE_SPOT, только длинные позиции, без плеча.
За период с 2018-08-11 по 2024-07-22 стратегия совершила 336 длинных сделок с общей доходностью -39.1%, коэффициентом Шарпа -0.30 (CI -1.09 до 0.50), фактором прибыли 0.856, максимальной просадкой 44.1% и avg_trade_return_pct -0.281%. Валовая прибыль/убыток до издержек также отрицательны (около -$10.6 тыс.), а сигнал IC составил 0.011 (t=0.5).
Анализ
KDJstrategy
Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.