Программа оптимизации рискового портфеля

Введение.



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



Постановка задачи.



Рассмотрим общую задачу распределения капитала, который участник рынка хочет потратить на покупку ценных бумаг, по различным видам ценных бумаг. Предваряя точные математические постановки, констатируем очевидную общую цель инвестора – вложить деньги так, чтобы сохранить свой капитал, а при возможности и нарастить его.

Набор ценных бумаг, находящихся у участника рынка, называется его портфелем. Стоимость портфеля – это суммарная стоимость всех составляющих его бумаг. Если сегодня его стоимость есть  Р  , а через год она окажется равной  Р , то (Р-Р)/Р естественно назвать доходностью портфеля в процентах годовых. Т.е. доходность портфеля – это доходность на единицу его стоимости.

Пусть хi – доля капитала, потраченная на покупку ценных бумаг i-го вида. Рассуждения о долях эквивалентны тому, что весь выделенный капитал принимается за единицу. Пусть di – доходность в процентах годовых ценных бумаг i-го вида в расчете на одну денежную единицу. 

Найдем доходность всего портфеля dp. С одной стороны, через год капитал портфеля будет равен 1+ dp, с другой -  стоимость бумаг i-го вида увеличиться с х до xi + di*xi, так что суммарная стоимость портфеля будет равна xi + xi*di = 1 + xi*di. Приравнивая оба выражения для стоимости портфеля, получаем dp = xi*di.

Итак, задача увеличения капитала портфеля эквивалентна аналогичной задаче о доходности портфеля, выраженной через доходности бумаг и их доли.

Как правило, доходность бумаг колеблется во времени, так что будем считать ее случайной величиной. Пусть mi,i – средняя ожидаемая доходность и среднее квадратическое отклонение (СКО) этой случайной доходности, т.е. mi=M[di] -  математическое ожидание доходности и ri=Vii, где Vii – вариация или дисперсия i-ой доходности. Будем называть mi, ri соответственно эффективностью и риском i-ой ценной бумаги. Через Vij обозначим ковариацию  доходностей  ценных бумаг i-го и j-го вида (или корреляционный момент Kij).

Так как доходность составляющих портфель ценных бумаг случайна, то и доходность портфеля есть также случайная величина. Математическте ожидание доходности  портфеля есть M[dp]=x1*M[d1]+…+xn*M[dn]=xi*mi  обозначим его через mp. Дисперсия доходности портфеля есть D[dp]=xi*xj*Vij. Так же, как и для ценных бумаг, назовем mp эффективностью портфеля, а величину p=D[dp] – риском портфеля rp. Обычно дисперсия доходности портфеля называется его вариацией Vp.

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



Портфель Марковица минимального риска.



Существует несколько вариантов задач оптимизации рискового портфеля. Мы рассмотрим только одну. Это так называемый «портфель Марковица». Эта задача была сформулирована и решена американским экономистом Г. Марковицем (H. Markovitz) в 1952 году , за что позднее он получил нобелевскую премию. 

Пусть имеются n видов  ценных бумаг, из которых инвестор хочет сформировать портфель. Необходимо найти xi, минимизирующие вариацию портфеля

Vp= xi*xj*Vij



при условии, что обеспечивается заданное значение эффективности портфеля mp, т.е. xi*mi=mp.

Поскольку xi – доли, то в сумме они должны составлять единицу: xi=1.

Оставив за инвестором выбор средней эффективности портфеля и помогая ему минимизировать в этом случае неопределенность, получаем следующую задачу по оптимизации портфеля ценных бумаг:



min  xi*xj*Vij

xi=1      

mi*xi=mp

xi≥0,…,xn≥0



Это задача квадратичного программирования. Опустив условия неотрицательности переменных, получаем собственно задачу Марковица.







Решение.



С помощью функции Лагранжа сведем задачу на условный экстремум к задаче на безусловный экстремум:



L(x1,…,xn,,)=  Vij*xi*xj - *(mi –1) - *(mi*xi – mp),



	L/xs=2*Vis*xi -  - *ms=0,  s=1,…,n.	(*)



производные по ,  воспроизводят указанные выше два соотношения, тем самым для (n+2) переменных x1,…,xn, ,  получаем (n+2) уравнения.

Запишем полученные уравнения в матричной форме, используя следующие обозначения:



					1	x1		m1

							e=	.   	x=	.	m=		.	x=(x1,…,xn),    m=(m1,…,mn)

					.	.		.

					1	xn		mn

			

Штрих применяется для обозначения операции транспонирования матрицы. 

B- матрица ковариаций, B-1 – обратная ей матрица. Следовательно уравнения (*) примут вид:

B*x = (/2)*e + (/2)*m,

e*x = 1,

m*x = mp.



Основное допущение этой модели состоит в том, что между эффективностями m1,…,mn нет линейной связи, поэтому ковариационная матрица B невырождена (|B|<>0), следовательно, существует обратная матрица В-1. Используя этот факт разрешим в матричной форме относительно х:

	х = (/2)*В-1*е + (/2)* В-1*m,                                 (**)



подставив это решение в первое и второе условия, получим два уравнения для определения /2 и /2:



(е*В-1*е)*/2 + (е*В-1*m)*/2 =1

(m*B-1*e)*/2 + (m*В-1*m)*/2 =mp.



Решая два последних уравнения по правилу Крамера, находим

/2 = ((m*В-1*m)-mp*(е*В-1*m))/((е*В-1*е)*(m*В-1*m)-(m*B-1*e)2)

/2 =  (mp*(е*В-1*е)-(m*B-1*e))/((е*В-1*е)*(m*В-1*m)-(m*B-1*e)2)



Подставляя это решение в (**) получаем следующую структуру оптимального портфеля:



       [(m*В-1*m)-mp*(е*В-1*m)]*В-1*е + [mp*(е*В-1*е) - (m*B-1*e)]*В-1*m

x* =

                                  (е*В-1*е)*(m*В-1*m) - (m*B-1*e)2



Простой подстановкой убеждаемся, что е*х*=1 и m*х*=mp.

Кроме того, находим минимальную дисперсию, соответствующую оптимальной структуре:



                     [m2p*(е*В-1*е) – 2*mp*(m*B-1*e) + (m*В-1*m)]

D*p=

                             [(е*В-1*е)*(m*В-1*m) - (m*B-1*e)2]



Тогда *p= D*p, что и является минимальным риском портфеля.

Если x*i≥0, то это означает рекомендацию вложить долю x*i наличного капитала в ценные бумаги i-го вида. Если же x*i<0, то содержательно это означает провести операцию “short sale” (“короткая продажа”). 

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

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



Пример.



Дано: m1=11, 1=4, m2=10, 2=3, m3=9, 3=1,  ценные бумаги не коррелированы. Определить оптимальный портфель при mp=10.

Ответ: Доли ценных  бумаг x1=0,3396; x2=0,3208; x3=0,3396.  Минимальный  риск p=1,699. Эффект диверсификации портфеля наглядно виден на данном примере. Портфель имеет такую же эффективность, как если бы он был составлен только из бумаг 2-го вида, но его риск значительно меньше, чем у бумаг 2-го вида (1,699 < 3).



Программа.



Далее приведена программа, которая рассчитывает структуру портфеля при заданной эффективности и его минимальный риск.



program riski;

uses crt;

type mas=array[1..10] of real;

     mas2=array[1..10,1..10] of real;

var a:real;

     m,be,bm:mas;

     B,E,b1,e1:mas2;

     i,k,c,v,l,j,n:integer;

     mp,ebe,mbm,ebm,x,mbe:real;



 procedure base;

     begin

       for i:=1 to n do        {обращение матрицы B}

       begin

           for c:=1 to n do            {дублирование матриц}

             begin

               for v:=1 to n do

                 begin

                 B1[c,v]:=B[c,v];

                 e1[c,v]:=e[c,v];

                 end;

             end;

         for k:=1 to n do

           begin

             B[i,k]:=B1[i,k]/b1[i,i];         {делим строки на разрешающий элемент}

             E[i,k]:=E1[i,k]/b1[i,i];for l:=1 to n do

               begin                 {находим остальные элементы}

                if l<>i then

                  begin

                    B[l,k]:=(B1[l,k]-(B1[l,i]*B1[i,k]/B1[i,i]));

                    E[l,k]:=(E1[l,k]-(B1[l,i]*E1[i,k]/B1[i,i]));

                  end;

               end;

           end;

      end;



      for i:=1 to n do    {суммирование по строкам, формирование вектора-столбца Be}

      begin

         for j:=1 to n do

           begin

             be[i]:=be[i]+e[i,j];

           end;

      end;



      for i:=1 to n do     {формирование вектора-столбца Bm}

      begin

        for j:=1 to n do

        begin

          Bm[i]:=Bm[i]+m[j]*e[i,j];

        end;

      end;



      for i:=1 to n do

      begin                 {нахождение констант}

        ebe:=ebe+be[i];  {суммирование по стоблцу}

        ebm:=ebm+bm[i];

        mbm:=mbm+m[i]*bm[i];

        mbe:=mbe+m[i]*be[i];

      end;

      end;

 procedure vvod ;

      label out1, out2, out3, out4, out5;

      var z:real; mi,ma:real;

   begin

      writeln;

      writeln('                        КУРСОВОЙ ПРОЕКТ');

      writeln;

      writeln;

      writeln(' ПО ДИСЦИПЛИНЕ МАТЕМАТИЧЕСКИЕ МЕТОДЫ ФИНАНСОВО-ЭКОНОМИЧЕСКОГО АНАЛИЗА');

      writeln;

      writeln('    АВТОР:  БОЛДИН СЕРГЕЙ, ФИНМЕН II-3.');

      writeln;

      writeln('    ТЕМА:   ЗАДАЧА ОПТИМИЗАЦИИ РИСКОВОГО ПОРТФЕЛЯ.');

      writeln;

      writeln;

      writeln;

      out1:

      writeln;

      writeln('  Введите количество видов ценных бумаг, из которых вы хотите ');

      write('     сформировать портфель (не более 10):  ');

      readln(n);

      if (n<=0) or (n<>int(n)) or (n>10) then

      begin

        writeln('  Ошибка ввода! Число должно быть натуральным и меньше 10 ! ');

        goto out1;

      end;

      writeln;



      writeln('  Введите эффективности (доходности) ценных бумаг:');

     for i:=1 to n do

     begin

        E[i,i]:=1;

        out2:

        write(' ',i,'-ого вида :  ');

        readln(m[i]);

        if (m[i]<0) then

        begin

        writeln('  Ошибка ввода! Число должно быть положительным! ');

        goto out2;

        end;

     end;

     writeln;

     writeln('!!! При вводе рисков и совместных вариаций ценных бумаг следует');

     writeln('    быть внимательным, так как программа не расчитана на линейную');

     writeln('    связь доходностей ценных бумаг. Поэтому рекомендуется не вводить');

     writeln('    пропорциональные риски и совместные вариации ценных бумаг!!!');

     writeln;

     writeln('  Введите риск (среднее квадратическое отклонение(СКО)) ценных бумаг: ');

     for i:=1 to n do

     begin

        out3:

        write(' ',i,'-ого вида :  ');

        readln(z);

        if (z<0)  then

        begin

        writeln('  Ошибка ввода! Число должно быть положительным! ');

        goto out3;

        end;

        b[i,i]:=z*z;

     end;



     writeln;

     writeln(' Введите совместную вариацию (корреляционный момент) ценных бумаг.');

     writeln('  Она не должна быть больше произведения СКО этих бумаг.');

        for i:=1 to n do

        begin

        for j:=i+1 to n do        {ввод матрицы ковариаций}

        begin

          out4:

          write(' ',i,'-го и ',j,'-го вида:  ');

          readln(z);

          if  abs(z)>=sqrt(b[i,i])*sqrt(b[j,j]) then

          begin

          writeln('  Ошибка ввода! Число должно быть положительным и меньше произведения СКО этих бумаг! ');

          goto out4;

          end;

          b[i,j]:=z;

          b[j,i]:=z;

          if i<>j then begin E[i,j]:=0; end;

        end;

        end;

        writeln;

        ma:=0;

        for i:=1 to n do

         begin

            if m[i]>ma then ma:=m[i];

         end;

          mi:=100000000;

        for i:=1 to n do

         begin

            if m[i]<mi then mi:=m[i];

         end;

        writeln('  Введите желаемую эффективность портфеля.  ');

        write('  Она должна быть в пределах эффективностей ценных бумаг: ');

        out5:

        readln(mp);

      if (mp<mi) or (mp>ma) then

        begin

        writeln('  Ошибка ввода!');

        write('  Число должно быть в пределах эффективностей ценных бумаг!:  ');

        goto out5;

        end;

      end;





 procedure vivod ;

    begin

      writeln;

      writeln('  Структура портфеля. Доли ценных бумаг.');

      for i:=1 to n do

      begin

        x:=((mbm-mp*ebm)*be[i]+(mp*ebe-mbe)*bm[i])/(ebe*mbm-mbe*mbe);

        writeln(' ',i,'-го вида: ',x:6:5);

        if x<0 then

        begin

        writeln('  Так как доля бумаг ',i,'-го вида отрицательна, то необходимо ');

        writeln('  провести сделку "short sale", исключить бумаги этого вида из портфеля');

        writeln('  и решить задачу заново.');

        end;

      end;

      writeln;

      writeln('  Минимальный риск портфеля:  ',sqrt((mp*mp*ebe-2*mp*mbe+mbm)/(ebe*mbm-mbe*mbe)):6:5);

   end;



begin

     clrscr;

     textcolor(yellow);

     textbackground(blue);

     vvod;

     base;

     vivod;

     readln;

end.





Список литературы:



		Колемаев В.А. Математическая экономика. М.: «Юнити» 1998.

		Малыхин В.И. Финансовая математика.  М.: «Юнити» 2000.