Разработка самоадаптирующегося алгоритма (Часть I): Поиск базовой закономерности

4 декабря 2020, 10:20
Maxim Romanov
36
4 762

Введение

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

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

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

  1. Использовать нейросети с машинным обучением и получить на выходе "закрытый ящик", который по каким-то своим критериям анализирует рынок и зарабатывает. Несмотря на кажущуюся очевидность и привлекательность такого подхода, в нем есть свои сложности. Если бы это было так легко сделать, то такие компании как GOOGLE и Yandex, с их огромным опытом использования машинного обучения и большими бюджетами давно бы решили эту задачу, ну или по крайней мере были бы среди лидеров в анализе рыночных данных и качестве прогнозов. Я уверен, что такой алгоритм создать реально. Его нужно будет постоянно дорабатывать, по мере развития технологий, чтобы оставаться конкурентоспособным. Но и конкурировать придется с техногигантами.
  2. Изучить закономерности ценообразования, разработать теоретическую модель формирования цены и создать алгоритм, который будет учитывать максимум факторов, влияющих на ценообразование. На мой взгляд это направление еще сложнее, чем машинное обучение, но, как и в предыдущем случае, я считаю это реально. Такой алгоритм будет развиваться по мере совершенствования теоретической базы и знаний разработчика. Он тоже будет требовать постоянной модернизации.

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

Первый алгоритм будет сделан только для рынка FOREX и терминала MetaTrader 4, в процессе он эволюционирует в универсальный алгоритм, способный работать как на рынке FOREX, так и на биржевых рынках, написанный для MetaTrader 5.

Базовая закономерность

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

Для начала пойдем от обратного — почему на рынке сложно стабильно зарабатывать? Все дело в прямой конкуренции. Задача одних трейдеров заключить выгодную сделку с другими, но проблема в том, что каждая из сторон хочет заключить прибыльную сделку и кто-то обязательно получит убыток. Поэтому на рынке не должно быть стабильных простых закономерностей, которые может заметить каждый.

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

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

Для примера возьмем 100 000 часовых свечей GBPUSD за любой период и посчитаем, сколько из них будет растущих и сколько падающих. Я взял за период с 2020.10.27 в прошлое 100 000 свечей и получил, что растущих из них 50007, а падающих 48633, у остальных цена открытия равна цене закрытия. В итоге, у GBPUSD 50.7% растущих свечей и 49.3% падающих свечей, остальные свечи имеют цену Open = Close. Это примерно поровну, и если будет выборка больше, то результат будет стремиться к 50%.

В рамках статьи я не буду измерять каждый инструмент. Я провел измерения на сотне инструментов, и везде результаты были аналогичны. Но для убедительности возьмем инструмент с совершенно другого рынка GAZP (Газпром) на таймфрейме M15 измерим число падающих и растущих свечей на 99914 свечах. Результат 48237 растущих и 48831 падающих, остальные нейтральные. Как видим, падающих и растущих свечей примерно поровну.

Данная закономерность хороша не только тем, что присутствует на большом числе инструментов, но и сохраняется на любом таймфрейме. Чтобы убедиться в этом, проанализируем GBPUSD на таймфрейме M1, и для примера возьмем устойчиво растущую акцию AAPL на таймфрейме M15. Все данные я объединил в таблицу.

Инструмент Таймфрейм Общее число свечей Процент растущих свечей Процент падающих свечей
GBPUSD M1 100 000 50.25% 49.74%
GBPUSD H1 100 125 50.69% 49,30%
GAZP M15 99 914 49.69% 50.30%
 AAPL  M15  57 645 50.60% 49.40%

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

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

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

distribution

Рисунок 1.

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

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

Разработка тестового алгоритма

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

Общий упрощенный алгоритм работы

  • сканируется окно из N свечей; 
  • проверяется каких свечей больше, падающих или растущих;
  • если перевес больше порогового, то сигнал на начало серии позиций; 
  • больше падающих свечей = сигнал Buy, больше растущих = Sell;
  • расcчитывается лот;
  • открывается новая позиция на каждой следующей свече, пока не сработает условие на закрытие серии; 
  • срабатывает условие закрытия серии;
  • закрываются все позиции;
  • поиск нового сигнала.

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

Сигнал на открытие позиции

  1. Окно для анализа. Задаем число свечей (окно для анализа), на котором нужно проверять текущий процент падающих и растущих свечей. Анализировать фиксированное число свечей не лучшая идея, потому что могут быть более длинные или короткие участки с отклонением от 50%. Нужно задать окно анализа диапазоном от минимального числа свечей до максимального с приоритетом большего числа свечей, потому что маленький участок может быть частью большого, а нужно захватить весь диапазон. Окно анализа будет задано параметром "MinBars" и "MaxBars". Алгоритм ищет перевес падающих или растущих свечей в диапазоне от "MinBars" до "MaxBars" и как только найдет, выбирает для работы максимально большое число свечей, на котором имеется перевес падающих или растущих свечей выше порогового.
  2. Пороговый процент перевеса для открытия позиции. Нужно определиться, какой процент перевеса падающих или растущих позиций считать пороговым для генерации сигнала. Этот параметр можно подобрать оптимизацией. В настройках создан параметр "OpenPerc". Этот параметр задается в процентах и является процентом для открытия. Если процент падающих свечей в выборке больше или равен проценту для открытия, то нужно открывать позиции Buy. Если процент растущих свечей в выборке больше или равен проценту для открытия, то нужно открывать позицию Sell. 
  3. Перебор диапазона. Анализировать свечи из диапазона нужно с каким-то шагом. Нечетный шаг не подойдет, потому что на нечетном числе свечей автоматически появляется отклонение от 50%, которое может давать ложные сигналы на вход, поэтому шаг для проверки диапазона выведен в настройки, параметр Step. Перебор диапазона будет идти от меньшего к большему.

Максимальное число позиций в серии

Во время торговли позиция набирается серией ордеров, поэтому нужно ограничить максимальное число позиций. Для этого нужно рассчитать, на каком числе свечей может выровняться перевес до 50%. Берется выборка, которая послужила сигналом на начало серии (состоящую из "N" свечей), считается число преобладающих свечей, из него вычитается оставшееся число свечей и прибавляется к числу свечей в изначальной выборке, затем умножается на корректирующий коэффициент "К". Коэффициент "К" косвенно привязан к статистической характеристике инструмента.

Так получено ожидаемое число свечей, на котором отклонение от 50% должно исчезнуть.

R=(N+NB-NM)*K
N - число свечей в выборке, на которой найден перевес выше порогового
NB - число преобладающих свечей
NM - оставшееся число свечей
K - корректирующий коэффициент из настроек

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

E=R-N
Е - максимальное число позиций в серии
R - общее число свечей, на котором планируется возврат к 50%

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

Выбор лота

Алгоритм создан для проверки закономерности, поэтому нужно добавить несколько настроек для определения лота. Пусть размер лота зависит от предполагаемого числа позиций в серии. Чем больше позиций в серии, тем меньше лот. Для этого нужно добавить 2 настройки: "Depo" и "RiskPerc". Для простоты примем, что 1000$ = лоту (500$=0.5 лота). Берется значение из настройки "Depo" и умножается на "RiskPerc", затем полученное значение делится на максимальное число позиций "E", округляется до ближайшего правильного значения. Так получается размер лота одной позиции.

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

Закрытие позиций

Закрытие будет происходить в нескольких случаях:

1) Суммарная прибыль по открытым позициям достигнет установленного значения в настройке "CloseProfit". Так как число позиций, которое открывает робот, не постоянное и размер лота может меняться, то задавать фиксированное значение прибыли в долларах будет не верно. Нужно, чтобы прибыль в долларах зависела от текущего количества открытых позиций и от суммарного лота в рынке. Для этого нужно ввести понятие "прибыль на лот".

В настройке "CloseProfit" указывается значение прибыли для суммарной позиции 1 лот и робот пересчитывает значение прибыли для того количества лотов, которое он открыл. Если открыто 10 позиций по 0.01 лоту, то суммарный лот 0.1. Тогда, чтобы получить значение прибыли для закрытия позиции, нужно Profit = "CloseProfit" * 0.1. Корректировать прибыль для закрытия позиций нужно каждый раз, когда меняется число позиций. В результате, когда суммарная прибыль станет больше или равна рассчитанному значению Profit, робот закроет позиции.

2) Когда текущий процент перевеса станет меньше или равен значению "ClosePerc". В настройке "ClosePerc" задается процент перевеса преобладающих свечей для генерации сигнала на закрытие серии позиций. Когда открылась первая позиция, перевес был найден на числе свечей N. Теперь с появлением каждой новой свечи число свечей увеличивается и становится N+1; N+2; N+3 и т.д... С появлением каждой новой свечи нужно проверять текущий процент перевеса преобладающих блоков на выборке с числом свечей, увеличивающихся на 1. Завершить серию после выполнения условия.

3) По достижению значения "MinEquity". Если текущие средства упали ниже установленного значения, нужно завершить открытые серии и не открывать новые, пока средства не увеличатся. Это функция Stop loss, защищающая депозит от потерь.

Тестирование

Данный алгоритм примитивный, не умеет адаптироваться к изменяющимся рыночным условиям и нужен для проверки работоспособности идеи, поэтому настройки подберу при помощи оптимизации. Оптимизацию буду делать с перебором всех вариантов, без генетического алгоритма. Робот разрабатывался еще в 2014 году и сделан для MetaTrader 4 . Сначала протестирую на GBPUSD таймфрейме H1. Установлю завышенный спред = 40, чтобы оптимизация проходила в неидеальных условиях, и в дальнейшем был некоторый запас устойчивости. Увеличенный спред нужен по тому, что робот контролирует текущую прибыль по открытым позициям и на нее влияет спред.

Оптимизировать буду всего 3 условия: минимальное число свечей "MinBars", процент для открытия позиций "OpenPerc" и прибыль на лот "CloseProfit". Предположительно, чем больше минимальное число свечей для анализа и чем выше процент открытия, тем надежнее, но реже будут сигналы. "CloseProfit" косвенно зависит от волатильности, поэтому перед оптимизацией нужно посмотреть какая волатильность по инструменту и задать адекватный диапазон. Оптимизацию буду проводить за год с 2019.11.25 по 2020.11.25 на таймфрейме H1.

optimization GBPUSD

Рисунок 2. Результаты оптимизации

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

После дальнейшего анализа результатов оптимизации видно, что при увеличении значения "MinBars" и "OpenPercent" доходность падает, но вместе с ней падает и величина просадки. Далее я взял выделенные параметры, протестировал год, получил результаты и оценил, что меняется, если увеличить/уменьшить значения "MinBars" и "OpenPercent". Получил вывод, что по мере увеличения "MinBars" и "OpenPercent" число сделок падает, надежность сигнала повышается. Значит, нужно найти баланс между доходностью и просадкой.

Для торговли я взял заведомо более консервативные параметры, чтобы был запас прочности для изменения рыночной ситуации. Как робот открывает позиции показано на рисунке 3 ниже.

trade

Рисунок 3. Пример открытия позиций

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

Алгоритм может стабильно работать и со значением "MinBars" = 70, но я беру 80, чтобы был запас для флуктуации характеристик торгового инструмента. Аналогичная логика при выборе параметра "CloseProfit". В примере он равен 150, с любым меньшим значением алгоритм становится стабильнее, но падает доходность. При увеличении до 168 стабильность пропадает, поэтому оставлю значение 150. В итоге за год был получен график доходности, как на рисунке 4. Значение "CloseProfit" не что иное, как усредненная волатильность, переведенная в доллары.

GBPUSD 2019 Chart

GBPUSD 2019 report

Рисунок 4. GBPUSD H1, 2019.11.25 - 2020.11.25

Размер депозита в 10 000$ был установлен для оптимизации. Далее, когда исследования будут проведены, сумму можно будет сделать оптимальной. Тест и оптимизация проводились в режиме контрольных точек, потому что алгоритм работает по ценам закрытия и ему не принципиально, что происходит внутри свечи. Но на рисунке 5 будет показан тест за тот же период в режиме "все тики".

GBPUSD tick 2019 Chart

GBPUSD tick 2019 report

Рисунок 5. GBPUSD H1, 2019.11.25 - 2020.11.25 режим "все тики"

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

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

GBPUSD 2001 Chart

GBPUSD report 2001

Рисунок 6. GBPUSD H1, 2001.01.01 - 2020.11.25

На рисунке 6 показан бектест с 2001 года с теми же параметрами, что были получены при оптимизации за год с 2019.11.25 по 2020.11.25. Из теста видно, что на таком большом промежутке всего на пару долларов выросла просадка, прибыль увеличилась значительно, а профит фактор поднялся до 7.5. Тест проведен уже для депозита 3000$ и без рефинансирования, чтобы понимать, как ведет себя закономерность на длинных промежутках времени. 

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

Делать выводы на основании теста одной валютной пары и одного таймфрейма будет неправильно. Поэтому рассмотрим тесты по другой валютной паре EURUSD. Как и в предыдущем случае, оптимизация была проведена за год с 2019.11.25 по 2020.11.25, на таймфрейме H1. К выбору параметров я подошел так  же, как и в предыдущем случае. На рисунке 7 показаны результаты.

EURUSD 2019 Chart

EURUSD 2019 report

Рисунок 7. EURUSD H1, 2019.11.25 - 2020.11.25

Как видно на рисунке 7, доходность по EURUSD ниже, чем по GBPUSD, а просадка немного больше. На графике доходности видно, что был участок, на котором было открыто много позиций. Немного ужесточив параметры "MinBars" и "OpenPercent", можно снизить количество позиций и, соответственно, просадку. Перейдем к тесту на длительном периоде. На рисунке 8 показан тест EURUSD с 2007.01.01 по 2020.11.25.

EURUSD 2007 chart

EURUSD 2007 report

Рисунок 8. EURUSD H1, 2007.01.01 - 2020.11.25

Работа на EURUSD не такая стабильная, как на GBPUSD, и период стабильной работы в прошлом оказался на 6 лет меньше. Результат все еще хороший. Оптимизации параметров проведена за год, а стабильная работа продолжалась почти 14 лет. Этот факт опять говорит о том, что параметры не просто были подогнаны под историю, и на торговом инструменте присутствует достаточно стабильная закономерность.

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

Проведу тест на таймфрейме M15 GBPUSD. Оптимизацию буду проводить, как и в предыдущем случае, за год 2019.11.25 по 2020.11.25. Но выводить график оптимизации за год уже не буду, сразу выведу максимально большой промежуток, который алгоритм может пройти без проблем.

GBPUSD m15 chart

Рисунок 9. GBPUSD m15 2000.01.01-2020.11.25

На рисунке 9 показан тест GBPUSD на таймфрейме M15, тест пройден с 2000 года, но число сигналов на вход и ,соответственно, позиций небольшое. Как я и писал выше, на младшем таймфрейме стабильность ниже и настройки получились очень консервативные. Сигнал на вход генерируется редко, доходность не высокая, но адекватна просадке.

Далее проведу тест на высшем таймфрейме GBPUSD H4. На таймфрейме H4 уже мало свечей для оптимизации, поэтому проведу оптимизацию на участке 2 года с 2018.11.25 по 2020.11.25. Результат покажу сразу на максимальном промежутке.

GBPUSD H4

GBPUSD H4 Report

Рисунок 10.  GBPUSD H4 2000.01.01-2020.11.25

На таймфрейме H4 стабильный результат был показан на промежутке почти 20 лет, с 2000.01.01 по 2020.11.25. Как и в предыдущих случаях, вся оптимизация заключалась в подборе баланса между прибылью и стабильностью. Консервативные настройки от таймфрейма M15 работают очень стабильно и на таймфрейме H1, и на H4, но там они не имеют смысла из-за очень редких сигналов и малого числа сделок.

Можно провести тест и по любым другим торговым инструментам. По некоторым алгоритм показывает себя лучше, по другим хуже. Но тенденция сохраняется — оптимизация за год позволяет стабильно работать на протяжении нескольких лет. Дальше покажу результаты по GBPJPY, таймфрейм H1. Оптимизация проводилась за год, результат показан на рисунке 11.

GBPJPY chart

GBPGPY report

Рисунок 11. GBPJPY 2009.01.01 - 2020.11.25

По GBPJPY, удалось пройти стабильный бектест с 2009 года. Результат не такой красивый, как по GBPUSD, но главное — работает. 

Я добавил в робота возможность реинвестирования заработанных средств, и нужно ее использовать. До этого я показывал тесты с консервативными настройками, но что, если сделать очень агрессивные настройки и включить увеличение лота? Я не любитель высоких рисков, но посмотрим на что способен алгоритм. Тест проведу на GBPUSD с 2006.01.01 по 2020.11.25 в режиме "все тики". Можно было и другой инструмент настроить. Спред уменьшу до значения = 20, это чуть выше среднего. И на рисунке 12 показан результат бектеста за почти 15 лет.


GBPUSD max risk

Рисунок 12. GBPUSD с 2006.01.01 по 2020.11.25 агрессивные настройки

Напомню, что алгоритм работает по ценам закрытия, поэтому такой результат — это не "тестерный грааль", вдобавок установлен адекватный спред = 20. Результат работы на реале, как правило, совпадает с результатом на тестере у этого алгоритма. Но сам я никогда не использовал его для торговли с такими агрессивными настройками и в MetaTrader 4 нельзя учесть реальные спреды, поэтому не буду утверждать, что на реале он бы также хорошо прошел этот период.

Анализ результатов

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

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

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

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

Использование для торговли

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

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

Чтобы повысить доходность, нужно анализировать несколько инструментов одновременно, при появлении сигнала по одному из инструментов открывать по нему позиции. Если открыты позиции по одному инструменту, то сигналы на начало серии от других инструментов нужно игнорировать. Так удастся максимально эффективно использовать время, увеличить число сигналов, а, соответственно, поднять пропорционально прибыль. Максимальная просадка останется на уровне одного инструмента.

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

Для работы на реальных счетах было сделано несколько модификаций:

1) Добавлено еще 9 независимых торговых инструментов, каждый со своими параметрами. Так он сможет анализировать и торговать сразу 10 торговых инструментов. Оптимизировать в той или иной степени можно параметры почти под любой инструмент, поэтому это решение стало логичным.

2) Ограничено одновременное открытие позиций по нескольким торговым инструментам. Для этого добавлен параметр "MaxSeries". Если установить значение 1, то торговля будет идти только по 1 инструменту, если 2, то позиции могут открываться одновременно по двум инструментам и так далее. Так удастся сделать, чтобы робот чаще генерировал сигналы на открытие позиций, используя свое "свободное время". Пропорционально увеличивается прибыль, а максимальная просадка останется на уровне одного инструмента.

Тестер MetaTrader 4 не умеет проводить мультивалютные тесты, но если будет одновременно торговаться более одного инструмента, то вероятно просадка увеличится пропорционально корню квадратному из числа одновременно торгуемых инструментов, при условии, что отсутствует корреляция между сигналами разных инструментов. Если мы рассчитываем на просадку 1000$, то торгуя одновременно тремя инструментами, можно рассчитывать на увеличение просадки до уровня 1000$*корень(3)=1732$.

3) Добавлено ограничение по минимальному числу средств "MinEquity". По достижению этого значения торговля останавливается, позиции закрываются. Это нужно, чтобы заранее запланировать риски и придерживаться их.

4) Одновременно робота можно использовать на нескольких таймфреймах, чтобы увеличить доходность. По моим тестам сигналы на открытие позиций как правило имеют корреляцию между разными таймфреймами, но далеко не 100%.

Я использовал этого робота для торговли одновременно на 25 валютных парах и двух таймфреймах H1 и H4 с консервативными настройками, и удавалось поддерживать доходность на уровне 10% в месяц. На другом счете, с чуть более агрессивными настройками, удавалось достигать доходности 15% в месяц. Сделок было очень много.

Выводы и дальнейшее развитие

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

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

К статье прикрепил код робота и техническое задание на него.

Автор идеи и ТЗ Maxim Romanov, код писал Vyacheslav Ivanov.

Прикрепленные файлы |
50p_V1.mq4 (101.27 KB)
Technical_task.zip (22.77 KB)
AAPL_GAZP_statistics.zip (12989.18 KB)
GBPUSD_statistics.zip (14471.42 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (36)
Maxim Romanov
Maxim Romanov | 7 дек 2020 в 18:33
Valeriy Yastremskiy:

форекс (страны) и акции (фирмы) имеют разную природу. У них разные законы развития.

конечно разную. Или нет? Разную, но не совсем. Для того, чтобы создать полностью самоадаптирующийся алгоритм (моя цель), нужно понимать, чем отличается поведение акций от форекса. 

Я разработал несколько причин отличия:

1 - эмиссия, а соответственно инфляция на валюте и отсутствие эмиссии и инфляции на акциях.

2 - выплаты дивидендов по акциям отличает их на первый взгляд от валют.

3 - значительно разная суммарная стоимость валюты и акции

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

5 - привлекательность акции может расти и падать, валютой пользуются как средством расчета, поэтому ее привлекательность меняется в меньших пределах.

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

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

Но все эти данные можно и нужно учитывать, при составлении адекватной модели.

Valeriy Yastremskiy
Valeriy Yastremskiy | 7 дек 2020 в 19:03
Maxim Romanov:

конечно разную. Или нет? Разную, но не совсем. Для того, чтобы создать полностью самоадаптирующийся алгоритм (моя цель), нужно понимать, чем отличается поведение акций от форекса. 

Я разработал несколько причин отличия:

1 - эмиссия, а соответственно инфляция на валюте и отсутствие эмиссии и инфляции на акциях.

2 - выплаты дивидендов по акциям отличает их на первый взгляд от валют.

3 - значительно разная суммарная стоимость валюты и акции

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

5 - привлекательность акции может расти и падать, валютой пользуются как средством расчета, поэтому ее привлекательность меняется в меньших пределах.

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

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

Но все эти данные можно и нужно учитывать, при составлении адекватной модели.

Не соглашусь с такой простотой.

Эмиссия валюты ЦБ страны и допэмиссия акций и размещение на ИПО имеют сходную природу.

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

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

Объемы конечно же разные, государственную экономику образуют экономические единицы - фирмы.

Выплаты по акциям дивидендов это опосредованная оценка работы фирмы, в государстве же опосредованно это ВВП и уровень социального обеспечения (обеспечивает стабильность) и уже потом товарооботы и курс валют.

В стоимости акций я сторонник определения Баффета, про истинную цену, рассчитываемую через 10нюю прибыль.

И конечно волатильность у них разная, вероятность банкротства страны меньше чем фирмы.

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

Крипта будет жить вечно, пока будет преступность.) 

Aleksandr Masterskikh
Aleksandr Masterskikh | 9 дек 2020 в 13:28

Автор замахнулся на нерешённую до сих пор проблему: создать адаптивную модель на основе анализа фундаментальных факторов.

Неблагодарное это занятие. Адаптация даже с учётом только технических факторов (ТА) толком не решена, а уж "фундамента" тем более.

Но для полемики подходящая тема - можно долго обсуждать.

Maxim Romanov
Maxim Romanov | 9 дек 2020 в 13:52
Aleksandr Masterskikh:

Автор замахнулся на нерешённую до сих пор проблему: создать адаптивную модель на основе анализа фундаментальных факторов.

Неблагодарное это занятие. Адаптация даже с учётом только технических факторов (ТА) толком не решена, а уж "фундамента" тем более.

Но для полемики подходящая тема - можно долго обсуждать.

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

Aleksey_Kryukov
Aleksey_Kryukov | 24 фев 2021 в 03:33

Общий упрощенный алгоритм работы

  • сканируется окно из N свечей; 
  • проверяется каких свечей больше, падающих или растущих;
  • если перевес больше порогового, то сигнал на начало серии позиций; 
  • больше падающих свечей = сигнал Buy, больше растущих = Sell;
  • расcчитывается лот;
  • открывается новая позиция на каждой следующей свече, пока не сработает условие на закрытие серии; 
  • срабатывает условие закрытия серии;
  • закрываются все позиции;
  • поиск нового сигнала.


Автор изобрел индикатор RSI. Браво!

Использование электронных таблиц для построения торговых стратегий Использование электронных таблиц для построения торговых стратегий

В статье описаны основные принципы и приёмы, позволяющие провести анализ любой стратегии с помощью электронных таблиц — Excel, Calc, Google. Также сделано сравнение полученных результатов с тестером MetaTrader 5.

Брутфорс-подход к поиску закономерностей (Часть II): Погружение Брутфорс-подход к поиску закономерностей (Часть II): Погружение

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

Нейросети — это просто (Часть 8): Механизмы внимания Нейросети — это просто (Часть 8): Механизмы внимания

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

Работа с таймсериями в библиотеке DoEasy (Часть 58): Таймсерии данных буферов индикаторов Работа с таймсериями в библиотеке DoEasy (Часть 58): Таймсерии данных буферов индикаторов

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