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

6 августа 2020, 10:37
Maxim Romanov
68
3 536

Введение

Торговля на рынках без торговой системы с вероятностью, стремящейся к 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-го века можно было получить прибыль, торгуя от среднего, то с развитием алготрейдинга участники становятся "умнее", закономерности становятся сложнее, энтропия растет, на рынке становится сложнее зарабатывать. Что значит: участники становятся "умнее"? У них растет вычислительная мощность, скорость принятия решений, способность быстрее и точнее определять свою выгоду и способность находить все более сложные закономерности, пусть даже методом перебора.

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

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

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

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

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

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

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

  • Валютную пару EURUSD как инструмент с наибольшим количеством участников, низкой инвестиционной привлекательностью и высокой ликвидностью. Нужно уточнить, что у валют низкая инвестиционная привлекательность, потому что существует инфляция, деньги всегда обесцениваются и инвестировать в валюту невыгодно в долгосрочной перспективе.
  • Акции компании "Appl" (AAPL) как наиболее инвестиционно привлекательный и развивающийся инструмент, на котором торгует большое число у частников. Акция обладает высокой ликвидностью, но значительно меньшей, чем EURUSD.
  • Акции "Сбербанка" (SBER) имеют ликвидность значительно ниже вышеперечисленных, инвестиционную привлекательность в мировых масштабах значительно ниже, чем у "Appl", и число участников соответственно ниже.
  • Акции "Ашинский МЗ" (AMEZ). Имеют низкую инвестиционную привлекательность даже по меркам Российского рынка и низкую ликвидность.

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)

где:

  • m  матожидание прибыли,
  • P(tp)  вероятность прибыльной сделки, 
  • P(sl)  вероятность убыточной сделки,
  • tp  средний размер прибыльной сделки,
  • 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.

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

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

Заключение

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

  • Найденная закономерность позволила сделать алгоритм, который способен приносить прибыль без необходимости оптимизации параметров под каждый торговый инструмент. Настройки меняются вручную, но мы заранее знаем, почему устанавливаем тот или иной параметр в настройках.
  • Зная механизм изменения параметров, можно сделать полностью автоматический алгоритм, в котором не нужно будет менять настройки под каждый инструмент отдельно.
  • Мы четко понимаем, какую закономерность эксплуатируем для получения прибыли, а значит, в дальнейшем можем научиться прогнозировать ее усиление или ослабление.
  • Наличие закономерности на том или ином инструменте можно предсказать, имея гипотезу ее возникновения.
  • Нужно развивать гипотезу возникновения трендовости на рынках, чтобы превратить ее в полноценную теорию, описывающую закономерности ценообразования. Достаточно хорошо развив теорию, мы сможем повысить стабильность и надежность и универсальность алгоритма.
  • С развитием конкретного торгового инструмента закономерность будет становиться менее выраженной, потребуется переходить на новые активно развивающиеся инструменты.
  • Метод торговли способен приносить прибыль, но требует доработки. Нужно свести к минимуму дельту между ценой закрытия блока и ценой открытия позиции, возникающую из-за особенностей алгоритма формирования блоков. Один из вариантов, как это сделать  — переход к анализу тиковых графиков, вместо минутных.
  • Зная средний уровень трендовости инструмента, можно собрать статистику по изменению степени трендовости с течением времени и аппроксимировать ее при помощи нелинейных уравнений. В дальнейшем, зная закон изменения трендовости по инструменту во времени, можно разработать механизм контроля отклонения от средней трендовости для того, чтобы повысить прибыльность системы.
  • Данный алгоритм в текущем виде очень простой и был нужен для проверки идеи, но идея показала свою жизнеспособность и потенциал, поэтому его можно существенно доработать для работы на реальных рынках.
  • На фондовом рынке заработать проще, чем на FOREX, и одной из причин является то, что инструменты фондового рынка более трендовые. Но есть и флетовые инструменты, такие, как приведенный пример AMEZ. Для торговли на таких инструментах алгоритм можно переделать, чтобы он работал не на продолжение тенденции, а на разворот. Но это тема отдельного исследования, потому что на активах с низкой инвестиционной привлекательностью возможны проблемы с ликвидностью.
  • Алгоритм совершает сделки по рынку, для повышения доходности можно модернизировать логику под лимитные ордера. Это усложнит логику, но, возможно, позволит повысить прибыльность, нужны дополнительные исследования и разработки.
  • Был показан практический метод применения понятия трендовости, описанный в моей предыдущей статье Что такое тренды и какова структура рынков — трендовая или флэтовая? и практическое применение перехода от свечных графиков к блоковым, описанное в статье 

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

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


Прикрепленные файлы |
report.zip (706.34 KB)
robot.zip (13.68 KB)
Set.zip (6.23 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (68)
Maxim Romanov
Maxim Romanov | 20 авг 2020 в 09:51
Mihail Marchukajtes:

Максим приветствую. Прочитал статью и у меня возник вопрос. Вы действительно считаете приведённые Вами графики балансов еквити по разным инструментам привлекательными?

По мне так это больше похоже на совпадение и когда баланс начнёт просаживаться у Вас не будет никаких гарантий что текущие убытки будут восстановлены. То есть что бы зарабатывать данным подходом нужно знать БУДУЩИЙ размер блока, а не текущий оптимальный. Просмотрел графики и к сожалению ни одна из эквити не смогла привлечь, я это говорю со стороны практики торговли. Слишком большие просадки, в момент которых не будешь знать отобьёт он их или нет.

1. Подумайте как подобрать оптимальный размер блока для ближайшего будущего. Чтоб он начал работать завтра, а не со позапрошлой недели. Ну и держите идею, которая витает у меня давно и я даже как то уже её освещал, но был закидан помидорами :-)

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

Задача данной оптимизации найти такой размер блока чтобы вид кривой баланса был примерно такой, тем самым мы находим точку начала роста, то есть когда размер блока вот вот начал приносить прибыль (работать) НО как это сделать в тестере я не знаю. Если получится сделать чти то подобное буду признателен на это посмотреть. У меня есть индикатор у которого всего два параметра и оба изменяются от 5 до 45 и если бы была возможность его оптимизировать именно к такому виду кривой баланса, да я бы Скайнет даже не использовал. Вот посмотри я на графике обозначил эти участки которые нужно искать, а главное какой потом рост идёт, без провалов и просадок в отличии от Вашей статье...

Так что если получится что то сворганить в оптимизации буду рад подключится к этому делу....

Это естественно не боевой алгоритм, я им хотел показать, как используя последовательный подход к разработке, можно совсем отказаться от оптимизации. 
Эти графики доходности без оптимизации сделаны, прибыль будет на инструментах, к которым идет активный приток средств. В текущем виде, алгоритм является альтернативой стратегиям покупки привлекательных активов.
По поводу оптимизации, тут я не помошник, по тому что я отказался от оптимизации. Работаю в направлении, в котором алгоритм должен сам торговать, полностью автоматически, на любом инструменте.
Выложенный алгоритм нужно существенно дорабатывать, но я занимаюсь другим проектом и этот алгоритм очень маленькая часть большого проекта, в чистом виде я его не использую.
Mihail Marchukajtes
Mihail Marchukajtes | 20 авг 2020 в 10:21
Maxim Romanov:
Это естественно не боевой алгоритм, я им хотел показать, как используя последовательный подход к разработке, можно совсем отказаться от оптимизации. 
Эти графики доходности без оптимизации сделаны, прибыль будет на инструментах, к которым идет активный приток средств. В текущем виде, алгоритм является альтернативой стратегиям покупки привлекательных активов.
По поводу оптимизации, тут я не помошник, по тому что я отказался от оптимизации. Работаю в направлении, в котором алгоритм должен сам торговать, полностью автоматически, на любом инструменте.
Выложенный алгоритм нужно существенно дорабатывать, но я занимаюсь другим проектом и этот алгоритм очень маленькая часть большого проекта, в чистом виде я его не использую.

Понятно. Печаль. И уже на протяжении многих лет никто так и не может оптимизировать параметры к приведённому виду кривой баланса :-(

Valeriy Yastremskiy
Valeriy Yastremskiy | 20 авг 2020 в 10:22
Mihail Marchukajtes:

Понятно. Печаль. И уже на протяжении многих лет никто так и не может оптимизировать параметры к приведённому виду кривой баланса :-(

столетий)

Aleksandr Masterskikh
Aleksandr Masterskikh | 21 авг 2020 в 21:09
Valeriy Yastremskiy:

тихонько пишу счас примерно такое. считаю разницу экстремумов с учетом знака на 132 барах разных ТФ и смотрю что по сумме и в среднем на единицу времени.  И по средней скорости и скоростям вверх вниз. Читабельная скорость в пункты в час получаются. Интересно, что скорости на младших ТФ в среднем выше чем на старших. Но при этом их порядок близок. Разницы в 10 раз нет. 

В теории импульсного равновесия это вопрос решён:

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

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

Valeriy Yastremskiy
Valeriy Yastremskiy | 21 авг 2020 в 21:31
Aleksandr Masterskikh:

В теории импульсного равновесия это вопрос решён:

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

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

Надо глянуть теорию) пока тупо алгоритм решений сперва. А потом их варианты. Если есть ссылка на теорию, дайте, чтоб не искать)
Работа с таймсериями в библиотеке DoEasy (Часть 48): Мультипериодные мультисимвольные индикаторы на одном буфере в подокне Работа с таймсериями в библиотеке DoEasy (Часть 48): Мультипериодные мультисимвольные индикаторы на одном буфере в подокне

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

Пользовательские символы: основы применения на практике Пользовательские символы: основы применения на практике

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

Непрерывная скользящая оптимизация (Часть 8): Доработка программы и исправление найденных недочетов Непрерывная скользящая оптимизация (Часть 8): Доработка программы и исправление найденных недочетов

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

Работа с таймсериями в библиотеке DoEasy (Часть 49): Мультипериодные мультисимвольные многобуферные стандартные индикаторы Работа с таймсериями в библиотеке DoEasy (Часть 49): Мультипериодные мультисимвольные многобуферные стандартные индикаторы

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