Меню

Создание простой стратегии автоматизированной торговли

Создание простой стратегии автоматизированной торговли

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

Он достаточно хорошо работает, но требует много ресурсов (денежных), а также серверов, электроэнергии и так далее.

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

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

Сегодня мы просто хотим показать вам одну из самых простых стратегий, которые мы когда-либо создавали (в коде всего 2 строки).

Это односторонняя стратегия, которая используется с фьючерсным контрактом E-Mini S&P500 Future (ES) (торгующимся на СМЕ) на дневных графиках и имеет примерно такую же производительность (без учёта размера позиции и комбинирования), как если бы вы просто купили и держали этот индекс в течение последних 20 лет, но без больших просадок, как, например, в 2008 году.

Как выглядит односторонняя стратегия для ES? Суть в том, что она предназначена только для длинных позиций.

Сначала мы хотели бы посмотреть, что будет, если покупать каждый раз, когда дневная свеча закрывается над BollingerBand (Length 20, StdDev 2) и разворачивать позицию всякий раз, когда дневная свеча закрывается ниже BollingerBand (Length20, StdDev -2). Это выглядит вот так …

If Close > BollingerBand(Close, 20, 2) Then Buy Next Bar At Market;

If Close < BollingerBand(Close, 20, -2) Then SellShort Next Bar At Market.

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

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

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

Например, предназначенная только для лонга стратегия ES, протестированная в течение 2008 года, либо даст нам 0 сделок из-за фильтров, либо покажет ужасную производительность.

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

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

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

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

Любопытно, что эта стратегия позволила бы заработать много денег во время кризиса в 2008 и 2000 годах, но в другие годы вы отдали бы всё это обратно.

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

Мы открываем длинную позицию, когда цена закрывается выше BB, и выходим из сделки, когда она закрывается в пределах BB – это должно позволить нам фиксировать большие движения вверх, при этом терпеливо пережидать медвежьи периоды. Вот параметры.

If Close > BollingerBand(Close, 20, 2) Then Buy Next Bar At Market;

If Close < BollingerBand(Close, 20, 2) Then Sell Next Bar At Market.

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

Однако, хотя S&P500 растёт довольно устойчиво, он не совершает больших и сильных движений вверх, так что наша пробойная стратегия не имеет большого смысла.

Что имело бы больший смысл для инструмента, который медленно, но неуклонно поднимается по волнам? Наверняка вы догадались: вход на откате и выход, когда тренд становится перенапряжённым!

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

If Close < BollingerBand(Close, 20, -2) Then Buy Next Bar At Market;

If Close > BollingerBand(Close, 20, 2) Then Sell Next Bar At Market.

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

Однако кризисы 2008 и 2000 годов уничтожили плоды всей нашей работы. Давайте посмотрим поближе.

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

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

Для начала давайте возьмём 200-дневную простую скользящую среднюю. Вот что получается.

If Close < BollingerBand(Close, 20, -2) And Close > Average(Close, 200) Then Buy Next Bar At Market;

If Close > BollingerBand(Close, 20, 2) Then Sell Next Bar At Market.

Ого! Невероятный винрейт, но сделок немного. 2008 год просто выпадает из отчёта о прибылях – ноль сделок. 2001 и 2002 годы принесли небольшие потери, ничего критичного.

Неплохо. Производительность приемлема, и нам не нужно беспокоиться о комиссиях, поскольку мы торгуем не очень много, и средняя прибыль от сделки довольно высокая (2400$), как и следовало ожидать на дневных графиках.

Сделки открываются не чаще 2-5 раз в год. Для портфеля из нескольких стратегий это приемлемо. Если это ваша единственная стратегия … удачи в ожидании.

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

Однако всё, что мы получили – это увеличение общего количества сделок при снижении чистой прибыли и средней прибыли за сделку.

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

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

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

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

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

Inputs:

ExitBars (0);

If Close < BollingerBand(Close, 20, -2) And Close > Average(Close, 200) Then Buy Next Bar At Market;

If BarsSincEentry = ExitBars Then Sell Next Bar At Market.

Нам не слишком нравятся опции визуализации TradeStation, в других платформах всё реализовано лучше в этом плане, но неважно.

Мы работаем с тем, что у нас есть.

Здесь есть два интересных момента: лучшая прибыль получается при времени удержания 150 дней, что коррелирует с нашей предыдущей стратегией на другом конце BB (среднее время удержания 147 дней), но эти результаты кажутся аномальными.

(В идеале нам хотелось бы видеть горы с плоскими вершинами на этом графике, чтобы обеспечить стабильность наших параметров.

Однако такое формирование наблюдается только в течение 20-30 дней в нижней части графика).

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

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

Мы будем придерживаться выхода на линии BB. Видите, что даже в царстве абсолютных чисел имеется потребность в усмотрении и личных предпочтениях.

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

Не будем пытаться оптимизировать скользящие средние, и даже если бы мы это сделали, то заменили бы только линию с шагом 50 (50, 100, 150, 200, 250, 300). Опыт говорит, что так делать не стоит.

Нас больше интересует длина BollingerBand и единицы стандартного отклонения (Standard Deviation).

Оптимизация этих параметров (5 шагов для длины BB и 0,5 для StdDev) приводит к тому, что длина BB сокращается до 10, а StdDev остаётся на уровне 2.

С такими настройками мы выжимаем из рынка ещё 20 000 долларов и получаем ещё более плавную кривую капитала. От этого трудно отказаться.

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

Давайте забудем об этом. Итак, вот наш итоговый код EasyLanguage.

Inputs:

BBLength(10);

BBDev(2);

MALength(200);

If Close < BollingerBand(Close, BBLength, -BBDev) And Close > Average(Close, MALength) Then Buy Next Bar At Market;

If Close > BollingerBand(Close, BBLength, BBDev) Then Sell Next Bar At Market.

При максимальной просадке в 10% с прибылью 120% (без изменения размера позиции) это довольно хорошая производительность.

При покупке и хранении индекса мы за тот же период получили бы 134%, однако без возможности комбинирования и с ужасающими просадками 2008 и 2001/2002 годов.

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

Кроме того, сделки по этой стратегии происходят только 2-5 раз в год.

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

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

Теперь, если хотите, вы можете провести форвардный анализ (Walk-Forward) этой стратегии или даже кластерный анализ, но в данном случае это просто не нужно.

Она работает так, как есть, и будет продолжать работать до тех пор, пока капитализм не уйдёт в прошлое.

В основном мы хотели показать вам, что стратегии не должны быть сложными. Некоторые из наших торговых стратегий имеют по 10-20 строк кода и достойно проходят все тесты надёжности.

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

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

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

Или, может быть, стоит попробовать акции Apple?

Если вы сможете разработать методы для выяснения

  1. что заставляет рынки колебаться (тренд, возврат к среднему значению);
  2. насколько эффективны ваши точки входа, а затем найдёте надёжные способы тестирования и организуете процесс, который позволяет сохранять креативность и продуктивность – расскажите, это может быть очень полезным. По крайней мере, для нас.

PS, кое-кто из нас одновременно учится играть на фортепиано и говорить по-японски, так что хватит оправдываться ;-).

Возможно вам также будет интересно прочитать статьи

Как трейдеру Forex торговать по NFP – руководство по торговле на Forex во время выхода отчётов NFP

Торгуем с уверенностью – 5 эффективных советов

Как находить сильные ценовые уровни: разворотные точки, линии тренда, предложение, поддержка и естественные вершины

Рекомендуемые брокеры:

Брокер Регуляция Открыть счет
CySEC ICF IFSC ЦРФИНОткрыть счет!
FCAОткрыть счет!
SVGFSAОткрыть счет!

Оставить комментарий