English 中文 Español Deutsch 日本語 Português
Самоадаптирующийся алгоритм (Часть IV): Дополнительный функционал и тесты

Самоадаптирующийся алгоритм (Часть IV): Дополнительный функционал и тесты

MetaTrader 5Трейдинг | 16 февраля 2021, 08:12
6 033 68
Maxim Romanov
Maxim Romanov

Введение

Перед началом рекомендую ознакомиться с предыдущей статьей из этой серии "Самоадаптирующийся алгоритм (Часть III): Отказываемся от оптимизации". Сейчас это уже необходимо, без ознакомления с предыдущей статьей будет непонятно, о чем идет речь.


Работа внутри основных серий

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

В предыдущей статье я показал, как алгоритм генерирует сигнал на открытие позиций и анализирует одновременно несколько масштабов для определения максимального трендового масштаба. Был описан базовый алгоритм работы. Но график ценового ряда не состоит из одного масштаба. Тренд одновременно может присутствовать на нескольких масштабах, при этом на других масштабах может быть флэт. Эту особенность нужно использовать для получения прибыли.

Тут нужно уточнить, что под трендовым участком я понимаю участок, на котором вероятность продолжения тенденции выше 50%, а под флэтовым, наоборот, вероятность разворота тенденции выше 50%. Другими словами, если предыдущий блок был растущим, то на трендовом участке новый блок тоже будет растущим с вероятностью выше 50%. На флэтовом графике, наоборот, после растущего блока вероятнее всего появится падающий блок. Подробно предлагаемое определение я описывал в статье "Что такое тренды и какова структура рынков - трендовая или флэтовая?"

trend-flat

Рисунок 1. Одновременно тренд и флэт на разных масштабах 

На рисунке 1 показано, что на 32 блоках размером 0.00061 присутствует ярко выраженный нисходящий тренд. Но на 32 блоках масштаба 0.00131 тренд уже почти отсутствует. В большинстве случаев одновременно есть масштабы, на которых сейчас присутствует тренд и масштабы, на которых сейчас флэт.

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

inside from block

Рисунок 2. Движения внутри блока большого масштаба

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

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

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

long trend

Рисунок 3. Колебания меньшего масштаба на большом трендовом участке

На рисунке 3 показан пример продолжительного нисходящего тренда по инструменту GBPUSD в 2008 году. Откат по этому тренду до точки закрытия серии позиций занял 275 дней. Бывают и более продолжительные тренды. Было бы неверно, если бы алгоритм не торговал все это время, а ждал пока цена откатится, чтобы завершить ранее начатую серию позиций. Красным эллипсом показан участок, на котором нельзя начинать новую серию, а голубым кругом показано, где дополнительные серии принесут прибыль.

Нужно ввести понятие базового таймфрейма. Под таймфреймом в своей работе я имею ввиду размер блоков. Исходные данные для анализа берутся со статичного таймфрейма М1. Базовый таймфрейм — это таймфрейм, который сейчас используется для открытия позиций алгоритмом. Алгоритм начинает анализ состояния рынка с первого таймфрейма и дальше в процессе работы повышает его до нужного в зависимости от размера трендового движения. Если размер блока первого таймфрейма равен 10 пунктам, то размер блока второго таймфрейма получается равным 10*KTF. Тут KTF  — коэффициент умножения размера блока для получения блоков следующего таймфрейма. Если KTF=1.1, и размер блока первого таймфрейма=10, то размеры блоков будут следующие:

TF1=10 пунктов, TF2=10*1.1=11 пунктов, TF3=11*1.1=12.1 пункта и так далее.

Основная задача  — не допустить начало новых серий во время продолжительного безоткатного движения. Если взять пример с рисунка 3, то начав вторую серию на середине тренда, алгоритм просканирует все масштабы и сразу перейдет на максимальный масштаб или близкий к нему. В таком случае размер блока базового таймфрейма второй серии станет примерно равен размеру блока базового таймфрейма первой серии, а это не имеет смысла.

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

confirmed series

Рисунок 4. Механизм подтверждения начала второй серии

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

Если для начала серии и поиска трендового движения анализируется 10 блоков (как на примере рисунка 4), то возникает вопрос: сколько блоков нужно взять для поиска флэтового участка? Если сейчас задать это число жестко, то алгоритм не будет адаптирующимся, значит, это число блоков должно как-то зависеть от того, что происходит на рынке.

Для определения числа блоков подтверждения серии нужно задать диапазон, в котором будет идти поиск флэтового участка. Диапазон будет задан двумя значениями:

  • Bmin  — минимальное число блоков диапазона подтверждения второй серии;
  • Bmax  — максимальное число блоков диапазона подтверждения второй серии;
  • NPb(s2)  — число преобладающих блоков второй серии;
  • %PV  — процент из настроек для определения флэтового состояния.

Минимальное значение Bmin определяется просто: Bmin=NPb(s2)/(%PV/100).

Для определения верхней границы диапазона Bmax нужно посчитать, сколько блоков базового таймфрейма второй серии помещается в 2 последних сформированных блока базового таймфрейма первой серии и прибавить к этому значению блоки базового таймфрейма второй серии, для которых еще не сформировался большой блок. Так расcчитывается верхняя граница диапазона Bmax. 

Рассмотрим пример на рисунке 4. Пусть %PV=50, число преобладающих блоков NPb(S2)=9. Тогда Bmin=9/(50/100)=18. Минимальное число блоков, на котором может быть найден флэт 18. Для нахождения Bmax считаем, сколько маленьких блоков в последних двух больших, на рисунке 4 это 14 блоков. Затем считаем, сколько маленьких блоков построено справа от закрытия последнего большого, это 5 блоков. Затем находим сумму 14+5=19. Получен диапазон Bmin=18, Bmax=19. 

Далее в диапазоне от 18 до 19 блоков базового таймфрейма второй серии ищем флэтовый участок. За флэтовый участок примем тот, на котором число падающих блоков равно числу растущих. Критерий флэтового участка можно регулировать в настройках, потому что 50% слишком узкий диапазон. Можно задать значением 50-55% и считать, что если преобладающих блоков от 50% до 55%, то это флэтовый участок.

В процессе расчетов Bmax может получиться достаточно большим, да и Bmin  — это величина плавающая. Поэтому определять флэтовый участок при помощи фиксированного процента для разного числа блоков решение неверное. Правильнее будет задавать значение в формате вероятности попадания в диапазон и затем пересчитывать в процент. Для этого разработана таблица 1, показанная ниже.

series confirmation table

Таблица 1. Таблица расчета процента от числа блоков для подтверждения серии.

Пусть критерием флэтового участка будет 56.25% блоков одного направления для выборки из 16 блоков. Этот процент соответствует 80.36% всех событий, попадающих в диапазон от 2-х до 16-ти блоков по вертикали. То есть в 80.36% случаев за 16 блоков процесс пройдет от 2-х до 16 блоков по вертикали. Имея таблицу, можно пересчитать процент подтверждения серии для каждого уникального числа блоков, принимая во внимание, что процент подтверждения должен быть таким, чтобы 80.36% всех событий попадало в диапазон амплитуд.

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

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

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

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

Как это работает

Для примера рассмотрим участок графика, показанный на рисунке 5. Это тот же участок, который показан на рисунке 3. Для алгоритма данный участок сложный, с длительным ожиданием отката для закрытия позиций.

opening positions

Рисунок 5. Пример создания нескольких серий одновременно

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

Рассмотрим 2 участка с одинаковой ценой и оценим просадку по средствам в эти два момента времени. Первая точка будет 13.11.2008 с ценой 1.45554, открыты позиции Buy первой серии и цена идет против открытых позиций, средства составляют 8265.16$. Затем цена продолжает падать и 10.04.2009 возвращается на уровень 1.45554. Но теперь средств стало на 1677.57$ больше, то есть 9942.48$. Если цена пойдет против нашей позиции, то мы получим не такую большую просадку, какую могли бы получить, не используя механизм дополнительных серий.

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


Компенсация убыточных позиций и ошибок принятия решений

Методы определения тренда и автоматического масштабирования работают хорошо, но не идеально. В процессе работы алгоритм иногда будет открывать позиции несвоевременно. Позиции могут открыться в самом начале продолжительного тренда, и в расчетной точке закрытия серии позиций может получиться убыток. Сдвигать точку закрытия позиций нельзя, потому что она рассчитывается на основе характеристик ценового ряда. Как рассчитывается откат от тренда и почему выбираются именно такие значения отката я писал в предыдущей статье "Самоадаптирующийся алгоритм (Часть III): Отказываемся от оптимизации". Но можно вычислять ошибочно открытые позиции и корректировать их.

Коррекция ошибочных позиций при помощи прибыли дополнительных серий

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

average loss

Рисунок 6. Закон увеличения убытка от пройденного числа шагов

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

Часть прибыли, полученной от работы дополнительных серий, пойдет на закрытие ошибочно открытых позиций. Для себя в настройках я сделал возможным настраивать этот параметр. Некоторую прибыль, полученную от работы, придется тратить на поддержание стабильности алгоритма. Чем лучше работает алгоритм, тем меньший процент прибыли придется тратить на поддержание стабильности. Сейчас я использую 80% прибыли дополнительных серий для компенсации убыточных позиций.

Для определения ошибочных позиций разработан простой метод. Если в расчетной точке закрытия серия получит убыток, то в ней точно есть ошибочные позиции. Из всех позиций данной серии находится самая убыточная и оценивается текущий размер убытка по этой позиции. Если эта позиция принадлежит первой серии, то 80% прибыли, полученной от вторых серий, должны перекрыть текущий убыток по данной позиции. Если это условие выполняется, то позиция закрывается. 

По мере работы накапливается резерв средств, которые будут использоваться для компенсации убыточных позиций. Когда возникает необходимость, эти средства используются для компенсации убытка по открытой позиции и убыток от закрытия позиции вычитается из этого резерва. Далее алгоритм продолжает накапливать резервные средства для следующей компенсации. Так продолжается, пока не закроются все ошибочные позиции или не завершится основная серия. После завершения основной серии все неиспользованные средства из резерва обнуляются.

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

На рисунке 5 видно, что некоторые позиции Buy первой серии были закрыты в убыток, не дожидаясь общей точки закрытия серии, это срабатывал алгоритм компенсации убытка.

Таким образом колебания, эксплуатируемые для получения прибыли вторыми сериями, всегда меньше, чем амплитуда тренда первых серий.  Амплитуда тренда третьих серий еще меньше. Дополнительные серии не приводят к существенному увеличению просадки по средствам, но приносят дополнительную прибыль, которая используется для поддержания стабильности. Число одновременно открытых дополнительных серий зависит исключительно от текущего состояния рынка и не настраивается трейдером, это еще одна адаптивная функция. Сам алгоритм имеет фрактальную структуру, он копирует сам себя на разных масштабах. При этом подстраивает свою работу под каждый масштаб индивидуально.

Коррекция точки закрытия серии на основе колебаний меньших масштабов

Как я писал ранее, точка закрытия серии (откат от основного тренда) зависит от скорости, с которой произойдет этот откат. Скорость измеряется в числе шагов, которое потребовалось цене, чтобы совершить откат. Чем число шагов больше, тем меньше величина отката от трендового движения. Такая особенность связана с фундаментальными причинами возникновения трендов. Тренды создают объемы сделок, превышающие текущую ликвидность. Другими словами, открытие или закрытие позиций на большие суммы. После того, как условная позиция, создавшая трендовое движение, была открыта, ее нужно закрыть, и для этого нужна ликвидность. Если она будет закрыта моментально, то откат будет 100% от предыдущего тренда, то есть возникнет ровно такое же трендовое движение в противоположную сторону. Но чем медленнее будет закрываться позиция, тем меньше будет откат. При этом совершенно не важно, один участник торгов вызвал движение или множество, механизм одинаковый.

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

Можно все посчитать, учесть все колебания и так было бы максимально правильно, но для упрощения (алгоритм уже сложный) я сделал по-другому. Для коррекции точки закрытия будет использоваться прибыль дополнительных серий по инструменту. Это 80% прибыли, полученные от закрытия дополнительных серий. Рассчитывается, сколько прибыли получит серия в валюте депозита, если все позиции закроются в расчетной точке закрытия. Берется текущая прибыль по этой серии и к ней прибавляется прибыль, доступная на данный момент от работы дополнительных серий. Если полученное значение больше или равно расчетной прибыли в точке закрытия, то основная серия завершается. Считается, что откат завершен и серия завершается.

Close point

Рисунок 7. Коррекция точки закрытия на основе прибыли дополнительных серий

На рисунке 7 показан пример коррекции точки закрытия на основе прибыли дополнительных серий. Открытые позиции должны закрыться в верхней точке по цене 1.69846 с прибылью 915.66$. К моменту, когда цена достигла уровня 1.60887, текущий уровень прибыли составлял 109.35$, но из-за больших колебаний дополнительные серии заработали 1009$, и 80% этой прибыли используется для досрочного закрытия серии, то есть доступно 807.2$. Проверяется неравенство 109.35+807.2=916.55>915.66, и серия завершается досрочно.

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

Коррекция ошибочных позиций при помощи прибыли, полученной от торговли на других активах

Описанный выше алгоритм работает и помогает снизить волатильность средств, но система разрабатывалась для работы одновременно на 28 торговых инструментах. Отдельные торговые инструменты могут продолжительное время находиться в состоянии излишнего восходящего или нисходящего тренда. Поэтому для еще большего снижения волатильности графика доходности нужно использовать прибыль, полученную от закрытия каждой первой серии на других инструментах. 

Такой подход будет работать, если тренд на одних торговых инструментах будет сопровождаться флэтом на других. На рисунке 6 я показал примерный закон, по которому увеличивается средняя амплитуда колебаний на одном инструменте от числа шагов. Зная этот закон, можно сказать, что на 28 торговых инструментах все будет происходить аналогично. То есть среднее расстояние, пройденное ценой по вертикали, будет примерно пропорционально размеру шага, умноженному на число шагов в степени 0.5 (для разных инструментов и рынков будет своя степень). Для наглядности лучше взять 28 торговых инструментов и посчитать, сколько они пройдут в среднем за n шагов, а еще лучше отобразить на графике.

Как отобразить на одном графике 28 независимых друг от друга торговых инструментов? У каждого из них своя индивидуальная волатильность и разный диапазон колебаний, все знают, что характер поведения каждого торгового инструмента не похож на другой. Не похожи они только в том виде, в котором мы видим их на графике. Если пересчитать размер свечей не в пунктах, а в единой валюте (например в долларах), и принять, что мы совершаем сделки на фиксированную сумму в долларах, то масштабы и волатильность у каждого инструмента станут примерно одинаковые. В рамках торговой системы решающим фактором будет то, сколько долларов проходит цена по вертикали за n шагов при торговле фиксированной суммой.

Нужно перейти от графика в пунктах к графику прибылей. Важно заметить, что речь идет именно о фиксированной сумме для торговли, а не фиксированном лоте, это совершенно разные вещи. Пусть торговля ведется на валютных парах суммой 1000$ по каждому инструменту. Тогда всего будет 4 типа формул, в зависимости от формата валютной пары. Пересчитаю размер свечей из пунктов в доллары по следующим формулам:

  • formula EURUSD;
  • formula USDCAD;

  • formula eurgbp;

  • formula cadchf.

В формулах: 

  • EURUSD, USDCAD, EURGBP, CADCHF  — размер свечи в долларах для соответствующей валютной пары при торговле на 1000$;
  • EURUSD(-1), USDCAD(-1), EURGBP(-1), CADCHF(-1)  — цена закрытия предыдущей свечи;
  • EURUSD(0), USDCAD(0), EURGBP(0), CADCHF(0)  — цена закрытия последней сформированной свечи;
  • 1000 — сумма сделки в долларах.

Рассмотрим первую формулу для EURUSD и всех валютных пар, в которых сделка совершается на сумму в валюте, стоящей на втором месте. Сделки будут совершаться на сумму 1000$, тогда логика определения размера свечи будет следующая: Продается 1000$ -->> покупается EUR по курсу предыдущей свечи (-1 свеча) -->> на 1000$ совершается обратная сделка с EUR по курсу последней закрытой свечи (0 свеча) -->> из числа EUR, купленных на 1000$ по курсу (-1) свечи, вычитаетcя число EUR, проданных за 1000$ по курсу нулевой свечи -->> полученная прибыль/убыток в EUR переводится в доллары по текущему курсу EURUSD -->> получен прибыль/убыток в долларах. Так получается размер свечи в долларах. 

Далее, чтобы построить график с размерами свечей в долларах, нужно размер каждой следующей свечи прибавить к размеру предыдущей.

Для USDCAD и всех валютных пар, в которых доллар на первом месте, расчет проще, сделка уже в долларах. Для кросс-курсов смысл расчета аналогичен формуле для EURUSD за исключением того, что в паре EURGBP 1000$ нужно пересчитать в GBP, затем совершить торговую операцию, и затем полученную прибыль в EUR обратно пересчитать в доллары. Для CADCHF смысл аналогичен предыдущим вариантам, но с условием, что пересчитывать нужно через пару, у которой доллар стоит на первом месте, и формула модифицирована соответствующим способом.

В любом случае смысл операций - рассчитать, сколько долларов можно заработать/потерять, торгуя на сумму 1000$ для свечи данной амплитуды для каждой валютной пары. 

В данном алгоритме 80% всей прибыли, полученной от закрытия каждой первой серии любого торгового инструмента, пойдет на компенсацию ошибочно открытых позиций того инструмента, для которого требуется такая компенсация. Таким образом, весь алгоритм будет работать над своевременным закрытием "лишних позиций" не только по своему торговому инструменту, но и по любому другому торговому инструменту. Цель - как можно быстрее закрыть ошибочные позиции, чтобы затяжные трендовые участки не приводили к существенным просадкам по средствам. Это должно снизить волатильность графика доходности.

28 currency pairs

Рисунок 8. Пройденный путь за 10 000 шагов для 28 валютных пар

На рисунке 8 показаны графики прибылей для 28 валютных пар одновременно, рассчитанных по формулам, показанным выше. Графики построены для 10 000 свечей таймфрейма H4. Для анализа взяты данные с 2004 по середину 2010 года. Файл excel приложу к статье, сможете подставить свои данные, которые интересны, и посмотреть формулы, по которым построены графики.

На рисунке 8 видно, что во время тренда на одних валютных парах возникает флэт на других. Это подтверждает идею, что можно снизить волатильность графика доходности при помощи компенсации ошибочно открытых позиций прибылью, полученной от торговли по всем инструментам одновременно. Всегда найдется торговый инструмент, по которому алгоритм будет зарабатывать в текущий момент времени.

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

Дополнительно я измерил средний размер свечи в долларах всех торговых инструментов, она составила 2.26$. Зная число шагов и средний размер шага, можно оценить, сколько теоретически в среднем пройдут все инструменты по вертикали. Для этого 2.26$*10000^0.5=226$. Реально все торговые инструменты в среднем прошли за 10 000 шагов, 216.41$, что близко к теоретической величине.

В данном алгоритме 80% всей прибыли, полученной от закрытия каждой первой серии любого торгового инструмента, пойдет на компенсацию ошибочно открытых позиций того инструмента, для которого требуется такая компенсация. Таким образом весь алгоритм будет работать над своевременным закрытием "лишних позиций" не только по своему торговому инструменту, но и по любому другому торговому инструменту. Цель - как можно быстрее закрыть ошибочные позиции, чтобы затяжные трендовые участки не приводили к существенным просадкам по средствам. Это должно снизить волатильность графика доходности.

На рисунке 9 показан пример того, как это работает, и насколько хорошо справляется идея со своей задачей. Для теста выбраны не коррелирующие торговые инструменты и тест проведен за 2020 год на таймфрейме M1. Важно отметить, что настройки не оптимизировались и для всех инструментов установлены одинаковые, алгоритм сам корректирует свою работу в реальном времени.

GBPUSD+AUDNZD

EURCAD+CHFJPY

GBPUSD+AUDNZD+EURCAD+CHFJPY

Рисунок 9. Пример работы функции мультиинструментальной компенсации

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

Видно, что максимальная просадка по средствам была на валютной паре GBPUSD и составила 4311$. Максимальная доходность показана тоже на GBPUSD 1555$. При этом на AUDNZD получился убыток 109$ из-за того, что тест был остановлен. Если бы тест продолжался, то торговля вышла бы в плюс.

При помощи алгоритма мультиинструментальной компенсации удалось снизить просадку по средствам во время теста на четырех валютных парах одновременно, с 4311$ до 3517$, то есть на 18%. Суммарная доходность стала равна 2015.21$. При этом суммарное число совершенных сделок во время раздельной торговли получилось 1446, а во время совместной торговли снизилось до 1409, что говорит о том, что сами алгоритмы компенсации практически не влияют на ход торговли, но улучшают стабильность работы.

Таким образом, чем больше торговых инструментов будет использоваться для торговли, тем более ровный график доходности можно получить, вплоть до линейного, если одновременно торговать 1000 торговых инструментов с разных бирж мира и разных рынков. Одновременно можно вести торговлю и на фондовом, и на валютном рынке, и даже на криптовалютном, балансируя соответствующим образом объемы сделок по каждому торговому инструменту.


Тесты

Алгоритм должен работать на любом торговом инструменте, поэтому для начала я покажу, как он работает на акции AAPL (Appl). На данный момент робот не умеет собирать статистические характеристики инструмента, эта функция в разработке, поэтому 2 параметра я настрою вручную. Это будут процент для открытия серии и процент для закрытия серии. Но значения этих параметров получены не методом оптимизации и подгонки, а измерены при помощи индикатора, который будет интегрирован в робота. В дальнейшем робот будет сам корректировать эти значения.

AAPL Buy 

AAPL Buy tester report

Рисунок 10. AAPL только длинные позиции

Для акции AAPL тесты будут сделаны раздельные: для Buy-позиций и для Sell-позиций, потому что статистические характеристики инструмента не симметричны для случая роста и падения. Для позиций Buy параметры более агрессивные, для позиций Sell более консервативные. Но меняются только 2 параметра.

На рисунке 10 показан результат бектеста за период с 24.06.2012 по 28.12.2020, то есть за 7.5 лет. Тест проводился на таймфрейме М1. Видно, что график доходности ровный, максимальная просадка по средствам составила 858$, а заработано было 1704$. Всего было открыто 176 позиций и профит-фактор равен 18.13, а это очень хороший показатель.

Многие скажут, что для того, чтобы заработать на растущей акции AAPL, открывая только позиции Buy, не нужен сложный алгоритм и будут правы. Проверим, как поведет себя алгоритм, если разрешить только позиции Sell. Открывать короткие позиции по акции Appl равно самоубийству, но алгоритм адаптирующийся, пусть выживает.

AAPL sell

AAPL sell report

Рисунок 11.  AAPL только короткие позиции

На рисунке 11 показано, как отработал алгоритм на акции AAPL с 24.06.2012 по 28.12.2020, таймфрейм M1. Результаты уже не такие хорошие, как для позиций Buy, но ему удается зарабатывать. Тут уже максимальная просадка по средствам составила 10533$, а доходность 2234$, да и профит фактор уже значительно меньше и равен 1.4. При этом открыто 944 позиции. Если бы он мог торговать одновременно Buy и Sell позиции, то результат был бы лучше, потому что работали бы алгоритмы компенсации ошибочных позиций, снижающие волатильность графика доходности. А с торговлей одновременно по 28 торговым инструментам ситуация станет еще лучше. Но то, что он прошел 7.5 лет в почти автоматическом режиме, без подгонки параметров под историю, это очень хороший результат.

Сейчас важно, что он смог адаптироваться к сложным условиям. Я не просто так взял акцию AAPL для тестов, это очевидно сложный торговый инструмент для торговли короткими позициями. Посмотрим график этого инструмента за время тестов.

AAPL chart

Рисунок 12. График акции AAPL с 24.06.2012 по 28.12.2020

На рисунке 12 видно, какой сильный рост был по акции AAPL, за последние 7.5 лет актив вырос в 6.3 раза. Заработать в полностью автоматическом режиме без оптимизации на таком графике задача нетривиальная.

Алгоритм создавался, чтобы работать на 28 торговых инструментах одновременно, поэтому дальше будут тесты сразу на 28 торговых инструментах. Сначала посмотрим на результаты работы для рынка FOREX. В тесте использовались валютные пары: GBPUSD, EURUSD, NZDUSD, AUDUSD, USDCAD, USDCHF, USDJPY, EURGBP, EURAUD, EURNZD, EURCAD, EURCHF, EURJPY, GBPAUD, GBPNZD, GBPCAD, GBPCHF, GBPJPY, AUDNZD, AUDCAD, AUDCHF, AUDJPY, NZDCAD, NZDCHF, NZDJPY, CADCHF, CADJPY, CHFJPY. Для всех валютных пар были установлены абсолютно одинаковые настройки, алгоритм сам адаптировался в реальном времени ко всем изменениям, происходящим на рынке. 

Тест проводился с 01.01.2008 по 13.01.2021 (13 лет), использовался таймфрейм М1. Робот потребляет много ресурсов и тест 1 года проходит примерно за 12 дней, поэтому для распараллеливания тестов весь интервал тестирования разбит на участки по 1 - 2.5 года.

2008-2009

2009-2010

2010-2011

24.06.2010 -24.06.2012

24.06.2012 - 24.06.2014

24.06.2014-24.06.216

24.06.2016 - 24.06.2018

24.06.2018-13.01.2021

Рисунок 13. Тесты 28 валютных пар с 01.01.2008 по 13.01.2021

На рисунке 13 показаны тесты на 28 валютных парах одновременно. Видно, что торговля на почти всех тестовых интервалах завершилась в плюс, кроме участка с 24.06.2012 по 24.06.2014. Тут тест завершился с небольшим убытком, равным 123$. Это связано с тем, что тест остановился. Если бы тест продолжался непрерывно все 13 лет, то робот вышел бы из просадки. За все время было открыто 14 415 позиций, эта статистически значимая величина говорит о том, что результаты были получены неслучайно. Просадка по средствам имеет адекватное значение, но в будущих версиях алгоритма нужно работать над улучшением показателей доходности и стабильности. 

Робот универсальный, поэтому посмотрим, как он работает на акциях российских компаний, торгующихся на MOEX. Настройки установлены такие же, как и для валют, и тоже одинаковые для всех инструментов, но разрешены только длинные позиции. Текущая версия робота еще не умеет корректировать параметры раздельно для коротких и длинных позиций, но функционал в разработке. Тест проводился с 01.02.2013 по 20.09.2018 (5 лет 7 месяцев), в тестере было установлено кредитное плечо 1:5. В портфель были отобраны самые ликвидные инструменты: GAZP, CHMF, ALRS, HYDR, LKOH, MAGN, MGNT, MTSS, NLMK, NVTK, ROSN, RTKM, SBER, SNGS, SNGSP, TATN, VTBR, SBERP, TATNP, AFLT, FEES, GMKN, RSTI, SIBN, UPRO, MSNG, MTLR, PLZL.

moex

Рисунок 14. Тест на 28 акциях российских компаний 01.02.2013 по 20.09.2018

На рисунке 14 показаны результаты теста по 28 акциям Российских компаний. Видно, что алгоритм зарабатывает достаточно стабильно и равномерно. Доходность получилась, как и в предыдущем случае, невысокой, но важно, что он не теряет деньги, а зарабатывает. За все время было открыто 5485 позиций, что говорит о том, что результат был получен не случайно. 

Откуда берется прибыль

Мало сделать алгоритм или модель, которая работает, нужно еще понимать, почему она работает и откуда берется прибыль. В данном случае прибыль берется из неочевидного источника, а именно  — из увеличивающейся энтропии. Речь об энтропии, определяемой по принципу Больцмана, характеризующейся числом возможных состояний системы и вероятностью конкретного состояния.

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

Максимальная энтропия на валютном рынке, минимальная на низколиквидных активах. Энтропия каждого конкретного торгового инструмента стремится стать максимальной, но мешает ей это сделать приток средств. Приток средств возникает по двум причинам: из-за инвестиционной привлекательности актива и из-за эмиссии денежных средств. У каждого торгового инструмента энтропия будет расти в конечном итоге.


Выводы

Доходность получилась невысокая, но в статьях показана модель, которая позволяет в полностью автоматическом режиме торговать в плюс по совершенно разным торговым инструментам, и не только разным, но и торгующимся на принципиально разных рынках. Показаны тесты по 57 торговым инструментам, а так как настройки у каждого торгового инструмента одинаковые, то можно сказать, что это эквивалентно 520 годам тестов по одному торговому инструменту.

  • Получен базовый алгоритм, который способен работать стабильно, далее нужно его совершенствовать, улучшая каждый описанный механизм, чтобы существенно повысить доходность и снизить просадки по средствам. 
  • В предыдущей статье я писал про два метода отслеживания текущего тренда, они описаны в пункте "задержка открытия позиций". Тесты для 28 торговых инструментов проведены с использованием метода "задержка по трендовому участку". Это не оптимальная методика, "задержка на основе статистических характеристик инструмента" работает лучше, но на данный момент алгоритм не доделан, и я использовал то, что уже работает корректно. В будущих версиях алгоритма эта функция будет значительно улучшаться.
  • Требуется дополнительный анализ данных для предварительного выбора минимального размера блока, чтобы уменьшить число ошибочно открываемых позиций.
  • В алгоритме не учитывается разная стоимость активов и, соответственно, разная цена за блок, построенный на этом активе. Это существенно снижает доходность для биржевых инструментов. Нужно добавить балансировку размера лота по портфелю, в зависимости от стоимости блока для каждого конкретного актива.
  • Для лучшей работы нужно сделать раздельное управление алгоритмами принятия решений для длинных и коротких позиций, добавить анализ статистических характеристик и асимметрии каждого конкретного торгового инструмента.
  • 80% всей прибыли идет на поддержание стабильности алгоритма, нужно улучшать как механизм компенсации убыточных позиций, так и механизмы принятия решений, это позволит значительно поднять доходность.
  • Алгоритм не умеет собирать статистические характеристики каждого торгового инструмента и на данный момент работает "вслепую", используя только механизмы адаптации. В следующих версиях параметры будут корректироваться на основе статистических характеристик торгового инструмента полностью автоматически, что улучшит показатели доходности. 
  • Сейчас не используются различия между ценовыми графиками валютных пар и акций, нужно доработать модель, добавив уже имеющиеся знания.

    Предыдущие статьи на эту тему

    Прикрепленные файлы |
    chart_in_dollars.zip (15109.65 KB)
    Последние комментарии | Перейти к обсуждению на форуме трейдеров (68)
    Evgeniy Ilin
    Evgeniy Ilin | 25 февр. 2021 в 11:37
    Пересидка по усреднению с мартином дает прямые графики но как уже замечено максимальная просадка по эквити сравнима с прибылью за тот же период теста, можно конечно подробить и найти участки которые будут выглядеть хорошо. Но система опасна хоть  и работоспособна, нужен большой депо в районе 10000 баксов чтобы выдержать пересидки, сам тоже сейчас сделал по усреднению сов но все это довольно скользкий путь. Если система работает и за ней стоит какой то сигнал хороший то просто сигнал на вход и сигнал на выход и все. Но уже не будет таких графиков, это будут жуткие волны причем еще не факт что они смогут спред преодолеть. Как показала практика и тесты количество падающих блоков или просто долгое движение цены не всегда дает нужного отката. А если по честному чем глубже просидка тем еще глубже она может просесть. Чтобы включать пересидку нужно знать уровни ниже которых она точно не просядет, а это по моему опыту невозможно. Но вы продолжайте, может у вас и получится, деталей много у вас может быть и выйдет. Но я вот даже мультипликатор шага делал для усреднения и шаг умножался постоянно но есть участки где просто долбит вниз или верх так что ни дна не потолка не видно. Можно пересидку подстроить конечно чтоб вытягивала но просадка сравнима с прибылью. Попробуйте пересидку отключить и посмотреть что даст алгоритм без нее. Или еще самый простой пут просто кройтесь если пересидка слишком пересидела. Зато это честно и себя не обманете. Механизм конечно красивый, но очень вредный )))
    Maxim Romanov
    Maxim Romanov | 27 февр. 2021 в 09:26
    Amba404:

    to: Maxim Romanov

    нужно, чтобы новые серии закрывались как можно чаще - Не только чаще, а и с достаточной прибылью. Из своего опыта: просадка большую часть времени, сумма профита по прибыльным позициям всегда меньше суммы минуса по убыточным, при неблагоприятном развитии убытки увеличиваются в геометрической прогрессии, в то время как профит растет линейно. Накопленного профита (с учетом, что 20% должно остаться, и пусть это будет не 1 цент) обычно не хватает на закрытие самого минусового трейда (серии), только на часть, потому и назвал "частичным", хотя в статье такого не подразумевалось.

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

    В идеале этот алгоритм и локи не нужны, нужно высчитывать точки наибольшей вероятности разворота цены на основе рыночных данных. Согласен, но тут как получается: или 100% верный вход (что совсем не реально), или будут редкие глубокие минуса по каким-то направлениям. Если Сумма общего профита значительно больше суммы минуса, то убытки и прибыль закроем разом в конце недели, или месяца, и не плачем. Тогда вторым по важности станет алгоритм общего выхода. Если минусов таки "не немножко", то постоянное, оперативное обрубание хвостов - наше всё.

    По моим наблюдениям наращивать позицию имеет смысл только против хода цены. Могу предложить рассмотреть такую ситуацию. Два валютных инструмента, с разными размерами торгуемого в настоящий момент блока, но с одинаковой их стоимостью. По обоим купили, ожидаем выход через два блока. Один пошел вверх, другой вниз, с одинаковой скоростью. Через один блок мы покупаем еще (наращиваем минус), а плюс - нет. Через два блока мы получили +2 по первому (и закрыли), не закрыли -3 по второму (но по нему мы вот как раз сейчас докупаем еще 1 блок, и когда это кончится - неизвестно). Торговля больше относится к вере, а не знаниям. Мы верим в надежность системы, Ну, или не верим, а доверяем ей, с долей уверенности, скажем 0.6. Мы не знаем надежность каждого сигнала, не можем сказать сразу, что вот это верняк100%, а это ошибка; мы доверяем в целом всем 100% сигналов, но только на 60% каждому. И если мы так уверены в том, что минусовая серия достигнет планового результата, и наращиваем её, то почему мы отказываем в доверии изначально положительной сделке (не серии, т.к. не наращивали)?

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

    - размер блока выбирается минимальный...  с уменьшением размера блоков, процент перевеса ... цена закрытия свечи не совпадает с ценой закрытия блока. Мы обсуждали это ранее, повторю тут кратко. Минимальная ближайшая дистанция трейда, имеющая смысл (ИМХО) - это тройной спред (один на профит и два на потери при исполнении входа-выхода). Если на малом размере блока увеличиваются ошибки искажения от построения, и это влияет на результат (что не обязательно), нужно увеличить размер. Если ошибки построения зависят от дискретности исходных данных (по Close), нужно ориентироваться на размер такой дискретности. Я при построении использую OHLC, и ориентируюсь на 5 * iATR(sy, PERIOD_M1, 1440). То, что close М1 не совпадает с close блока, не критично (на мой взгляд), потому что по алгоритму построения последний по времени блок всегда закрывается там же где и close[1] М1, а остальные блоки вполне могут закрываться между двумя close, раз уж изначально упрощаем движение цены до линейного графика close. По поводу процента перевеса: эту парадигму я до конца не воспринял. Я определяю график распределения частот пробега на истории. Затем назначаю флетом вершину полученного колокола (или шляпы) и окрестности её, включающие N% всех наблюдаемых случаев. График зависит только от размера блока и длины статвыборки, и также учитывает общее направление движения на выборке (центр тяжести шляпы будет смещен по ходу движения). Процент флета назначаю произвольно. Но какие длины пробега упадут в заданный диапазон, чтобы считаться трендом или флетом - покажет статвыборка, и я не вижу смысла корректировать границу между трендом и флетом в зависимости от размера блока.

    - Границы между трендом и флетом нет,  - согласен, но см. выше.


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

    - при потере сигнала я начинаю сначала - означает ли это закрытие открытой серии, по которой потерян сигнал?

    - Фикс 10$ обратно уводит систему к матожиданию 0 из-за рандома. Не соглашусь. Долго писать, и всё из "я попробовал", без математики, добавлю только, что не просто фикс 10$, а некая F(),  в том числе от стоимости блока. Стоимость блока  (а в случае минлота - минимальный шаг изменения профита) - величина базовая для системы, и должна быть выбрана исходя из финожидания (рисков и прибыли) и размера депозита. Сама F() - предмет исследования и дискуссии.

    - общий профит я полагаю тоже некая F(), которая зависит больше от числа открытых позиций, общего профита, той же стоимости блока и величины доверия сигналу. Я считаю важным регулярно закрывать все позиции, сокращать пересидку  и не засаживаться в рынок на всю доступную маржу, даже если при этом не полностью реализуются ожидания по профиту.

    - механизм частичного закрытия я планировал попробовать.  Писал выше, что я подразумевал на самом деле под "частичным" закрытием. Сожалею, что ввел в заблуждение своим неясным изложением :(


    Без теории нет смысла измерять корреляцию и собирать статистику. Это будут просто цифры, которые непонятно как меняются. Теоретическая модель обязательно нужна. кто-т опишет, что это мартингал ,кто-то пишет, что перисиживатель или сетка. Без теории это может выглядеть именно так. С теоретической моделью это становится совсем не так. Например я могу показать, как изменяя лоты на фонде можно сделать положительное матожидание. Со стороны будет казаться что это что-то типа мартингейла ,ведь лоты постоянно плавают. Но есть одно различие: без теории это просто плавающие лоты, а с теорией я знаю какие лоты нужно выставлять и почему. Модель не должна быть для форекса или фонды, она должна описывать чем отличаются и похожи между собой рынки, в том числе сырье и криптовалюты.

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

    Опять повторю, почему нельзя просто собрать стат данные с разных масштабов и использовать их. Без теоретической модели это будут просто цифры, поведение которых нельзя предсказать. Коррекция на основе ошибок нужна для того, чтобы не собирать стат данные. Мы должны определить характер рынка при помощи стат данных, понять, насколько он соответствовать модели и брать параметры работы не на основе стат данных а на основе модели. Если мы будем руководствоваться только статистикой, то... Это может сделать каждый, тут нет ничего удивительного, любой математик может это сделать. Но тогда все превращается в погоню за флуктуациями этих параметров и нам непонятно, почему и когда это все меняется. Собрать стат данные и запустить робота торговать, это ничем не отличается от оптимизации. Именно поэтому я разрабатываю теоретическую модель. Робот торгует не рынок, а модель, параметры которой меняются.

    Если сигнал потерян, серия не закрывается. Я тут не понял что значит потерян. Серия начинается когда появляется сигнал и продолжается до тех пор, пока цена не достигнет расчетной точки закрытия. Расчетная точка закрытия постоянно корректируется из-за появления новых блоков. Не может быть такого, что позиции не закрылись, а график уже скорректировался. Точнее у меня может, но это уже детали реализации алгоритма и тут запускается механизм компенсации убыточных позиций.

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

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

    [Удален] | 2 мар. 2021 в 09:42

    привет

    воды добавлю немного )

    алгоритм на алгоритм не тянет - на разных парах разный результат
    ветер дунул, логика порушилась
    попытка создания алгоритма

    а в общем прикольно
    продолжайте, пожалуйста
    с интересом жду окончательного результата

    Aleksey Mavrin
    Aleksey Mavrin | 2 мар. 2021 в 21:54
    Спартак Угланов:

    привет

    воды добавлю немного )

    алгоритм на алгоритм не тянет - на разных парах разный результат
    ветер дунул, логика порушилась
    попытка создания алгоритма

    а в общем прикольно
    продолжайте, пожалуйста
    с интересом жду окончательного результата

    Никак не обоснованное высказывание. Типа "машина то не машина, на болоте не то что на асфальте". Бред короче)

    Zhongquan Jiang
    Zhongquan Jiang | 17 нояб. 2021 в 03:40
    looking foward to the new article.
    Полезные и экзотические приемы для автоматической торговли Полезные и экзотические приемы для автоматической торговли
    В данной статье я покажу несколько очень интересных и полезных приемов для автоматической торговли. Часть из этих приемов возможно кому-то знакома, кому-то — нет, но я постараюсь привести самые интересные методы и объяснить почему стоит ими пользоваться. Самое главное, покажу на практике, что они могут. Напишем советники и проверим все описанные приемы на истории котировок.
    Работа с ценами в библиотеке DoEasy (Часть 64): Стакан цен, классы объекта-снимка и объекта-серии снимков стакана цен Работа с ценами в библиотеке DoEasy (Часть 64): Стакан цен, классы объекта-снимка и объекта-серии снимков стакана цен
    В статье создадим два класса - класс объекта-снимка стакана цен и класс объекта-серии снимков стакана цен и протестируем создание серии данных стакана цен.
    Машинное обучение в торговых системах на сетке и мартингейле. Есть ли рыба? Машинное обучение в торговых системах на сетке и мартингейле. Есть ли рыба?
    Данная статья познакомит читателя с техникой машинного обучения для торговли сеткой и мартингейлом. К моему удивлению, такой подход по каким-то причинам совершенно не затронут в глобальной сети. Прочитав статью, вы сможете создавать своих собственных ботов.
    Нейросети — это просто (Часть 11): Вариации на тему GPT Нейросети — это просто (Часть 11): Вариации на тему GPT
    Сегодня, наверное, одной из самых передовых языковых моделей нейросетей является GPT-3, которая в максимальном своем варианте содержит 175 млрд. параметров. Конечно, мы не будем создавать подобного монстра в домашних условиях. Но давайте посмотрим, какие архитектурные решения мы можем использовать в своей работе и какие это нам даст преимущества.