Стратегия скользящих шестилеток с алгоритмическим отбором акций

31 октября 2021     1981   

Возможно, некоторые знают, что я разработал алгоритм, а М. Шардин реализовал его в виде скрипта, который позволяет отбирать акции на основе фундаментального анализа компаний-эмитентов. Вот общее описание алгоритма:
https://gregbar.livejournal.com/922938.html
Сегодня решил проверить, каковы будут результаты реализации на его основе моей любимой Стратегии "скользящего среднего". Ведь бэктестинг этого алгоритма был ранее проведён на 25 годах: с начала 1996 по конец 2020 годов. Там я запускал отбор акций 1 января каждого года, алгоритм отбирал акции, а мы проверяли после этого, к каким результатам приведёт такой отбор за 1,2,3,4,5 или 6 лет владения. Там получились любопытные результаты, которые я описал https://gregbar.livejournal.com/920158.html Сейчас нетрудно на основе этого алгоритма и с учётом полученных результатов бэктестинга проверить мою любимую Стратегию инвестирования.

Задача ставится так: Инвестор 1 января 1996 года покупает рекомендованный алгоритмом список акций, вкладывая в каждую позицию одинаковую сумму. Всего на, скажем, 20 тысяч долларов. Через год, 1 января 1997, инвестор добавляет к своим инвестициям ещё 20 тысяч долларов. Чтобы понять, что ему покупать, он опять запускает программу отбора акций, и алгоритм опять выдаёт ему список акций, которые рекомендованы ему к покупке на данный момент. Инвестор на свои новые 20 тысяч долларов покупает рекомендованные акции, вкладывая в каждую позицию равную по величине сумму. Теперь в его портфеле имеется уже два "портфельчика" разного возраста: один прошлогодний, а второй совсем свежий. Инвестор не смешивает эти "портфельчики", он ведёт учёт по ним отдельно.

Итак, у него есть два "портфельчика" разного возраста. То же самое он повторяет 1 января 1998, 1999, 2000 и 2001 годов. Теперь у него в портфеле уже 6 "портфельчиков" разного срока свежести. Самый старый "портфельчик" у него уже шестой год безо всяких изменений хранится. Инвестор за это время уже инвестировал приличную сумму - 120 тысяч долларов. Но это и всё. Больше ему вкладывать не придётся. Потому что 1 января 2002 года Инвестор продаёт свой самый старый (шестилетний) портфельчик, а на вырученные деньги покупает рекомендованный алгоритмом "свежий" набор акций. Точно так же, как и раньше. И теперь Инвестор наступление каждого Нового года отмечает продажей своего самого старого (шестилетнего) портфеля, покупая взамен рекомендуемые алгоритмом акции. Формирует таким образом новый, свежий "портфельчик" данного года выпуска. Таким образом ведёт себя наш инвестор долго, 25 лет в общей сложности, до конца 2020 года.

Как видим, Стратегия довольно тупая, любой справится. И времени тратится минимум: прогнал программу, получил список, продал старое, купил новое. Всё! Целый год свободен. Но каковы же результаты? Вот они (кликабельно):

(

)

Внизу две группы строк, это результаты для данной стратегии в сравнении с данными рыночного индекса. Как видим, за 25 лет Инвестор увеличил свои активы в 20 раз. А те, кто инвестировал в S&P 500, увеличили свои активы только в 6 раз (тоже, конечно, хороший результат). Это произошло потому, что в течение этой 25-летки у Инвестора, который действовал по описанной Стратегии, среднегодовая номинальная доходность составляла 13,8% годовых, а у S&P 500 - 8,8%. Среднегеометрическая номинальная доходность по Стратегии составила 12,8% годовых, а у S&P 500 - 7,4%.

Более наглядно это можно увидеть на графике:
(

)
При этом волатильность Стратегии не превышает волатильность S&P 500, даже немного меньше. Стандартное отклонение составляет у Стратегии 14,7% против 16,7% у S&P. Поэтому Шарп у Стратегии почти вдвое выше рыночного: 0,84 против 0,44 у S&P. Максимальная просадка у Стратегии = -26,2%, у S&P 500 = -35,4% (обе в 2008 году). При этом корреляция результатов Стратегии и S&P 500 очень высокая: 0,94. Что и так видно на графике.

Если же сравнивать реальную доходность, то можно грубо оценить инфляцию в США примерно в 3% годовых. Тогда реальная средняя доходность Стратегии составляет 9,8% против 4,4% у индекса. Разница более, чем вдвое.

Ну и в конце - про российского инвестора. Курс доллара к рублю 2 января 1996 года был 5,28 рублей за доллар, а 1 января 2021 года он составлял 73,61 рубля за доллар. Среднегодовой рост (Compaund) составил 11,1%. Тогда номинальный рост в рублях для такой Стратегии даёт инвестору доходность 12,8%+11,1%=23,9%. Это, разумеется, слишком большой рост. Он связан со скачком курса доллара в России в 1998 году. Вряд ли он будет таким в следующие 25 лет. Но даже если взять очень осторожные 5% годовых средней девальвации рубля к доллару, то рублёвая доходность Стратегии составит 17,8% годовых. Что тоже смотрится неплохо.

Примечание. В качестве бенчмарка взят индекс S&P 500. Это связано с тем, что алгоритм отбрасывает фирмы с капитализацией менее 4 миллиардов долларов. А исследование проводилось исключительно на рынке США. Поэтому S&P 500, по моему мнению, адекватно отражает рынок в данном случае.

Связанные посты
21 комментарий 👇
Григорий Баршевский, Пенсионер-инвестор автор 3 ноября 2021

Спасибо всем за дискуссию. Особо тем, кто сделал замечания. Понял, что должен кое-что пояснить.

Исходные допущения я не описал явно. Это плохо. Они таковы:

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

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

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

  • в отличие от наиболее распространённого подхода, я включаю в портфель все бумаги в равных объёмах (в деньгах), а не пропорционально капитализации компании. Это связано с тем, что полученный портфель никоим образом не претендует на то, чтобы отобразить рынок. А какие бумаги "выстрелят" я не имею никакого понятия.

Мне в некоторых комментах делали, справедливые в какой-то мере, замечания из серии "через любые N+1 точку всегда можно провести график полинома N-й степени так, что он точно пройдёт по всем точкам". Другими словами, если параметров настройки модели много, то можно так их подобрать, что на 25 годах мы будем получать замечательные результаты, но никакой прогностической силы эта модель иметь не будет.

Теоретически - да. Но тогда мне при настройке параметров надо было бы двигать их значения так, чтобы выбирались именно лучшие для данного периода результаты и так делать 25 раз для всех точек старта и следить за тем, что если в этом году получилось хорошо. то надо всё время проверять, что при этом не испортились старые года в смысле настройки. И ещё надо смотреть при этом, чтобы в каждый год при этом все 6 портфельчиков давали хорошие результаты в каждый конкретный год. Короче, я ни только не делал ничего подобного, но и даже не представляю, как можно подступиться к задаче такой невиданной размерности. Я исходил в выборе параметров из обычных экономических соображений, которые содержатся в подходе фундаментального анализа. Например, что высокая маржа прибыли - это хорошо, а низкая плохо. Но где поставить ограничение? Я опирался на статистику средних значений мультипликаторов по рынку США, имеющуюся в литературе, и на собственный опыт, если не находил опубликованные цифры.

Впрочем, здесь ответ на вопрос будет дан практикой. Если практическое использование этой стратегии даст в будущем хорошие результаты, то это будет (косвенным, только косвенным, конечно) доказательством наличия прогностической силы у такого метода.

Гораздо больше мне нравится проверка того, насколько эти результаты устойчивы, методом "по Силаеву": насколько всякие изменения существенно или не существенно меняют результат. Они оказались устойчивы, я проверял. Впрочем, можно убедиться в этом даже, например, по приведённой в тексте таблице. Так, в 2002 году все 6 портфельчиков разной "свежести", которые имеются у инвестора в своём большом портфеле, показывают довольно компактно расположенные цифры убытков, от -8% до -11,4%, в то время, как рыночный индекс показал убыток -21,4%. При этом важно отметить, что состав бумаг в этих 6 портфелях очень разный, не похожий один на другой. То же самое вы можете проверить и за другие годы. Это говорит о том (опять же только косвенно), что алгоритм работает, он формирует портфели разные по составу входящих в них акций, но дающие похожие результаты в смысле доходности/убыточности. То есть, можно сделать вывод, что алгоритм выбирает в целом скорее хорошие компании, чем плохие. Об этом же говорят и ещё некоторые обстоятельства. Не буду их упоминать, чтобы не затягивать безмерно эту и так затянувшуюся реплику.

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

Ещё раз, спасибо всем за обсуждение.

  Развернуть 1 комментарий

Так а что за Стратегия в итоге? Какие в ней мультипликаторы для чего используются, какие корректировки ошибок бух. учета (например, списание R&D в расходы) при расчете этих мультипликаторов? Или хотя бы на что больше смотрите - стоимость компании, денежные потоки, уровень долга?

Я прочитал пост и глянул в ЖЖ ссылку, но ощущение осталось будто мне чудо-алгоритм на комоне продают. 🙂

Ещё график бы показать за вычетом НДФЛ с учетом продажи всего портфеля каждый год, всё-таки у buy & hold бенчмарка эта издержка есть только раз в самом конце, а тут мы каждый год продаем и перевкладываем уменьшенную на 13% прибыль получается - тогда компаундить результаты по стратегии за весь период с 1995 года некорректно.

  Развернуть 1 комментарий

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

  Развернуть 1 комментарий

@Dmitry, да

  Развернуть 1 комментарий

@Gregbar, Конечно, налог уменьшит среднюю доходность. На 0,26 процентных пункта. Поэтому надо уменьшить результат на эту величину. Будет не 12,8%, а 12,5%. Правда при ежегодной ребалансировке индексный портфель тоже будет иногда налогооблагаться. Но я не знаю насколько. Стоит также подчеркнуть, что это доходность по росту цены. Общая доходность с учётом дивиденда будет и для Стратегии и для бенчмарка процентов на 1-1,5 повыше.

  Развернуть 1 комментарий

@Gregbar, а почему 0,26%? По-моему за один 6-летний период при доходности 12,8% там около 1% CAGR будет потеря на налоге, что за полный период с 1995 года - около 30% прибыли. Опережение все равно осталось, просто издержки стратегии же тоже надо посчитать. Ну это я быстро прикинул, может неправильно?

  Развернуть 1 комментарий
Виталий Якушев, Investor, Investment Manager, iOS-Dev 1 ноября 2021

@Gregbar Григорий, очень впечатляющие результаты!

Скажите, а сколько компаний в среднем получается в портфеле? Пропорции, насколько я помню, у вас распределяются равными долями на все компании?

  Развернуть 1 комментарий

@VitaliyYakushev, В каждый год получается по-разному. Иногда около 10 тикеров алгоритм выдаёт, а иногда 60. Но в среднем где-то 20-30-40.

  Развернуть 1 комментарий
Данила Овечкин, Младший научный сотрудник 2 ноября 2021

Спасибо за интересный пост!

Исходя из описания алгоритма в ЖЖ (https://gregbar.livejournal.com/922938.html), вы исключили из рассмотрения следующие отрасли:

  1. авиаперевозки;
  2. автопроизводители;
  3. нефть и газ;
  4. банки

Все эти отрасли за рассматриваемый период показали доходность ниже S&P500. Может быть тогда доходность Стратегии обусловлена исключением этих отраслей, а не фильтрами, через которые проходят оставшиеся компании для попадания в портфель?

Было бы интересно увидеть динамику акций, которые не прошли критерии отбора. Возможно, что они выросли еще сильнее :)

  Развернуть 1 комментарий

@dv_ovechkin, да, эти отрасли я исключил, не люблю их по жизни :)
Но это тоже получается один из критериев отбраковки.

Возможно, какие-то другие критерии и настроечные параметры дали бы результат выше. Конечно! Я этого не знаю. Я просто фиксирую, что даёт такая Стратегия. Но не утверждаю, что она наилучшая. Наверняка, нет.

  Развернуть 1 комментарий
Анатолий NeulovimiiJo, Мелкий клерк в крупной организации 31 октября 2021

Посмотрел ещё и пост в жж. Не понял, за какой период использованы данные для обучения модели, и за какой- для проверки? Вообще то это должны быть разные периоды, и, в идеале, 3.
Пример: с 85 по 2000 используете данные для подобора весов (граничных значений мультипликаторов) и сам выбор фич (мультипликаторов). Качество такого выбора проверяете на периоде 2001-2010. А потом, выбрав модель с максимальным качеством, проверяете её на третьем, независимом периоде. В моем примере 2011-2021.
Если подобрать весов для скрининга и рейтинга шёл не по такому алгоритму, если вы оценивали работу модели на тех же данных, на которых её учли- у вас переобученная модель.

  Развернуть 1 комментарий

@Dalf, алгоритм работает так.

Задаётся точка старта, например, 1 января 1996 года. На эту дату алгоритм перебирает все акции из базы и бракует некоторые из них, а другие оставляет. Для отбраковки используется система критериев - скрининг (которая неизменна для всех экспериментов с бэктестингом и вообще не меняется).

Для расчёта значения критериев отбраковки по каждой конкретной компании рассматриваются экономические параметры работы данной фирмы в течение прошлых 10 лет (исходные данные извлекаются из балансовых таблиц и счетов прибылей/убытков фирмы за прошедшие 10 лет). В нашем примере с 1985 по 1995 года.

На основании проверки рассчитанных для компании параметров на установленные в алгоритме граничные значения делается вывод, оставляем ли мы эту компанию в списке отобранных для покупки на данную дату (01.01.1996) или нет. Чтобы компания осталась в списк необходимо, чтобы все рассчитанные критерии находились в пределах заданных ограничений.

В результате алгоритм выдаёт список компаний (тикеры), которые рекомендуются к покупке на данную дату старта (1 января 1996 года). То есть, для принятия решения в точке старта используются критерии оценки прошлых по отношения к этой точке достижений/неудач компании.

Потом можно посмотреть, как изменяется в "будущем" (т е после 1 января 1996 года) цена акции каждой отобранной фирмы и всего портфеля в целом.

  Развернуть 1 комментарий

@Gregbar, как происходит бэктестинг я знаю. Я про другое. В вашем примере старт бэктестинга (проверки алгоритма) начинается в 1996 году. В этот момент алгоритм (модель) уже существует (обучен). Вы уже выбрали какие показатели использовать, а какие нет. С какими коэффициентами и пороговыми значениями их вводить в модель. Вопрос только в одном: этот набор показателей и значения коэффициентов выбраны на данных только до 1995 года? Или использовалось более поздние данные?

  Развернуть 1 комментарий

@Dalf, Нет, эти параметры выбраны навсегда. И работают одинаково для любой точки старта.

  Развернуть 1 комментарий

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

Есть некая нелинейная функция, которая в самом лучшем случае принимает значение 1, а в самом худшем -1.

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

Это число умножается на критерий важности данного показателя

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

  Развернуть 1 комментарий

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

  Развернуть 1 комментарий

@Gregbar, в какой год параметры стратегии перестали уточнятся? Сколько лет бектеста не участвовало в подоборе параметров?
Я сейчас просто пытаюсь освоить анализ данных, так что рассматриваю ваш пост "со своей колокольни". Я даже допускаю, что какие-то устойчивые неэффективности могут существовать и вы могли их найти. Просто как это выглядит с моей точки зрения:
Вы взяли 20 лет истории и обучили на ней модель, то есть наши лучшие коэффициенты, нелинейные преобразования и провели отбор подходящих объектов (секторов).
А потом поверили эту модель на 25 годах истории, из которых 20 было использовано в обучении модели. В такой ситуации модель может быть (а точнее- скорее всего) сильно переобучена.

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

  Развернуть 1 комментарий

@Dalf, Что-то не получается у меня объяснить, извините. Попробую уточнить. Параметры алгоритма сначала настраивались. В основе лежали средние значения по рынку. Например, средняя маржа чистой прибыли на американском рынке составляет 6% годовых (условно, не беру сейчас точную цифру). В алгоритме устанавливается, что отбраковываются компании, у которых маржа меньше 6. Так по всем параметрам. По некоторым я не знал среднерыночное значение (не смог найти). Тогда я по своему усмотрению (на основании опыта анализа тех сотен компаний, которые раньше я вручную анализировал) устанавливал, например, ROA меньше 5% - это плохо. Затем прогоняем алгоритм отбора на какой-то прошлый год. Выясняется, что в результате ноль компаний выбрано. Ага, похоже, я слишком многого хочу, нет таких хороших во всех отношениях компаний. Чуть ослабим ограничения. Вот, сейчас стало ловиться что-то. Ещё ослабим. Ого, уже 150 компаний попало в сети. Многовато. Надо 20-30-40. Чуть ужесточим критерии. Ага, вот сейчас примерно столько и ловится (в разные годы по-разному, конечно). Всё, фиксируем параметры. Потом начинаем планомерно год за годом проводить бэктестинг, уже ничего не меняя в параметрах. Вот так это реально выглядело.

  Развернуть 1 комментарий

@Gregbar, вот в этот момент

Затем прогоняем алгоритм отбора на какой-то прошлый год. Выясняется, что в результате ноль компаний выбрано. Ага, похоже, я слишком многого хочу, нет таких хороших во всех отношениях компаний. Чуть ослабим ограничения. Вот, сейчас стало ловиться что-то. Ещё ослабим. Ого, уже 150 компаний попало в сети. Многовато. Надо 20-30-40. Чуть ужесточим критерии.

Вы обучаете систему. Если "какой-то год" был давно (условно 2000-2005) , а бектесты были только с 2006 - то все в целом нормально. Но если "какой-то год" из недавних, то в этом месте легко себя обмануть. Ради интереса попробуйте подобрать параметры на старых данных и посмотреть как они зарабатывают на чуть более современных. Условно, для выбора коэффициентов использовать только с 1995 по 2003 годы, а тест-с 2004. Не факт, что тут обязательно есть ошибка, просто она может быть, это достаточно очевидное место.
Ещё один способ проверить стратегию (систему, модель) на жизнеспособность -"по Силаеву": берете любой пареметр и меняете на плюс- минус 20%. Если результаты изменились сильно- значит модель неустойчива и нашла что-то не то.

И ещё подумал, насчёт бенчмарка. Если вы исключили авиа, нефтянку и банки, то и из бенчмарка(snp500) их стоит исключить. Как пример: ну придумаю я алгоритм, который выбирает лучшую акцию из faang. Так какую бы он акцию не выбрал, пусть худшую из них- она сделает snp500. На прошлых данных, конечно.

  Развернуть 1 комментарий

@Dalf, "по Силаеву" я делал. Не меняется почти результат. То есть списки отобранных компаний чуть изменяются (совсем немного), а результаты по всему портфелю - практически не меняются.

  Развернуть 1 комментарий

@Dalf, вы правы, что тестировать надо out of sample, но конкретно для этой стратегии, наверно, это особо не изменит результаты бэктеста.

  Развернуть 1 комментарий

😎

Читать можно всем, но комментирование доступно только участникам Клуба.

Что вообще здесь происходит?


Войти