Старый трейдер поделился секретом заработка. Я проверил с помощью кода. Удалось заработать?. Data Mining.. Data Mining. python.. Data Mining. python. алгоритмическая торговля.. Data Mining. python. алгоритмическая торговля. бэктестинг.. Data Mining. python. алгоритмическая торговля. бэктестинг. количественные исследования.. Data Mining. python. алгоритмическая торговля. бэктестинг. количественные исследования. Статистика в IT.. Data Mining. python. алгоритмическая торговля. бэктестинг. количественные исследования. Статистика в IT. торговые стратегии.. Data Mining. python. алгоритмическая торговля. бэктестинг. количественные исследования. Статистика в IT. торговые стратегии. трейдинг.. Data Mining. python. алгоритмическая торговля. бэктестинг. количественные исследования. Статистика в IT. торговые стратегии. трейдинг. финансовые рынки.. Data Mining. python. алгоритмическая торговля. бэктестинг. количественные исследования. Статистика в IT. торговые стратегии. трейдинг. финансовые рынки. Финансы в IT.

В книге Джона Мэрфи «Технический анализ фьючерсных рынков» описано правило четырёх недель Ричарда Дончиана. Оно настолько простое, что его можно объяснить за полминуты. И настолько старое, что хочется отнестись к нему с уважением.

Я решил обойтись без уважительных аплодисментов и проверить цифры.

Взял 84 фьючерсных рынка, историю с 1985 года до 10 июля 2026-го, написал исследовательский код на Python и попытался ответить на один вопрос: если не подбирать настройки под красивый результат, остаётся ли у этой идеи преимущество на современном рынке?

Получилось любопытно.

В 1985–2009 годах модель показывала +8,94% в год после расчётных издержек. В 2010–2026 годах — +0,09%.

Сначала кажется, что где-то потерялся знак процента. Нет. Не потерялся.

Но прежде чем объявлять Дончиана побеждённым, нужно рассказать, что именно я проверял. И здесь есть нюанс, о котором обычно удобнее промолчать.

Правило, которое помещается на салфетке

Смысл классического правила примерно такой:

  • Цена выходит выше максимума предыдущих четырёх завершённых недель — открываем длинную позицию.

  • Цена падает ниже минимума предыдущих четырёх завершённых недель — разворачиваемся в короткую.

  • Пока противоположного пробоя нет, держим направление.

И всё.

Никаких тринадцати индикаторов. Никакого секретного фильтра институциональных денег. Никакого «нужно ещё почувствовать рынок».

Идея понятная: если цена достаточно долго и уверенно движется в одну сторону, возможно, у движения есть продолжение.

В этом и привлекательность трендовых правил. Они не требуют угадывать вершину или дно. Они предлагают реагировать на уже состоявшееся движение.

Но в любой простой системе обнаруживается одна неприятность: объяснить её гораздо легче, чем доказать, что она зарабатывает.

Я собрал эксперимент. И заранее запретил себе его спасать

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

Зафиксировал, что проверяю, на каких периодах, как учитываю расходы и что буду считать неудачей.

Самая важная договорённость с самим собой: если результат окажется плохим, не перебирать задним числом 18, 22, 35 и 47 дней в надежде найти красивую кривую.

Потому что так можно «открыть» практически любую стратегию. Особенно если история длинная, вариантов много, а право сказать «ну вот теперь точно работает» остаётся у исследователя.

Для основной проверки я использовал данные 84 фьючерсных контрактов из открытого пакета trendfollowing версии 1.3.1 — акции, облигации, валюты, энергоносители, металлы, сельскохозяйственные товары. Набор контрактов по годам меняется: это не 84 одинаково доступных инструмента на протяжении сорока лет.

И здесь первое принципиальное ограничение.

В широком наборе есть дневные расчётные/эталонные цены, но нет полноценной истории дневных HIGH и LOW для всех 84 рынков. Поэтому моя главная версия — не буквальные внутридневные ордера Дончиана из книги, а приближение: пробой закрытием максимального или минимального закрытия за предыдущие 20 торговых дней.

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

Решение принимается после закрытия дня. В доходность оно попадает только со следующего дня. Машины времени в коде нет.

Ниже — упрощённая логика сигнала, без расчёта весов и издержек:

upper = close.shift(1).rolling(20).max()
lower = close.shift(1).rolling(20).min()

if close_today > upper_today:
    signal = +1
elif close_today < lower_today:
    signal = -1
else:
    signal = previous_signal

# Изменённая позиция влияет только на следующий торговый день.

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

Основной экзамен — 2010 год и позже. Всё, что случилось раньше, интересно как исторический контекст, но не даёт автоматического права считать стратегию пригодной сегодня.

Первая половина истории выглядит отлично

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

Показатель

1985–2009

2010 — 10 июля 2026

Средняя годовая арифметическая доходность, после модельных издержек

+8,94%

+0,09%

Эффективность инвестиции с учётом риска (Sharpe)

0,812

0,008

Геометрическая доходность (CAGR)

+8,68%

−0,58%

Максимальная просадка

−19,17%

−36,86%

Рисунок 1. Сравнение доходности 1985–2009 и 2010–2026. Оригинальный график включён в архив статьи.

Рисунок 1. Сравнение доходности 1985–2009 и 2010–2026. Оригинальный график включён в архив статьи.

На первой части истории правило выглядит вполне прилично. Доходность почти 9% в год, Sharpe выше 0,8, просадка порядка 19%.

Можно было бы остановиться здесь, написать «классика работает» и пойти искать, куда прикрепить кнопку покупки.

Но тогда пришлось бы зачем-то не замечать ещё шестнадцать с лишним лет данных.

На современном отрезке после издержек остаётся девять сотых процента в год. Sharpe — 0,008. Практически ноль.

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

И просадка становится заметно тяжелее: −36,86%.

Рисунок 2. Доходность по календарным годам за 2010–2026 годы. Оригинальный график включён в архив. 2026 год неполный: данные заканчиваются 10 июля.

Рисунок 2. Доходность по календарным годам за 2010–2026 годы. Оригинальный график включён в архив. 2026 год неполный: данные заканчиваются 10 июля.

Отдельные прибыльные годы есть. Более того, на участке 2020–2026 модель снова даёт +2,70% средней годовой доходности после расходов.

Но отдельные хорошие годы не отменяют длинный период, на котором общий результат около нуля. И не превращают риск в бесплатное приложение к доходности.

Куда делась прибыль?

Логичный вопрос: может, сигнал был нормальный, а мы просто задушили его комиссиями?

Посмотрел.

На периоде после 2009 года:

  • До модельных издержек: +3,65% в год, Sharpe 0,314.

  • При базовой оценке издержек: +0,09% в год, Sharpe 0,008.

  • При удвоенной оценке издержек: −3,47% в год, Sharpe −0,298.

Разница между валовой и базовой чистой доходностью — около 3,56 процентного пункта ежегодно.

Почему так много?

В нашей реализации портфель не просто меняет направление при пробое. Его веса ещё и регулярно пересчитываются с учётом волатильности. Средняя расчётная оборачиваемость получается около 153× в год. Это показатель оборота весов портфеля, а не «153 сделки на каждом инструменте».

Модельные расходы при такой конструкции оказываются очень существенными.

Тут важно не сделать слишком удобный вывод: «Ага! Уберём комиссии — и всё заработает».

Нет. Без расходов Sharpe всего 0,314. Это уже не выглядит сильным и устойчивым преимуществом, особенно для длинной истории с разными рыночными режимами.

Можно было бы пересчитать веса реже, изменить механизм входа, добавить другие фильтры. Возможно, результат станет лучше.

Но это будет другая система. Если начать перестраивать её после просмотра неудачного результата, мы незаметно превратим проверку гипотезы в конкурс на лучшую подгонку.

А что там у самой книги?

На минуту отвлечёмся от Python, коэффициентов Шарпа и торговых расходов.

Я посмотрел, как обстоят дела у книги Мэрфи в книжных интернет-магазинах.

Например, на известном маркетплейсе у неё рейтинг 4,9 из 5 и около 1 080 отзывов.

Реальный скриншот карточки книги на Ozon: название, рейтинг и количество отзывов.

Реальный скриншот карточки книги на Ozon: название, рейтинг и количество отзывов.

И я смотрю на эти цифры и не понимаю, кто все эти люди.

Не в смысле «как можно было поставить этой книге пять звёзд». Возможно, она заслуживает все пять. Это классическая работа, и оценивают её не только за возможность заработать деньги. Мне другое интересно.

Сколько из этих людей действительно проверяли торговые правила, которые в ней описаны?

Не просто прочитали. Не посмотрели на графики из прошлого века. А взяли исторические данные, написали код, включили торговые расходы и посмотрели, что получается сегодня.

Я понятия не имею, тк большинство отзывов про то как книга легко читается, в какой она обложке и прочее.

Я не отрицаю, что среди них всё-таки есть люди, которые проверили десятки систем. Может, кто-то получил совершенно другие результаты, но они затерялись среди тысяч отзывов.

И вот именно им мне хочется показать своё исследование. Не поспорить о том, сколько звёзд заслуживает Мэрфи. А сравнить результаты. У вас что получилось?

Потом я сделал ещё одну неприятную вещь: сравнил стратегию с отсутствием стратегии

Вернёмся к цифрам. Представим, что вместо пробоев мы просто держим длинную позицию, сохраняя сопоставимую схему нормализации риска по инструментам.

Такой контроль тоже посчитан. И на периоде 2010–2026 он показывает +9,44% в год, Sharpe 0,683.

В качестве второго ориентира взял сохранённый результат другой трендовой системы — 12-месячного time-series momentum на тех же исходных данных. Там +5,87% в год, Sharpe 0,479. У четырёхнедельного пробоя — +0,09% и Sharpe 0,008.

Конечно, эти числа не доказывают, что нужно всегда покупать всё подряд: у простого long-портфеля свои риски, зависимость от эпохи и от конструкции экспозиции. Да и контроль TSMOM взят из другого, ранее проведённого эксперимента, а не пересчитан в рамках этого репозитория (другие исследования и стратегии буду публиковать на Хабре и на гитхабе дальше. Следите).

Но вопрос у меня был конкретный: добавляет ли короткий пробой что-нибудь убедительное по сравнению с более простыми альтернативами?

На этих данных — не добавил.

«Постой. Но это же не совсем правило из книги»

Вот теперь возвращаемся к самому важному возражению. И оно справедливое.

У Дончиана в описании Мэрфи речь идёт о максимумах и минимумах четырёх завершённых недель, а в основной модели я использовал 20 предыдущих дневных закрытий.

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

Четыре завершённые календарные недели, но всё ещё по закрытиям. На периоде после 2009-го получилось +0,58% в год после модельных издержек, Sharpe 0,049. Суть вывода не изменилась.

Версия по реальным дневным максимумам и минимумам. Проверил отдельно три рынка, где в наборе были OHLC-данные: фондовый фьючерс ES, золото GC и десятилетние казначейские облигации США TY. Некоторые результаты там положительные, но оценка слабая или умеренная и до полноценного моделирования торговых расходов и реального исполнения. Это диагностика, а не доказательство работоспособности классического правила на всех 84 инструментах.

Поэтому я не буду писать «опроверг Дончиана».

Я проверил конкретную, заранее зафиксированную реализацию идеи Дончиана. Именно она не прошла современную проверку.

Разница кажется занудной. Пока кто-нибудь не начинает на основании вашего теста принимать решения о деньгах.

Статистика тоже не захотела сотрудничать

Можно сказать: ну почти нулевая доходность — это ещё не доказательство, что преимущества нет. Может, нам просто не повезло с конкретной историей?

Согласен. Поэтому в исследовании использован 12-месячный блочный bootstrap — способ оценить неопределённость результата, сохраняя внутри блоков часть временной структуры доходностей.

Для современной годовой арифметической доходности 95-процентный интервал получился примерно от −4,32% до +4,78%. Он включает ноль. Причём очень уверенно.

Это не доказательство, что эффект никогда не существует. Это указание, что на доступных данных мы не сумели надёжно отличить его от нуля.

А если даже статистическую часть на минуту забыть, у нас остаётся практическая проблема. Средняя валовая экспозиция модельного портфеля в современном периоде — около 8,3×. Диверсифицированная корзина из десятков фьючерсов с такими весами — совсем не то же самое, что идея «положу пять тысяч долларов на счёт и запущу робота».

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

Самое сложное — ничего не улучшать

В трейдинге всегда можно придумать, почему не получилось:

Окно слишком короткое. Годы не те. Издержки слишком суровые и т.д.

Выход надо делать по двум неделям, как описаны некоторые варианты у Мэрфи.

А если ещё добавить фильтр волатильности, часовой пояс и фазу Луны — получится вообще красиво. Только это будет уже не проверка исходной идеи.

У исследования был зафиксированный протокол и критерии прохождения. По главному современному периоду оно их не выдержало. Я сохранил результат как CLOSED / NOT VALIDATED.

Даже неловкий технический момент не стал замазывать: в одной вспомогательной проверке исходный код некорректно интерпретировал NaN как прохождение критерия концентрации прибыли по годам. Это не влияло на общий отрицательный вердикт, но ошибка задокументирована. Исходная версия кода сохранена без задней правки.

И вот это, пожалуй, интереснее самого правила. Когда стратегия даёт плюс, руки чешутся её опубликовать. Когда она не даёт почти ничего, руки чешутся её доработать. А иногда полезнее закрыть вкладку с оптимизатором и оставить отрицательный результат в покое.

Что осталось после эксперимента

Не торговый робот. Не волшебный индикатор. И точно не аргумент, что все трендовые стратегии умерли.

Остались протокол до просмотра результатов, код на Python, исторические таблицы, графики и проверка воспроизводимости. Всё это я выложил на GitHub:

Donchian Four-Week Rule — исследование, код и результаты

Там же описаны ограничения данных и модели. Чтобы повторить расчёт, нужен Python 3.10+, зависимости из requirements.txt и исходный пакет данных trendfollowing==1.3.1, который отдельный скрипт загружает с проверкой SHA256. Саму чужую библиотеку и книгу я не перепубликовываю.

Минимальная последовательность:

python -m pip install -r requirements.txt
python scripts/fetch_data.py
python run_research.py
python scripts/verify_reproduction.py
python -m unittest discover -s tests -v

История получилась не такой, какую обычно хочется показывать в портфолио исследователя и разработчика.

Я взял красивое правило из классической книги. Увидел приличную доходность в старые десятилетия. А потом дошёл до современных данных, добавил издержки, сравнил с простыми альтернативами — и преимущество практически исчезло.

И теперь, когда я слышу «эта стратегия работает десятилетиями», у меня появляется встречный вопрос.

Какими десятилетиями — и после каких расходов?


Старый трейдер поделился секретом заработка. Я проверил с помощью кода. Удалось заработать? - 4

Об авторе

Разработка · ИИ · Исследования

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

GitHub: Разработки и исследования

Ранее на Хабре: Как я уделал Microsoft, но это никому не нужно (кайфую сам) — история создания Jupiter, программы голосового ввода текста для Windows.

Автор: Trop_12

Источник