Научный подход к разработке торговых алгоритмов

Maxim Romanov | 6 августа, 2020

Введение

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

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

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

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

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

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

Поиск закономерностей ценообразования

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

В своей предыдущей статье "Что такое тренды и какова структура рынков — трендовая или флэтовая?", я разработал определение для понятия тренд и провел исследование, какую структуру имеют рынки  —   трендовую или флэтовую. Статью рекомендую к ознакомлению, чтобы был понятен дальнейший ход мысли.

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

amd distrib

Рисунок 1.

На рисунке 1 красным показано эталонное распределение плотности вероятности приращений для процесса из 40 шагов с вероятностью разворота каждого следующего шага, равной 50%, для этого использовалось 5000 выборок. Белой гистограммой показаны измеренные значения для 40 шагов акции компании AMD для тех же 5000 выборок. Было посчитано, сколько шагов по вертикали, какое число раз цена прошла за 40 шагов из 5000 измерений, и выведено это в форме гистограммы.

Другими словами, было взято 5000 отрезков по 40 шагов, измерено сколько каждый из отрезков прошел шагов по вертикали и выведено в виде гистограммы. Например, за 40 шагов для акции компании "AMD" по вертикали цена прошла 0 шагов 390 раз, для эталона должна пройти 626,85 раз.

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

vertical steps
Рисунок 2.

На рисунке 2 показан пример, как считалось число шагов по вертикали. Берется выборка из 40 блоков (шагов) и считается, сколько блоков цена прошла по вертикали за эти 40 блоков. На рисунке за 40 шагов цена прошла 7 шагов по вертикали. Потом берется еще 4999 выборок по 40 шагов и измеряется сколько на них было пройдено по вертикали. Затем измеренные результаты выводятся в форме гистограммы, у которой по оси Х откладывается амплитуда, а по оси Y — число попаданий в эту амплитуду.

Анализ найденной закономерности

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

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

Далее следует анализ применяемого подхода. Возможно, мы нашли не закономерность, а ошибку в своем методе анализа структуры рынка, в таком случае рынки не трендовые, и заработать на этом не получится. Нужно начать с основ, а именно, как строятся блоки, на которых мы нашли тренды. Индикатор блоков вы можете взять в предыдущей статье "Что такое тренды и какова структура рынков — трендовая или флэтовая?". В данном случае ценовой ряд квантуется ("нарезается") блоками размером N пунктов. То есть каждый раз, когда цена проходит N пунктов от предыдущей точки отсчета, формируется блок размером N пунктов. Если блок размером 10 пунктов, то цена проходит 10 пунктов и формируется блок, у которого есть цены открытия и закрытия. Далее ждем, пока цена пройдет еще 10 пунктов в одну из сторон и закрываем еще блок и так далее. На первый взгляд проблем нет, но для построения блоков используются цены закрытия минутных свечей, и это важно в дальнейшем.

delta

Рисунок 3.

При дальнейшем анализе выявляются 2 проблемы:

  1. Дельта между закрытием свечи и блока. На рисунке 3 показана ситуация, когда цена закрытия падающего блока оказывается выше цены закрытия падающей свечи. Образующаяся дельта между ценой закрытия блока и ценой закрытия свечи может свести на нет всю прибыль, которую мы планировали получить от того, что рынок трендовый. Причина в том, что планировалось использовать простой алгоритм: открывать позиции Buy после каждого растущего блока и открывать позиции Sell после каждого падающего блока. Но так как блоки формируются по закрытию свечи, то мы получим сигнал на то, что блок сформирован только после того, как закроется свеча, а значит открыть/закрыть позицию сможем по цене хуже, чем нужно. Эта дельта может компенсировать всю прибыль, которую мы получим из-за того, что рынок трендовый, и матожидание прибыли останется равным нулю.
  2. Комиссии и спред. Возможно рынок трендовый ровно настолько, чтобы компенсировать спред и комиссии. В таком случае, если мы будем открывать/закрывать позиции по рынку, то потери из-за открытия по худшей цене и комиссии перекроют всю прибыль, которую мы получим, используя данную закономерность. Да, на биржевых рынках мы можем использовать лимитные ордера, тогда спред платить не придется, но комиссии остаются. На FOREX лимитные ордера не помогут бороться с данной проблемой из-за особенностей исполнения.

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

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

Разработка гипотезы, объясняющей наличие данной закономерности

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

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

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

Предположим, что не только исследованные рынки трендовые, но и все остальные, затем ответим на вопрос: "Почему все рынки трендовые?"

Начнем с простого: откуда берется прибыль при торговле на рынке? Так как на рынке участники торгуют против друг друга (справедливо даже если вы торгуете в ДЦ на FOREX), то для того, чтобы заработать, нужно, чтобы кто-то потерял равную сумму, плюс комиссия брокера. Активы покупаются и продаются участниками торгов друг другу и каждый стремится извлечь свою выгоду. Значит, покупатель и продавец, заключая сделку, оба пытаются извлечь максимальную выгоду из данной сделки. То есть в один и тот же момент времени покупатель считает, что выгодно купить, а продавец, что выгодно продать. Один из них явно ошибается, или нет? В итоге оба могут получить прибыль, когда покупатель продаст свой актив третьему лицу, но рано или поздно найдется контрагент, который потеряет деньги на этой сделке. В итоге вся торговля строится на том, что один из контрагентов ошибается при определении своей выгоды.

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

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

sinus
Рисунок 4.

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

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

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

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

Важно, что рынок будет стремиться к максимальной энтропии, но достигнет этого состояния только тогда, когда станет бесконечное число участников (очень высокая ликвидность) или они будут бесконечно "умны". Под термином "умный" я понимаю способность выявлять сложные закономерности. Чем более сложные и не очевидные закономерности способен выявить участник, тем он "умнее". Бесконечно "умный" участник способен выявлять и эксплуатировать абсолютно все закономерности. Условие (или бесконечно много участников, или они бесконечно умны) стоит потому, что бесконечное число участников будут обладать бесконечной вычислительной способностью, даже будучи не очень "умными" смогут выявить все закономерности методом перебора

Данная гипотеза объясняет, почему графики цен на финансовые инструменты становятся сложнее. Если в начале 20-го века можно было получить прибыль, торгуя от среднего, то с развитием алготрейдинга участники становятся "умнее", закономерности становятся сложнее, энтропия растет, на рынке становится сложнее зарабатывать. Что значит: участники становятся "умнее"? У них растет вычислительная мощность, скорость принятия решений, способность быстрее и точнее определять свою выгоду и способность находить все более сложные закономерности, пусть даже методом перебора.

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

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

Проверка гипотезы

Тут нужно уточнить, что в разделе "Разработка гипотезы, объясняющей наличие данной закономерности", выдвинута лишь гипотеза, пытающаяся объяснить наличие закономерности. Данная гипотеза не претендует на то, чтобы быть 100% верной и может содержать в себе неточности, потому что является лишь шагом в разработке алгоритма. Это пример того, как можно строить логическое рассуждение, пытаясь объяснить найденную закономерность. Данный подход нужен для того, чтобы максимально избежать суеверий, связанных с рынком. Например, если бы у нас была закономерность типа: "RSI (Stochastic, MACD, волны Эллиота, подставьте свой вариант) зашел в зону перекупленности, сформировал паттерн и нужно продавать", то важно тоже спросить себя: "А почему это должно работать?" и "Какие фундаментальные причины приводят к тому, что это работает?".

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

В конце статьи "Что такое тренды и какова структура рынков — трендовая или флэтовая?", сравнивались по степени трендовости несколько торговых инструментов, такие как EURUSD, AMD, AAPL и другие. Сделаем аналогичное сравнение в данной статье, и для примера возьмем 4 инструмента:

EURUSD

Рисунок 5а.

AAPL

Рисунок 5б.

SBER

Рисунок 5в.

AMEZ

Рисунок 5г.

Как видно из рисунков 5, EURUSD обладает низкой трендовостью 1.068, акция "Appl" высокой трендовостью 1.3, "Сбербанк" имеет трендовость 1.168  — ниже, чем у "Appl", но выше, чем у EURUSD. Акции AMEZ имеют флэтовую структуру, то есть степень тренда у них ниже 1.

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

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

Имея закономерность, разрабатываем под нее торговый алгоритм. Закономерность простая, поэтому и торговый алгоритм будет не сложный. Торговля будет вестись на блоках, то есть предварительно нужно преобразовать свечные графики m1 в блоки размером N пунктов. Алгоритм построения блоков будет интегрирован в робота. Торговый алгоритм будет следовать напрямую из формулы для определения матожидания прибыли:

m=(P(tp)*tp)-(P(sl)*sl)

где:

и будет работать по:

  1. Открываем позицию после того, как закрылся очередной блок падающий или растущий;
    • если закрылся падающий блок, то открываем позицию Sell;
    • если закрылся растущий блок, то открываем позицию Buy;
    • после того, как позиция открыта, ждем сигнал на закрытие.
  2. Закрываем позицию, после того, как был сформирован блок противоположного направления от того, который послужил сигналом на открытие. Если открыта позиция Buy, то ждем формирования падающего блока и закрываем позицию. После того, как на падающем блоке закрылась позиция, можно открыть позицию Sell. Так у нас в рынке всегда одна позиция.
  3. На рисунке 3 показан случай, когда свеча и блок закрываются по разной цене и образуется дельта. Это особенности алгоритма формирования блоков, поэтому нужно предусмотреть контроль цены, чтобы мы не открылись по цене, невыгодной для нас. Добавим условие, что если дельта между ценами закрытия свечи и блока больше определенного значения, то не открываем позицию, ждем, пока цена вернется к цене закрытия блока, и только тогда открываем позицию.
  4. Добавим установку Take Profit и Stop Loss. Они нужны на случай, если размер свечи получается существенно больше размера блока, чтобы прибыльные/убыточные позиции закрывались не только по закрытию блока, но и на больших выбросах;
    • цену SL рассчитаем как: размер блока (BS) умножаем на коэффициент из настроек (ksl) и для позиций Sell к цене закрытия блока (Bclose(op)), на котором был сигнал на открытие позиции, прибавляем полученный результат Sl=Bclose(op)+BS*ksl. Для позиций Buy нужно вычесть из цены закрытия блока Sl=Bclose(op)-BS*ksl;
    • цену TP рассчитаем как: Размер блока (BS) умножаем на коэффициент из настроек (ktp) и для позиции Sell от цены закрытия последнего блока (Bclose(0) отнимаем полученный результат Tp=Bclose(0)-BS*ktp. Для позиций buy нужно прибавить к цене закрытия последнего блока Tp=Bclose(0)+BS*ktp. Тут в отличие от Stop Loss, нужно брать цену закрытия каждого нового блока и после закрытия каждого нового блока, пересчитывать Take Profit. Это нужно, чтобы можно забрать дополнительную прибыль, когда появляются свечи размером существенно больше размера блока.
  5. Функция управления лотом. Помимо стандартных функций управления лотом, добавим функцию, которая будет менять размер лота от текущего размера блока. Это нужно, чтобы при росте размера блока, уровень риска и прибыли оставались стабильными. Для этого введем понятие минимального размера блока (minimum BS), относительно которого будет корректироваться размер лота. Лот для открытия позиций  — это лот из настроек, деленный на отношение текущего размера блока к минимальному из настроек lot=lot(set)/(BS/minimum BS).
  6. Определение размера блока. Эта функция очень важна для стабильной работы алгоритма. Тут можно пойти несколькими путями:
    • фиксированный размер блока, заданный в настройках в формате цены, например 0.02;
    • автоматический размер блока, который будет привязан к размеру свечей того тайм фрейма, на котором работаем. Размер свечей можно получить из индикатора ATR, и дальше для получения размера блока умножать текущее значение ATR на коэффициент. Например, мы хотим торговать на блоках размером 5*ATR. Так при повышении волатильности, будет расти размер блока и система будет адаптироваться к изменяющимся параметрам рынка. ATR можно брать на том тайм фрейме, на котором торгуем или с большего тайм фрейма, если хочется экспериментов.
  7. Разрешение открывать Buy/Sell позиции. Встроим функцию, разрешающую открывать отдельно позиции Buy и Sell. Это будет нужно, чтобы анализировать, как работают сигналы на покупку и продажу.

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

Проверка торгового алгоритма

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

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

EURUSD Trade

Рисунок 6а.

EURUSD Trade2

Рисунок 6б.

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

EURUSD tester Chart

EURUSD tester report

Рисунок 7.

По EURUSD, как и ожидалось, спред и дельта при построении блоков компенсировали всю прибыль, которую мы должны были получить из-за трендовости инструмента. В итоге, имеем матожидание прибыли -1,67$ на сделку. Лот менялся динамически от размера блока, при этом средний лот составил 0,078. Разберемся, откуда взялся убыток. Робот пишет в логи спред. При открытии и закрытии позиций, средний спред составил 0,00008. Было заплачено 159,76$ свопов, всего было открыто 614 позиций. Следовательно, средний своп на позицию составил 159,76/614=0,2602$.

Если средний спред 0,00008 и средний лот 0,078, 1 пункт по EURUSD при лоте 0,078 стоит 0,078$, следовательно, спред стоит 0,078*8=0,624$. Итого, общие комиссии складываются 0.624$+0.2602$=1.104$. Получилось, что если бы мы теряли на каждой сделки комиссию, то матожидание было бы -1,104$, а оно 1,67$ ,что на 0,566$ больше. Минимальный размер блока ограничен размером в настройках 0.002, для среднего лота 0,078 - это 15,6$. Грубо оценим, насколько в среднем мог уйти баланс в минус, если бы график баланса был случайным блужданием и размер блока был всегда минимальным. Для этого 15,6*(614^0.5)=386.55$. Теперь прибавим среднюю комиссию на сделку, умноженную на число сделок. 1,104*614+386.55=1064,406$.

Так мы получили величину 1064,406$ в долларах, на которую в среднем должен уходить график баланса в минус, если вероятность открытия позиции в "верном" направлении 50% и за каждую открытую позицию мы платим комиссию. Реально мы получили убыток 1027.45$, что примерно совпадает. Можно сделать вывод, что мы получили убыток, потому что матожидание нашего алгоритма на EURUSD равно нулю. 

Посмотрим, какие результаты получились на более трендовых акциях "Appl" (AAPL), результат на рисунке 8 ниже.

AAPL tester chart

AAPL tester report

Рисунок 8.

По акциям AAPL получается устойчивый плюс с матожиданием 19.33. Это был тест с динамическим лотом, зависящим от размера блока, а размер блока динамически менялся от волатильности. Посмотрим, что будет, если не менять лот динамически. Средний размер лота на рисунке 8 составил 39. Зафиксируем размер лота на значении 39 и посмотрим результат на рисунке 9.

AAPL tester chart fix lot

AAPL tester report fix lot

Рисунок 9.

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

Далее посмотрим, что будет, если разрешить только Sell позиции. Результаты показаны на рисунке 10.

AAPL tester chart only sell

AAPL tester report only sell

Рисунок 10.

В режиме только Sell получили небольшой убыток, но на рисунке 5б видно несимметричность распределения относительно нуля, поэтому данный результат можно было ожидать. Далее рассмотрим ситуацию для режима только Buy, результаты на рисунке 11.

AAPL tester chart only buy

AAPL tester report only buy

Рисунок 11.

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

Проверим, как алгоритм работает на акциях других активно развивающихся компаний. Для начала возьмем акции "AMD". Тут тест будет проведен с  2018.06.01 по 2020.07.28, потому что у моего брокера минутная история начинается с этой даты. Тестировать будем в режиме динамического лота и с разрешенными Buy/Sell позициями. Посмотрим результаты на рисунке 12.

AMD tester chart

AMD tester report

Рисунок 12.

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

TSLA tester chart

TSLA tester report

Рисунок 13.

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

Для сравнения проведем тест на акциях одного из лидеров российского рынка, "Сбербанка". Тестировать будем на том же периоде, что и в предыдущих случаях. Комиссии в тестере установлены такие, которые предоставляет брокер "Открытие", это 0,057% за объем. Тестирование проводилось без кредитного плеча по реальным тикам. Результат тестирования показан на рисунке 14.

SBER tester chart

SBER tester report

Рисунок 14.

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

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

Заключение

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

Автор идеи и разработки Maxim Romanov, код советника писал Sergey Chalyshev по разработанному ранее техническому заданию.