Блог им. usenkov1988

Оптимизация портфеля акций

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

  1. Величина риска – стандартное квадратическое отклонение доходности за расчетный период
  2. Уровень риска портфеля – умножение ковариационной матрицы на два вектора частей акций, входящих в портфель

Перед тем как начать, дам определение некоторым понятиям, использованным в статье:

  • Портфельная модель – ряд ограничений, накладываемых на параметры (доходность, риск и т.п.) акций перед добавлением их в портфель.

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

Портфельная модель разрабатывается для отечественного фондового рынка. Торговые инструменты (акции) входящие в расчет взяты из индексов MICEX (Oil & Gas Indices; Consumer Goods & Retail Indices; Chemicals Indices; Metals & Mining Indices; Telecoms Indices; Electric Utilities Indices; Financials Index; Transport Index), в количестве 76 единиц. Расчетный период – один месяц.

Для начала обозначим все пункты параметры модели:

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

Перед составлением оптимального портфеля необходимо убедиться в том, что данная модель характеризуется положительной доходностью. Для этого были взяты данные месячных котировок в период с 01.01.2000 – 01.12.2018 гг., данные брались с торговой платформы Quik. Затем, используя IDE Visual Studio Community 2017, на языке C# запрограммированы все правила портфельной модели и запущены на истории котировок. Разработанная программа (рабочее название – Elegant Portfolio) служит исключительно для проверки параметров модели, на внешний вид внимание не обращайте – немножко бардак. В качестве механизма для поиска оптимального решения была использована библиотека Microsoft Solver Foundation 3.1. С кодом проекта можно ознакомится здесь: https://github.com/usenkov1988/ElegantPortfolio.

Главное рабочее окно программы
Рис. 1. Главное рабочее окно программы

После всевозможных результатов тестирования были получены следующие результаты (рис. 2 и 3): 

График накопительной доходности для портфеля в 70 000 руб.
Рис. 2. График накопительной доходности для портфеля в 70 000 руб.

График накопительной доходности в относительных единицах
Рис. 3. График накопительной доходности в относительных единицах

Пояснение к графикам. Изображенные три линии показывают доходность портфеля после моделирования: в первый (красная линия), на второй (оранжевая) и на третий (зеленая) месяцы.

На обоих графиках есть момент резкого падения, который приходится на кризис 2008 года. При попытках «подогнать» портфельную модель для нивелирования данной просадки, в целом, результаты оказались хуже. Тем не менее, характер линий плавно растущий. 

Подведем промежуточный итог. Первая поставленная цель выполнена. Далее необходимо создать «калькулятор» для оценки текущего состояния рынка и подготовки оптимального портфеля в соответствии с моделью. Для решения этой задачи в качестве среды разработки послужил Microsoft Excel 2010 и его инструмент – «Поиск решения».

Рассмотрим состав и назначение основных вкладок «калькулятора»:

  1. Data – вкладка содержит данные котировок анализируемых акций (или других финансовых инструментов, рис. 4). В данную вкладку вносятся значения 18 последних месяцев. Количество строк определено пользователем, по результатам тестов период расчета в 18 единиц показался оптимальным;
  2. Profitable – расчетная вкладка, где рассчитываются доходности за каждый период для каждого инструмента.
  3. CovMatrix – ковариационная матрица каждой возможной пары инструментов. При пересчете данной вкладки придется подождать;
  4. Params – сердце расчетной системы. Здесь происходит основная настройка параметров.
  5. Groups – состав индексов, какие акции относятся к каким индексам.

Внешний вид вкладки «Data»
Рис. 4.  Внешний вид вкладки «Data»

Детально остановимся на рассмотрении вкладки «Params» (рис. 5)
Часть вкладки «Params» (ее полная ширина не вмещается на экран)

Рис. 5.  Часть вкладки «Params» (ее полная ширина не вмещается на экран)

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

  • размер портфеля;
  • плановая доходность за период (в данном случае за месяц). На рисунке установлено значение «0,035», что значит доходность 3,5% за месяц;
  • размер для лота каждого инструмента;
  • доля участия каждого инструмента;
  • минимальная и максимальная доли участия индексов в портфеле.

После настройки запускаем поиск решения (Главное меню – Данные – Анализ – Поиск решения, рис. 6) и просим много уважаемый компьютер найти решение.
Окошко поиска решений с параметрами портфельной модели

Рис. 6.  Окошко поиска решений с параметрами портфельной модели

Повторяем операцию до тех пор, пока результат расчета не удовлетворит требования исследователя.

Скачать файл последней версии «калькулятора» и ознакомится с ним можно в группе vk – https://vk.com/family_trust, раздел «Документы».

Запуск системы на реальном счету начнется с января 2019 г. За результатами работы проекта можно также следить через сервис управления портфелем: https://portfolio.conomy.ru/portfolios/3223.
Спасибо за внимание.









★2
31 комментарий
нет форвардного теста
avatar
ves2010, результаты работы модели (рис. 2 и 3), по своей сути, есть результат форвардного тестирования. За базу расчета портфеля брались 18 месяцев, а результат работы портфеля в следующие 1, 2 и 3 месяцы как накопительный итог отражены на графиках.
avatar
Из ссылки на группу в VK, запятую в конце уберите. 
avatar
Гражданин РФ, поправлено
avatar
Не очень понятно из вашего объяснения, но есть подозрение, что ваши расчеты априори некорректны. 
За сколько периодов вы берёте данные и для скольких акций считаете ковариационный матрицу?
avatar
Михаил, Период тестирования модели начиная с 2000 г. В анализе участвовали 76 акций (естественно что не все имеют такую историю, поэтому считалось исходя из того что есть). Ковариационная матрица, соответственно, считалась для каждого анализируемого месяца. Компуктер, мягко говоря, превратился в отопительный агрегат, ему предстояла работа не на одни сутки.
avatar

Иван Усенков, все равно не очень понял. Вы считали ковариация для 76 акций. Сколько периодов данных было использовано для ее расчета? Из текста и скриншотов я понял, что 18? Так это или нет?

Если так то вы получаете заведомо сингулярную матрицу — то есть полную фигню (якобы можно создать портфель с нулевым риском). И вообще при оценке ковариационной матрицы для 76 активов грубо говоря оценивается 76 * 75 / 2 ~ 3000 параметров. Чтобы получить хоть в каком-то смысле разумную статистическую оценку нужно использовать выборку их десятков тысяч предыдущих значений. В большинстве случаев таких данных просто нет, поэтому прямую оценку ковариационной матрицы никто не использует при анализе больших портфелей.

Обычно используют методы оценки на основе сжатия к ковариционной матрице с малым числом оцениваемых параметров. Наиболее известный подход та или иная модификация сжатия Ledoit-Wolf
en.wikipedia.org/wiki/Estimation_of_covariance_matrices#cite_ref-Ledoit_and_Wolf_(2004b)_10-0
scikit-learn.org/stable/modules/covariance.html
www.ledoit.net/honey.pdf

avatar
Михаил, допустим анализируемая дата 1.01.2002, предшествующие этой дате 18 месяцев идут в анализ, для этой даты считается ковариационная матрица и остальные показатели. Затем чтобы получить оценку собранный портфель применялся к последующим трем месяцам (т.е. 1.02.2002, 1.03.2002 и 1.04.2002), результаты запоминали. Затем переходим на следующий месяц, это 1.02.2002 и повторяем алгоритм расчетов а оценку накапливаем. По итогу получаем оценку алгоритма подбора портфеля в виде его эффективности на 1, 2 и 3 месяцы после формирования. (p.s. у меня конечно с языком-пояснения большие проблемы, но я стараюсь).
avatar
Иван Усенков, так не делают. Нельзя по 18 месяцам оценить ковариационную матрицу для 76 акций — у вас данных меньше чем оцениваемых элементов матрицы. Она получится вырожденной. 
avatar
Михаил, но ведь в матрице считается связь между парами и применяется только для рассчитываемой даты. Затем пересчитывается с каждым следующим шагом. Или может чего-то не понимаю?
avatar
Иван Усенков, не обижайтесь, но думаю, что вы не очень разбираетесь в статистике. 
Ковариация определяет взаимодействие между парами, но пар для 76 акций 76*75 / 2 — несколько тысяч. Чтобы получить “достоверную” оценку такого количества парных ковариация нужно очень много данные за десятки тысяч периодов, а не за 18. Иначе вы получите просто случайный  “мусор”. Более того, если периодов меньше количества Акции, то полученная матрица будет сингулярной (совсем бессмысленной).
avatar
Михаил, «18» — это размер периода в месяцах для которого рассчитывается матрица. Таких матриц по результатам расчета получилось около 200 (т.е. для каждого месяца), в каждой по 3000 пар значений (примерно, зависит от участка времени, ближе к 2000-ым годам немного меньше).
avatar
Иван Усенков, если вы строите матрицу по 18 месяцев вы получаете абсолютно бессмысленную сингулярную ковариационную матрицу. И делаете это 200 раз. Чтобы получать осмысленный результат нужно при каждой оценке использовать больше данных, или применять специальные методы, которые позволяют получить более разумную оценку при малом количестве данных.
avatar
Михаил, сколько взять чтобы было объективней?
avatar
Иван Усенков, это очень непростой вопрос — сильно зависит от данных. Обычно рекомендация, данных должно быть больше количества оцениваемых параметров раз в 10 самый минимум. То есть в вашем случае таких данных просто нет. Поэтому необходимо использовать специальные методы оценки ковариационный матрицы. Ссылки на давал выше, но наиболее применимый для акций описан в работе http://www.ledoit.net/honey.pdf
avatar
Иван Усенков, второй путь — различные методы понижения размерности. Использование факторных моделей или метода главных компонент. Часто в практике используют 3—5 факторов на основе 60 месячных значений. 
avatar
Михаил, а что подразумевается под «параметрами» для которых рассчитывается количество анализируемых данных?
avatar
Иван Усенков, вы считаете матрицу — размером 76x76 вам нужно оценить все клеточки этой матрицы. Так как она симметрична относительно диагонали вы хотите оценить примерно половину от них, а точнее 76 дисперсий и 76*75/2 ковариации — несколько тысяч. 
avatar
Иван Усенков, Например, сжатие Ledoit-Wolf будет использует целевую матрицу с количеством параметров — количество акций+1. Если данных мало, то будут оцениваться очень мало параметров, по мере роста количества данных количество оцениваемых параметров будут расти асимптотически оптимальным способом.
avatar
Михаил, на протяжении всего разговора с вами у меня складывается мнение, что мы просто друг друга не понимаем. Давайте так, если вам нужно составить портфель на сегодняшний день имея 100 000 руб., что вы предпримете:
1. Посчитаете доходность каждой бумаги
2. риск каждой бумаги
3. затем из имеющихся данных о количестве бумаг составите матрицу
4. запустите алгоритм который найдет минимальное значение от перемноженной матрицы на два вектора частей портфеля (корень этого числа будет риск портфеля) при максимальном результирующем доходе. Так?
avatar
Иван Усенков, если действовать в рамках mean-variance оптимизации, то да. Тут ключевой вопрос откуда вы возьмёте доходности бумаг, откуда риски бумаг. Эти параметры неизвестны. Их можно неким образом оценить, например, на основе истории. Проблема, что такие оценки не точные (имеют широкие доверительные интервалы), поэтому нужно нужно использовать очень специальные методы для получения сколько-нибудь разумных оценок. 
avatar
Михаил, посмотрел вашу деятельность на сайте, вы тоже в этой теме копаетесь?
avatar
Иван Усенков, я в университете специализировался по этому вопросу и 20 лет изучаю тему, прочитал тонны академических статей по данному вопросу и книжек. Если вы хотите узнать почему так как вы делать нельзя и как делать нужно — очень хороший обзор методов оптимизации портфеля в книге https://www.amazon.com/Robust-Portfolio-Optimization-Management-Fabozzi/dp/047192122X
avatar
Иван Усенков, посчитайте доверительные интервалы для своих доходностей и ковариационный матриц и вы поймёте, что они абсолютно недостоверны. 
avatar
Михаил, удалось ли вам получить «устойчивый» механизм для оптимизации портфеля? используете на деле свои наработки?
(p.s. тоже работал в вузе, как научный сотрудник, специализировался на разработке биометрических моделей)
avatar
Иван Усенков, моих наработок тут мало — в основном заимствования из статей и книг на данную тематику. На деле управляю своим портфелем около 40 млн. рублей.
Актуальный код https://github.com/WLM1ke/poptimizer
avatar
Михаил, почему на питоне?
avatar
Иван Усенков, а почему нет?
avatar
Иван Усенков, неплохая вводная лекция в проблему https://www.coursera.org/lecture/financial-engineering-2/implementation-difficulties-with-mean-variance-0m4xq
avatar
Михаил, сам прослушал — собственно все, что там сказано я и использую сжатие Ledoit-Wolf для улучшения оценок, worst case optimization для повышения стабильности, прогнозирование на основе близости данных. Плюс еще идея статистической неразличимости близких портфелей. 
avatar
Михаил, понял, спасибо.
avatar

теги блога Иван Усенков

....все тэги



UPDONW
Новый дизайн