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