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

Maxim Romanov | 16 февраля, 2021

Введение

Перед началом рекомендую ознакомиться с предыдущей статьей из этой серии "Самоадаптирующийся алгоритм (Часть 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 определяется просто: 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 типа формул, в зависимости от формата валютной пары. Пересчитаю размер свечей из пунктов в доллары по следующим формулам:

В формулах: 

Рассмотрим первую формулу для 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 годам тестов по одному торговому инструменту.


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