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

https://images.app.goo.gl/AsFTsQxqNGFkQZAX6

Ни для никого уже давно не секрет, что крупные банки и хедж-фонды с Wall-Sreet используют в своих спекуляциях количественные методы уже давно. Ведь из-за этого, точнее ошибок в расчетах и случился финансовый коллапс в США (отсылка к фильму Биг Шорт). В последнее время вышли пару книг о легендах количественных финансов, которые приоткрывают завесу на их арбитражные стратегии спекуляций.

В этом ряду особняком стоят так называемые СТА - commodity trading advisors, использующие систематические стратегии торговли на фьючерсных рынках аж с 1970-х годов. Главное их отличие в том, что ряд этих СТА заточены на алгоритмические стратегии торговли по тренду. В чем же суть их стратегий? И можно ли применять их методы торговли на фондовых рынках?

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

Немного базы

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

Первое- все стратегии инвестирования кроме Buy&Hold индексов, я отношу к спекулятивным, если они имеют цель обогнать индекс по абсолютной доходности (а не по соотношению доход/риск). Следуя стратегии Buy&Hold индекса (SPY, VTI, etc)- мы покупаем весь рынок и по сути получаем "премию за риск" от всего рынка акций(в голове я определяю это, как долгосрочную доходность в 9.5%, которую я получаю за риск попасть на минус 20-50% в моменты кризисов) . Когда же мы формируем портфель из отдельных акций, то риск вложений складывается из двух компонентов- 1) систематического риска или беты (по- простому, резонанса с общим рынком, бета может быть больше или меньше 1 - т.е. при росте рынка на 1% акция будет в среднем стремиться расти больше или меньше 1%) и 2) идиосинкратического риска (относимого конкретно к этой акции, того что "не видит" рынок сейчас или альфы). Для тех, кто готов нырнуть в эту кроличью нору больше информации тут.

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

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

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

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

Ок пойдем дальше.

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

Но будет ли она прибыльной в реальности?

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

Основная претензия к ТА, в том что, многие ее "фигуры" сложно проверить статистически. Да есть сервисы которые пытаются определять "паттерны", но я им особо не доверяю. Вполне возможно что ИИ с его искусственным зрением уже продвинулся дальше.

Второй момент, многие простые неэффективности - "правила" , как например, покупать или продавать акции, только если она выше/ниже 200-дневной скользящей средней (SMA) давно съедены рынком. Именно, поэтому к рекомендациям из книг и результатам исследований из прошлого века необходимо подходить с скепсисом, особенно если их нельзя проверить хотя бы на промежутке последних десяти лет.

Кейс Mulvaney Capital Management

После долгого вступления перейдем к практической части.

Для примера рассмотрим CTA-фонд Mulvaney Capital Management, который использует систематические стратегии для спекуляций на фьючерсных рынках. Сейчас под управлением компании около 500 mln.$, с доходностью(cagr) около 16% в год. Инвестиционная компания работает с 1999 года и по их заверениям строго следует разработанной алгоритмической системе. Подробнее тут и тут.

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

Суть их стратегии -это торговля по тренду. Как они определяют тренд? По сути никак, т.к. пробой канала (channel break-out) может перерасти в полноценный тренд вверх. а может закончиться проколом и возвратом цены обратно в канал. Подробнее на слайде внизу.

Для определения канала движения актива обычно берутся максимальная и минимальная цена за определенный прошедший период (напр-р 22, 55 и т.д. торговых дней). Индикатор Donchian Channel как раз рассчитывает данный канал на основе параметра периода времени.

Итак пробой канала вверх генерирует сигнал на покупку, пробой канала вниз сигнал на продажу.

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

К сожалению, они не приводят информацию о том, используется ли первоначальный стоп-лосс при первой покупке. Напр-р, черепашки (первые знаменитые трейдеры торговавшие по тренду) используют правило: одно правило(параметр) для покупки, одно- для стоп-лосса, и одно- для выхода из позиции. Это позволяет строить "робастные" стратегии- так как с каждым добавленным параметром риск подгонки (curve fitting) значительно возрастает.

Также Mulvaney "пирамидит" позицию в случае развития тренда в направлении тренда.

Хочу отметить очень интересную цифру на слайде - 80% трейдов заканчиваются убытками. Задумайтесь на минуту, как долго вы выдержете, если каждый раз из 10 сделок будете фиксировать убытки по 8 из них. Все трендовые стратегии предполагают сверх-доходность, но это достигается за счет более высокого процента убыточных сделок. Т.е. трендовые стратегии некомфортны, так как работают в противофазе хорошо изученных когнитивных искажений: 1) держаться убыточных сделок (loss aversion), и 2) рано фиксировать прибыль (синица в руке лучше, чем журавль в небе).

Как видите из слайда - стратегия не предполагает таргетов ни по цене ни по прибыли. Именно это позволяет ловить "хвосты" - редкие сделки которые генерят доходность выше 100%.

Строю систему

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

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

Поэтому при тестировании необходимо учесть:

  • Ошибку выжившего (survivorship bias)

  • Использование будущей информации (look-ahead bias)

  • Влияние рандома (path dependency)

  • Критерии отбора (selection bias)

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

Если при тестировании мы используем информацию, которую в реальной жизни мы не можем знать не заглянув в будущее, то наши тесты подвержены look-ahead bias. Для примера, если система генерирует сигнал на покупку при пробое канала и закрытии цены выше максимума цены канала, и определяет цену покупки по цене закрытия дня (close price), то мы используем информацию из будущего. До закрытия дня мы не можем знать будет ли сигнал на покупку, и мы будем знать это уже после закрытия и соответственно не можем в реальности купить по цене закрытия. По (не)знанию, на тестах, использующие исторические цены, можно улучшить результаты информацией из будущего.

Недооценка path dependency может сыграть злую шутку при реальной торговле. Обычно портфель акций состоит из N-позиций. В индекс SP500 входят около 500 акций, VTI более 3700. Т.е. купив акции в портфель придется пропустить сигналы системы, которые она будет генерировать уже после формирования портфеля. По простому - рандом и порядок сигналов получаемые на входе определяют результаты на выходе.

Если система генерирует несколько сигналов на покупку - то выбор актива (selection bias) чтобы добавить в портфель будет влиять на конечный результат.

Поэтому для учета этих факторов я сделаю следующие поправки. В выборку акций для тестирования моей системы войдут все акции входившие в индекс SP500 с 1999 года. Открытие(закрытие) позиции будет идти на следующий день после сигнала на покупку(продажу) по цене открытия плюс(минус) комиссия. Комиссия за сделку принята 0.15% за сделку. Также, я не буду пирамидить позицию.

Чтобы учесть path dependency и selection bias я несколько упростил себе задачу. Для этого я определю, как работает сигнал на всей выборке данных. Мне важно понять работает ли "в среднем" система.

Для написания кода я использовал python, стандартные библиотеки pandas, numpy. Также понадобится установить библиотеки talib для расчета индикаторов, yfinance и pandas_datareader для доступа к api finance.yahoo.com и tiingo для скачивания исторических данных по ценам акций, pyfolio для анализа доходности. Отмечу, что я не профессиональный кодер и заранее прошу прощения, если мой код будет вызывать у вас желание кинуть в меня тапком. При желании вы можете протестировать различные параметры системы. Весь код выложил в ноутбуке тут.

В качестве примера, я возьму период в 90 торговых дней, для расчета верхнего и нижнего канала. Стоп-лосс при входе в позицию составляет -4хATR (average true range) от цены закрытия дня предшествующего сделке.

Результаты первой итерации в таблице 1.

Период

январь 1999- апрель 2024

Win rate

0.4

Profit factor

1.4

Средний % убытка

-11

Средний % прибыли

78

Среднее кол-во дней в позиции

202

В целом результаты системы можно назвать положительными. Но рано радоваться.

Агрегированные данные на всем промежутке периода тестирования не дают полного представления о ее прибыльности. Для более реальной оценки системы я разобью весь период на два примерно равных отрезка: in-sample и out-sample периоды: янв.1999 - дек.2011, и дек.2011-апр.2024. Кроме того, на in-sample периоде буду делать все "улучшайзинги" системы и тестировать на out-sample.

Результаты повторного тестирования разочаровывают (таблица 2)

Период

in-sample (янв.1999 - дек.2011)

out-sample (дек.2011 - апр.202)4

Win rate

0.4

0.37

Profit factor

1.62

1.27

Средний % убытка

-12

-10

Средний % прибыли

125

36

Среднее кол-во дней в позиции

207

195

Результаты системы резко упали в последние 12 лет. Напомню, что в последнее десятилетие рынок больше рос чем падал, в отличие от промежутка 1999-2011г.

Возможно на рынке стало больше шума и ложных проколов в последнее время. Для теста гипотезы я несколько изменил правила входа и выхода в итерации 2. Условием открытия позиции будет два последовательных пробития канала вверх (и выхода соответственно 2 пробития канала вниз). Результаты итерации 2 в таблице 3.

Период

in-sample (янв.1999 - дек.2011)

out-sample (дек.2011 - апр.2024)

Win rate

0.4

0.35

Profit factor

1.3

1.27

Средний % убытка

-12

-10

Средний % прибыли

60

53

Среднее кол-во дней в позиции

255

236

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

Т.е. важно находится в позиции если она прибыльна. В связи с чем, я решил попробовать отодвинуть цену для выхода еще ниже - на 2 ATR при пробитии канала вниз. Это условие будет плавающим стоп-лоссом. Результаты итерации 3 в таблице 4.

Период

in-sample (янв.1999 - дек.2011)

out-sample (дек.2011 - апр.2024)

Win rate

0.37

0.34

Profit factor

1.38

1.3

Средний % убытка

-13

-12

Средний % прибыли

71

60

Среднее кол-во дней в позиции

314

307

Срок нахождения в позиции вырос по сравнению с итерацией 2, но показатели прибыльности изменились незначительно в лучшую сторону. Среднее количество во дней в позиции по сравнению с итерацией 1 выросло в 1.5 раза, что примерно соответствует росту средняя прибыль 1.7 раза на out-sample периоде.

Условия итерации 3 легли в основу бэк-тестов системы на исторических данных. Максимальное количество акций в портфеле для тестов принято за 20 позиций, для достаточной диверсификации портфеля, и также по-моему является реалистичной оценкой количества акций в портфеле для реальной торговли. Я выше упоминал о такой ошибке статистического анализа как selection bias. Поэтому, выбор акций для добавления в портфель будет вестись рандомно. Оценка рандома на результаты тоже является частью тестирования (чему можно посвятить отдельный пост).

Для наглядности результаты теста представлены в виде графика ниже.

Чтобы не утруждать вас избытком информации скажу только, что система перестала работать с 2015 года (иронично, что презентация Mulvaney Capital датирована августом 2014г.). Может это рандом так повлиял? Для наглядности влияния selection bias, я сделал 100 итераций, (знаю что мало) и даже лучший результат (оранжевая линия) показывает отставание от индекса с 2018 года (детали в ноутбуке).

Как уменьшить влияние selection bias? Для этого необходимы четкие правила отбора поступающих сигналов на покупку. Один вариант - это отбор акций на основе моментума. Что такое моментум и как его применять для стратегий инвестирования я также писал пост.

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

Результаты значительно улучшились по сравнению с выбором акций на основе рандома. Но опять же меня беспокоит отставание от индекса в моменты резкого роста фондового рынка в 2019, 2020 и 2021 годах (опять же больше информации в ноутбуке). Это можно было бы объяснить тем, что моментум лучше работает для рынков с устойчивым трендом.

Итак какие выводы можно сделать из всего этого:

  • простые системы перестали работать после 2015 года (возможно это связано с резким ростом алготрейдинга и улучшением эффективности рынка)

  • для отбора поступающих сигналов также требуется система. Один из вариантов является применение сортировки на основе моментума. Кроме этого, можно применять более продвинутые фильтры на основе фундаментальных данных компаний (роста прибыли и т.п.). Это называется quantamental approach.

  • exit важнее entry. Срок удержания позиции коррелирует с прибыльностью (т.к. как акции подвержены positive drift).

  • и результаты тестов показывают, что для прибыльной системы требуется profit factor выше 1.5

Если посмотреть на слайд Mulvaney можно отметить, что они пирамидят позиции в направлении тренда. Т.е. они используют несколько каналов (напр-р: 90, 126, 252) и при пробитии каждого канала увеличивают позицию. Таким образом количество позиций в портфеле может расти и уменьшаться динамически. Например, в самом начале можно рисковать только 1% капитала на позицию и доводить ее максимум до 5% при росте акций. Так мы будем класть "яйца", в те корзины которые растут. В результате, это увеличивает шансы поймать положительные хвосты (т.е. трейды с доходностью выше 100%). Думаю следующий пост посвящу как раз динамическому изменению размера позиций.

P.S. Если вам интересна тема систематических инвестиций, ранее я публиковал разбор "Все-погодной" стратегии инвестирования от Рэя Далио.

Другими стратегиями делюсь на своем канале: https://t.me/systematical

Комментарии (0)