Главная Софт Анализ данных Видеоурок по MATLAB - Оптимальный портфель c ограничениями на короткие продажи
Видеоурок по MATLAB - Оптимальный портфель c ограничениями на короткие продажи
13.01.2011 11:13

Формула оптимального портфеля без ограничений на структуру весов и размер рычагов – очень элегантная и очень простая математическая конструкция, учитывая сложность самой проблемы. Однако на практике, при оптимизации инвестиционного портфеля приходится сталкиваться с целым рядом ограничений. Это могут быть институциональные лимиты на размер финансового рычага (нормы по марже, ГО) или его знак – запрет «коротких продаж» или стилистические правила: инвестор может потребовать у управляющего, напр., чтобы не меньше половины средств было вложено в такой-то класс активов и т.п. В таких ситуациях оптимизацию портфеля невозможно свести к какой-либо простой формуле как в случае полного отсутствия ограничений. Здесь требуется использование специальных программных средств, выполняющих численную оптимизацию портфеля.


В этом уроке мы рассмотрим возможности портфельной оптимизации в MATLAB в условиях ограничений при помощи функции quadprog(). С математической точки зрения эта функция решает проблему т.н. «квадратичного программирования» – именно к ней можно свести в общем случае задачу портфельной оптимизации. Функция quadprog() при помощи специальных алгоритмов перебирает значения весов, чтобы при данных ограничениях был достигнут максимум роста капитала. Данный урок является полностью самостоятельным материалом, однако читателю также настоятельно рекомендуется ознакомиться и с предыдущим уроком, посвященным оптимальному портфелю без ограничений на короткие продажи и т.п. Интересно также сравнить результаты обоих уроков, поскольку в них используются одни и те же активы.


Для примера рассмотрим портфель российских «голубых фишек» из индекса ММВБ10, а именно:

  • Газпром (GAZP)

  • Норникель (GMKN)

  • Лукойл (LKOH)

  • Роснефть (ROSN)

  • Сбербанк (SBER)

  • Сургутнефтегаз (SNGS)

  • ВТБ (VTBR)


В 2009 году ММВБ10 дважды менял структуру активов. Неизменными в течение года были 8 акций. Префы Сбербанка были исключены по причине очень сильной корреляции с обыкновенными акциями СБ. Итого осталось 7 акций. Файл с котировками этих инструментов за 2009 год можно скачать в конце урока. Для простоты будем искать оптимальный портфель фьючерсов на эти активы. В таком случае можно воспользоваться концепцией безрисковой ставки. Это подразумеваемая участниками фьючерсного рынка усредненная процентная ставка, близкая к ставке рефинансирования. Для того периода достаточно реалистичной будет цифра 10% годовых. Мы рассмотрим два варианта ограничений: запрет коротких продаж и лимиты на размер рычагов.


(Рекомендуется смотреть в полноэкранном режиме)


Комментарии


Основные выражения из командной строки:

  • p=price2ret(P);

  • g=(exp(mean(p)'*248)-1)*100

  • s=std(p)*248^0.5;

  • m=mean(p)*248+s.^2/2;

  • C=corr(p);

  • K=corr2cov(s,C);

  • w2=quadprog(K,r-m,[],[],[],[],zeros(7,1),ones(7,1)*2)

  • s1=sqrt(w1'*K*w1)

  • g1=(exp((m-r)*w1-w1'*K*w1/2)-1)*100


В этом видеоуроке использовались следующие функции:

  • price2ret() – конвертирует цены в доходности;

  • std() – стандартное отклонение/волатильность;

  • mean() – среднее значение;

  • corr() – корреляция;

  • corr2cov() – конвертирует стандартные отклонения и корреляции в ковариации;

  • quadprog() – квадратичный оптимизатор;

  • zeros(n,m) – матрица нулей размерности n х m;

  • ones(n,m) – матрица единиц размерности n х m;

  • plot() – строит график по табличным значениям;

  • cumsum() – накопленная сумма;

  • exp() – экспонента.


Рассмотрим более подробно конструкцию функции quadprog(), поскольку она – сердце этого урока. В полном виде она выглядит следующим образом:

quadprog(K,r-m,A,b,Aeq,beq,lb,ub).

K – матрица ковариаций активов; r – безрисковая ставка; m – вектор доходностей; A и b – ограничения вида «вложить не меньше n% в такие-то активы»; Aeq и beq – ограничения вида «вложить ровно столько-то в такие-то активы», сформулированные в матричной форме, lb и ub – нижняя и верхняя границы для весов (рычагов) портфеля. Чтобы запретить короткие продажи, мы задали lb=0 для всех активов. Чтобы не вводить 7 нулей вручную, использовалась функция zeros(7,1). Аналогичным образом для указания верхнего лимита 2 мы применили функцию ones(7,1)*2. При необходимости можно задавать и ограничения вида вложить не меньше, скажем, 50% в Газпром. Для простоты рассмотрим портфель из 3 акций, первая по порядку GAZP. Тогда в матричной форме это можно записать так:

A = [1 0 0; 0 0 0; 0 0 0], b = [0.5 0 0].

В итоге выражение будет выглядеть:

quadprog(K,r-m,-A,-b,[],[],lb,ub).

Знак минус перед A и b необходим, поскольку функция quadprog() по умолчанию настроена на ограничения вида «не больше чем». Аналогичным образом в матричной форме можно задать и ограничения равенства весов каким-то целевым значениям. В этом случае, естественно, знак минуса перед Aeq и beq ставить не надо.


Из урока мы узнали, что при запрете коротких продаж и отсутствии лимитов на размер рычагов (весов) из портфеля могут быть выкинуты некоторые активы. В данном конкретном случае обнулились веса даже по всем акциям, кроме Сбербанка. Это объясняется очень сильной корреляцией между отечественными фишками. Эта корреляция приводит к тому, что выгоднее продать слабые активы для создания хеджа сильным, при этом волатильность снижается больше, чем доходность, можно агрессивнее задействовать финансовый рычаг, и в итоге получить больший рост при том же уровне риска. Если же короткие продажи по тем или иным причинам неприемлемы, то не остается ничего другого как вообще выкинуть слабые активы (с низким отношением Шарпа) из портфеля. Полученный оптимальный портфель будет содержать только длинные позиции. Он будет давать максимальный рост при любом уровне волатильности, который можно регулировать, снижая совокупный рычаг портфеля. Однако ситуация меняется, если есть существенные ограничения на размер маржи, как было показано на шаге №4. В этом случае следует указывать верхние границы весов портфеля. Если какие-то из них оказываются ниже, чем у портфеля без лимитов на размер рычагов, часть выброшенных активов может «реабилитироваться». Их включение в портфель может увеличить потенциальный рост, но достигается это не бесплатно – увеличивается и волатильность. Следует отметить, что оптимальный портфель без лимитов на размер рычагов при той же волатильности дал бы больший рост, в чем мы убедились в конце урока, но его использование в данной ситуации невозможно, поскольку его веса превышают эти лимиты.



© q-trader

[обсудить на форуме]


 

Комментарии  

 
0 # extybr 14.01.2011 01:04
Спасибо за урок. Очень много полезного, но не могу разобраться: почему степень 0.5? (s=std(p)*248^0.5). Я слаб в программировани и, но интересно, что значит точка после символа s
(m=mean(p)*248+s.^2/2;), и что значат степень и делитель?
Ответить | Ответить с цитатой | Цитировать
 
 
0 # q-trader 14.01.2011 14:34
Степень 0.5 значит корень из числа. Вот этой строчкой: std(p)*248^0.5 переводим волатильности в годовой базис. Собственно, это не является необходимым, но так привычнее (лично мне) для восприятия.

m=mean(p)*248+s.^2/2
Этой командой находим "мгновенный коэфициент сноса" (drift rate). Это арифметический средний рост. Эта математичка произрастает из модели броуновского движения, которая, напр., используется в моделях ценообразования опционов. Когда имеем дело с выборочными данными математически так уж получается, что чтобы найти мгновенный коэфициент сноса нужно: 1) работать с логдоходностями ; 2) к средней логдоходности еще прибавлять половину дисперсии (s^2/2).

Точка после s это на самом деле точка перед знаком степени ^ Это уже особенность синтаксиса матлаба. Матлаб по умолчанию все операции выполняет как матричные. В данном случае если бы не стояла точка он бы пытался вектор волатильностей возвести в степень по матричным правилам а нам надо было просто каждую волатильность возвести в квадрат. Знак точки перед оператором ^ или * говорит матлабу что нужно действия выполнять поэлементно
Ответить | Ответить с цитатой | Цитировать
 
 
0 # riskovik 14.01.2011 14:44
А что означают вот эти штуки - [] в функции?
Ответить | Ответить с цитатой | Цитировать
 
 
0 # q-trader 14.01.2011 15:46
Это пустые квадратные скобки. Тут шрифтом не очень понятно отображается - пробел маленький. В матлабе они выглядят примерно так [ ]. Это знак пустой матрицы. В данном случае он означает, что некоторые входные переменные в функции надо пропустить
Ответить | Ответить с цитатой | Цитировать
 
 
0 # Николай 31.03.2011 20:50
Подскажите кто может, как работает функция price2ret Почему у меня 0,6931 возвращается? По идее 1 должна быть, или я не прав? Помогите, плииз...
>> A=[1.0000;2.0000;];
>> p=price2ret(A)
p =

0.6931
Ответить | Ответить с цитатой | Цитировать
 
 
0 # q-trader 31.03.2011 21:32
Здравствуйте, Николай. Дело в том, что она по умолчанию считает логдоходности. Чтобы вычислить обычные доходности надо писать так:
price2ret(A,[], 'Periodic')
Ответить | Ответить с цитатой | Цитировать
 
 
0 # Николай 01.04.2011 00:12
Спасибо за пояснения. А как на практике применять финансовый рычаг? Хотелось бы поподробнее. В теории все понятно и достаточно интересно. Еще раз благодарю за материал, супер!
Ответить | Ответить с цитатой | Цитировать
 
 
0 # q-trader 01.04.2011 13:18
Это не так уж и сложно. Нужно мониторить состояние счета на предмет текущего рычага. Для этого его нужно уметь рассчитывать. Это довольно просто. Некоторые примеры рассчета можно найти в материалах по управлению капиталом в разделе "Статьи". Общий смысл таков. Когда цена растет - текущий рычаг падает. Это значит, что нужно увеличить размер открытой позиции. Когда цена пдает - рычаг наоборот увеличивается. Надо продать часть активов. Действуя таким образом, можно удерживать текущее значение финансвого рычага в близи выбранного фиксированного значения. При таком ММ достигается максимальный долгосрочный рост капитала
Ответить | Ответить с цитатой | Цитировать
 
 
0 # Николай 01.04.2011 16:57
Да, это понятно. Только растет она или падает практически всегда, и поддерживать постоянство рычага в идеале необходимо при каждом тике. Но ведь это нереально. Отсюда вопрос. А как определить этот порог цены, когда необходимо докупаться или продаваться с целю достичь выбранного значения рычага. Ну вот, например, самый самый упрощенный вариант, опуская ньюансы. Допустим возьмем форекс. Курс евро 1.4 Собственных средств 140 000. Заемных средств у дилинга взяли еще 140 000. Итого купили два лота на 280 000. Рычаг в этом случае будет равен 2 (280 000/140 000). Далее курс вырос, и активы составили 420 000. Понятно, что надо докупить, чтобы рычаг был равен 2, т.е. до 210 000 (420 000/2). Следовательно, докупаемся на 70 000 (210 000-140 000). Итого получили активов 420 000 и собственных средств 210 0000. Тут утром проснулись, курс упал и активов стало 200 000. Что делать? Продавать? Хорошо, продадим 110 000 до установленного рычага. Активов станет 200 000 и собственых средств 100 000. Так вот, вопрос, а как часто надо покупать и продавать? Поясните подробнее...
Ответить | Ответить с цитатой | Цитировать
 
 
0 # q-trader 08.04.2011 20:15
Это доволбно сложный вопрос. Отвечу потом - в отдельной статье на эту тему
Ответить | Ответить с цитатой | Цитировать
 
 
0 # Николай 01.04.2011 17:08
Да, спасибо за формулу. Все работает. Если возникнут вопросы по матлабу буду обращаться, не откажите...
Ответить | Ответить с цитатой | Цитировать
 
 
0 # q-trader 01.04.2011 21:24
Конечно. Всегда рад пообщаться на эту тему
Ответить | Ответить с цитатой | Цитировать
 

Добавить комментарий


Защитный код
Обновить



© 2010–2012. Все права защищены.
Копирование материалов, размещенных на сайте, разрешается только с рабочей ссылкой на источник.



| О проекте |  Правовая информация |
|  Напишите нам |  Карта сайта |



  

 Новости
главные новости экономики и финансовых рынков: события, мнения, прогнозы.

 Статьи
материалы по теханализу, фундаментальному анализу, управлению капиталом (манименеджмент) и др.

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

 Калькуляторы
xls-калькуляторы для оптимизации размера и структуры торговой позиции; опционные калькуляторы.

 Софт
торговые терминалы, программы для теханализа, оптимизации систем и др.: статьи, обзоры, видеоуроки.

 Архив котировок
индексы, валюты, сырье: многолетние истории котировок в форматах .xls и .txt.

 Индикаторы
ºSiX – индикатор настроения рынка на основе расчета соотношения количества опционных контрактов put и call.

 Библиотека
собрание книг, которые рекомендуется прочесть каждому трейдеру в первую очередь.

 Словарь
толкование основных экономических, финансовых терминов, трейдерский сленг.

 Форум
обсуждение материалов сайта и любых вопросов трейдинга и инвестирования.