Иван Усенков
Иван Усенков личный блог
30 декабря 2018, 16:40

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

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

  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.
Спасибо за внимание.









31 Комментарий
  • ves2010
    30 декабря 2018, 16:58
    нет форвардного теста
  • Гражданин РФ
    30 декабря 2018, 17:56
    Из ссылки на группу в VK, запятую в конце уберите. 
  • Михаил
    01 января 2019, 20:35
    Не очень понятно из вашего объяснения, но есть подозрение, что ваши расчеты априори некорректны. 
    За сколько периодов вы берёте данные и для скольких акций считаете ковариационный матрицу?
      • Михаил
        01 января 2019, 21:30

        Иван Усенков, все равно не очень понял. Вы считали ковариация для 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

          • Михаил
            01 января 2019, 21:44
            Иван Усенков, так не делают. Нельзя по 18 месяцам оценить ковариационную матрицу для 76 акций — у вас данных меньше чем оцениваемых элементов матрицы. Она получится вырожденной. 
  • Михаил
    01 января 2019, 22:01
    Иван Усенков, не обижайтесь, но думаю, что вы не очень разбираетесь в статистике. 
    Ковариация определяет взаимодействие между парами, но пар для 76 акций 76*75 / 2 — несколько тысяч. Чтобы получить “достоверную” оценку такого количества парных ковариация нужно очень много данные за десятки тысяч периодов, а не за 18. Иначе вы получите просто случайный  “мусор”. Более того, если периодов меньше количества Акции, то полученная матрица будет сингулярной (совсем бессмысленной).
      • Михаил
        01 января 2019, 22:33
        Иван Усенков, если вы строите матрицу по 18 месяцев вы получаете абсолютно бессмысленную сингулярную ковариационную матрицу. И делаете это 200 раз. Чтобы получать осмысленный результат нужно при каждой оценке использовать больше данных, или применять специальные методы, которые позволяют получить более разумную оценку при малом количестве данных.
          • Михаил
            01 января 2019, 23:30
            Иван Усенков, это очень непростой вопрос — сильно зависит от данных. Обычно рекомендация, данных должно быть больше количества оцениваемых параметров раз в 10 самый минимум. То есть в вашем случае таких данных просто нет. Поэтому необходимо использовать специальные методы оценки ковариационный матрицы. Ссылки на давал выше, но наиболее применимый для акций описан в работе http://www.ledoit.net/honey.pdf
          • Михаил
            01 января 2019, 23:34
            Иван Усенков, второй путь — различные методы понижения размерности. Использование факторных моделей или метода главных компонент. Часто в практике используют 3—5 факторов на основе 60 месячных значений. 
              • Михаил
                02 января 2019, 00:38
                Иван Усенков, вы считаете матрицу — размером 76x76 вам нужно оценить все клеточки этой матрицы. Так как она симметрична относительно диагонали вы хотите оценить примерно половину от них, а точнее 76 дисперсий и 76*75/2 ковариации — несколько тысяч. 
              • Михаил
                02 января 2019, 00:38
                Иван Усенков, Например, сжатие Ledoit-Wolf будет использует целевую матрицу с количеством параметров — количество акций+1. Если данных мало, то будут оцениваться очень мало параметров, по мере роста количества данных количество оцениваемых параметров будут расти асимптотически оптимальным способом.
                  • Михаил
                    02 января 2019, 00:57
                    Иван Усенков, если действовать в рамках mean-variance оптимизации, то да. Тут ключевой вопрос откуда вы возьмёте доходности бумаг, откуда риски бумаг. Эти параметры неизвестны. Их можно неким образом оценить, например, на основе истории. Проблема, что такие оценки не точные (имеют широкие доверительные интервалы), поэтому нужно нужно использовать очень специальные методы для получения сколько-нибудь разумных оценок. 
                      • Михаил
                        02 января 2019, 01:16
                        Иван Усенков, я в университете специализировался по этому вопросу и 20 лет изучаю тему, прочитал тонны академических статей по данному вопросу и книжек. Если вы хотите узнать почему так как вы делать нельзя и как делать нужно — очень хороший обзор методов оптимизации портфеля в книге https://www.amazon.com/Robust-Portfolio-Optimization-Management-Fabozzi/dp/047192122X
                  • Михаил
                    02 января 2019, 00:58
                    Иван Усенков, посчитайте доверительные интервалы для своих доходностей и ковариационный матриц и вы поймёте, что они абсолютно недостоверны. 
                      • Михаил
                        02 января 2019, 11:16
                        Иван Усенков, моих наработок тут мало — в основном заимствования из статей и книг на данную тематику. На деле управляю своим портфелем около 40 млн. рублей.
                        Актуальный код https://github.com/WLM1ke/poptimizer
                          • Михаил
                            02 января 2019, 11:36
                            Иван Усенков, а почему нет?
                      • Михаил
                        02 января 2019, 11:32
                        Иван Усенков, неплохая вводная лекция в проблему https://www.coursera.org/lecture/financial-engineering-2/implementation-difficulties-with-mean-variance-0m4xq
                        • Михаил
                          02 января 2019, 12:02
                          Михаил, сам прослушал — собственно все, что там сказано я и использую сжатие Ledoit-Wolf для улучшения оценок, worst case optimization для повышения стабильности, прогнозирование на основе близости данных. Плюс еще идея статистической неразличимости близких портфелей. 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн