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

Это продолжение рассуждений о риске и доходности акций на Московской бирже: https://smart-lab.ru/blog/625771.php Основные выводы из первой части:
1) Увеличение риска (стандартного отклонения) приводит к снижению будущей доходности акций, а не наоборот;
2) Стратегия, выстроенная только на основе исторической волатильности, несамостоятельна и проигрывает индексу.
В этот раз возьмем за основу трендовую стратегию в самом простом виде – на пересечении 1-месячной и 3-х месячной скользящей средней. И будем снижать риск разными способами с целью поднять доходность, Шарп, сократить время боковиков и корреляцию с бенчмарком. Об эффективности трендовых стратегий в России можно почитать здесь https://smart-lab.ru/blog/611263.php на глобальных ETF здесь https://smart-lab.ru/blog/617639.php
О выборке и методах тестирования
В этот раз у нас 60 акций с 2014 по 2020гг. 20 голубых фишек из ММВБ 10 + ликвидные металлурги и Яндекс, 20 компаний средней капитализации вроде производителей удобрений и угольщиков + 20 неликвидных бумаг из разных секторов. Период из-за сложно доступности не биржевых данных уменьшился. Зато мы совершаем сделки почти ежедневно и балансируем портфель по ситуации, а не фиксировано раз в месяц как раньше. В портфеле может находится от 0 до 60 акций одновременно, комиссии за сделки взяты среднерыночные, дивиденды не учтены. Наблюдение по цене закрытия, сделка – по цене открытия. Веса в портфеле равные.
1) Покупаем по тренду и продаем по тренду
«Hello world!» в мире алготрейдинга. В данном случае под риском подразумевается переход к падающему тренду в среднесрочном периоде. Очевидно, запаздывающий индикатор, но годится как бенчмарк для сравнения с более сложными стратегиями. Прогоняем цикл для каждой акции и покупаем при превышении долгосрочного ряда краткосрочной МА. Для отдельной акции помимо метрик получаем моменты сделок. На примере АФК:
Источник: Sentimetrica (2020)
Здесь и далее синяя линия отражает доходность тестируемой стратегии по акции или портфелю, а оранжевая — buy&hold акции или равновесного бенчмарка. Ситуация портфеля в сравнении с индексом из 60 бумаг:

Источник: Sentimetrica (2020)
Шарп 1.1, среднемесячная доходность 2.78% и значимая месячная альфа 0.97%. Совсем неплохо для минимальных усилий. Из минусов: почти полная корреляция с индексом 0.82, которая еще более заметная если смотреть на скользящую 21-дневную волатильность доходности (0.91):

Источник: Sentimetrica (2020)
В среднем стратегия достигает нового максимума за 9 дней и максимально за 225 дней. Самые популярные бумаги по суммарным дням нахождения в портфеле:

2) Покупаем по тренду и продаем по волатильности
Правило покупки остается неизменным, но продаем теперь при превышении трейлинг волатильности своего долгосрочного аналога. Сигнал на продажу является старшим, т.е. если у нас в портфеле есть бумаги и одновременно выходит покупка и продажа – мы продаем. Если в такой же ситуации бумаги нет – не покупаем. Результат:

Источник: Sentimetrica (2020)
На удивление результаты ухудшились в сравнении с простым вариантом МА. Шарп 0.91, среднемесячная доходность 2.14%, альфа около 0 и незначима. Корреляция с индексом также высока 0.88. Если бы не чуть более сильный рост в 2015-2016гг, то результаты не отличались бы от бенчмарка. Интересно, что в среднем в портфеле было 36 бумаг, а на пике 53, т.е. почти вся выборка.
3) Покупаем по тренду и продаем против обсуждений толпы
Для этого нужен ряд с посчитанным количеством сообщений для каждой акции из популярных Телеграм групп и чатов + некоторых других источников. Если канал-ветка не посвящены отдельной акции, то используем словари и другие методы, чтобы отделить сообщения. При значительном росте сообщений мы продаем/не покупаем бумагу. Результат:

Источник: Sentimetrica (2020)
Лучше предыдущего варианта, но хуже скользящих средних с поправкой на сложность. Доходность возросла одновременно с риском, что отразилось на Шарпе 0.91 и альфе 0.42%. Корреляция чуть отклеилась, но остается высокой 0.75. Торгуем в этот раз активно, почти 4 сделки в день:

Источник: Sentimetrica (2020)
Но держим меньше бумаг в портфеле (19) и не всегда это голубые фишки.
4) Покупаем по тренду и продаем по сложной методике их тональности и активности сообщений частных инвесторов
В этот раз мы идем дальше и обучаем нейросеть для разметки сообщений на разные группы тональности. От восхищения до проклятий в отношении акции/компании. И строим на этих данных индикатор, одновременно учитывающий и тональность сообщений, и активность постинга. Сложно назвать эффектом «толпы» позитивный сантимент из 3 сообщений. Или при рассмотрении большого количества сообщений обнаружить, что позитива и негатива там 50-50. Наверное, про этот подход стоит сделать отдельный пост. Результат многодневного чтения и разметки сообщений:
Источник: Sentimetrica (2020)
В этот раз усилия дали результат: накопленная доходность почти х10, Шарп 1.4, максимальная просадка -18%, лучший месячный результат 30.69%, а средний 3.65%. Альфа 2.07 с t-stat >3. Разбивка по месяцам:

Источник: Sentimetrica (2020)
Волатильность высокая, но почти не коррелирует с бенчмарком 0.27. И это радует:

Источник: Sentimetrica (2020)
Из минусов можно отметить малое количество бумаг в портфеле, в среднем – 5. Но это лечится увеличением исходной выборки. Лидеры по количеству сделок в портфеле. Список не на 100% пересекается с бумагами по удержанию и отражает более спекулятивные бумаги:

Более существенный минус – это высокое количество дней, за которое мы не достигаем нового максимума по накопленной доходности. В среднем – это 13 дней, а максимально 329. Не нашел расчета такой метрики в базовых пакетах, но задача имеет простое решение:

Вывод: все метрики снижения риска улучшили результат. И опять мы получили U-образную кривую эффективности. Если жалко время на разметку и обучение НС, то простые способы дают хороший результат и займут не более 100 строк кода. Если использовать сложные метрики, то в них нужно идти до конца. Промежуточные варианты слабы, но в законченном варианте видим потенциал.
Спасибо всем за полезные комментарии и умные вопросы. В заключительной части сделаю бэктест метрик из предложенных в комментариях к 1 части и этому посту. Пилим бета-версию бесплатного сервиса по сантиментам здесь: https://www.sentimetrica.ru/portfel Больше исследований здесь: @sentimetrica t.me/sentimetrica Вопросы можно задать здесь, в чате или в личку @atomtosov.
Работа по тестированию стратегий и формированию баз данных, построению набора факторов влияния на инвестиционную привлекательность реализуется в рамках проектов ЛАФР (www.fmlab.hse.ru), включая проект по сентименту на развивающихся рынках капитала ФЭН НИУ ВШЭ. Не является индивидуальной инвестиционной рекомендацией.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
1 выбор бумаг неудачен для реальной торговли… я бы закладывал хотяб 200мио оборота в день как минимум
2 если взглянуть на индекс то аптренд с 2014г, было всего 2 36% коррекции и ни одной на 50%...
3 можно сделать стресс тест 2008г чтоб убедится в рабтоспособности методы
4 крайне мало сделок — нет нормальной статистики… т.е скорее всего результат случаен
5 я бы не доверял самописному тестировщику
ves2010, Спасибо:
1) Можно оставить 50 самых ликвидных и поставить условие, чтобы было не менее 10-15 бумаг в любом периоде. Но в Сберах и Норникелях форумные инвесторы по ощущениями не сильно влияют на ценообразование. А в бумагах вроде распадской и ниже — вполне. В других бэктестах ставил фильтр на среднедневной объем торгов не ниже 10мио за пред. месяц, можно проверить это стратегий 1-3;
2-4) Согласен, но данных по сантименту за тот период не найти, чтобы был нормальный охват % брокерских счетов. Новости и лента не совсем то будет;
5) Почему? Мне он видится наоборот прозрачным — можно поковырять в экселе, перепроверить по шагам.
«сделка – по цене открытия» — это плохо
ну и эффективность очень низкая для неликвидов, даже простейшие фильтры дают больше насколько я знаю
Наверное, исследование может включать в себя ARSA подобный бумаги, если это заранее оговорено и не вся выборка будет состоять из 3 эшелона. По ощущениям, опубликоваться статью с данными нашей биржи в не российском журнале очень сложно и пока не похоже на простой путь.
Я не могу выбрать даже 20 более-менее ликвидных акций на нашей бирже, чтобы торговать вменяемый объем с вменяемым проскальзыванием. Собственно, из этого и надо исходить в реальности. Либо очень ограниченный объем (только для бытового использования) или портфели и медленные системы с набором позиций неделями.
Стратегия на неликвидах не годится для индустрии или особо крупных счетов, но чем она плоха для частного инвестора как составляющая корзины стратегий? У них низкая корреляция с прочим рынком. Если обеспечить нормальную диверсификацию и сделать скринер по делистингу, то уже не так страшно.
Читал в работе Size Matters if You Control Your Junk (2018, Asness et al), что последний дециль по капитализации дает плохое соотношение риска и доходности. Но если отфильтровать группу по фактору Quality (без убыточных и совсем закредитованных), то ситуация сильно меняется.
Здесь явно требуются более качественные тесты.
t-stat>3 сомнителен. Я, правда, и не знаю что такое t-stat
Прикрепляю лог график, кажется более значимым была девальвация 2014-2015 и ралли 2016г:
Можете предложить дополнительные тесты на проверку устойчивости? Пока приходит в голову только протестить отдельно на аптренде/падении/боковике/сильной и слабой воле + посмотреть результат без 1-3 лучших акций, которые дали наибольший профит
У меня на Марковице тоже так — 2014-2017 обгоняю рынок, 2018-2020 чуть отстаю. В целом, это скорее нормально для любых систем ставящих целью обогнать рынок, так как рынок обогнать можно только на сильных трендах, которых последние два года и не было.
Тесты в различных фазах нужны скорее как генерация идей, а не как тесты. То есть, если на боковике вы уходите в глубокий минус, то это повод ввести некоторый фильтр «пилы». Сам по себе тест конкретно на боковике или конкретно на тренде не имет никакого значения.
В целом же я ориентируюсь на z-test. Для вашей системы он будет примерно равен:
256*6=1536 дней
стандартное отклонение шарпа = 1/(1536)^0.5 = 0.025
годовое ст. отклонение шарпа = 0.025 * 16 = 0.4
Шарп в ст. отклонениях = 1.4/0.4 = 3.5
То есть с вероятностью более 99.99% система является прибыльной.
Если нужно проверить на преимущество к бенчмарку, то шарп бенчмарка нужно вычитать из шарпа системы и делать то же самое.
Вряд ли существует некоторая общая и при этом более качественная оценка. В данном случае здесь по бенчмарку вопросы — уж очень у него высокий Шарп (вероятно около 0.8-1).
Что будет если простую и нейросетевую запустить в рынок?
Или хотя бы сохранить текущий сетап, а через год применить его на исторические данные в неизменном виде.
Если всплеск убрать, то что будет?
Можно еще посмотреть от чего он произошел, сложился ряд событий, но это не заслуга стратегии