Квадратичное программирование для оптимизации портфеля, основанной на проблеме

В этом примере показано, как решить задачи оптимизации портфеля с помощью подхода, основанного на проблеме. Для основанного на решателе подхода смотрите Квадратичное программирование для Задач оптимизации Портфеля, Основанных на решателе.

Квадратичная модель

Предположим, что портфель содержит$n$ различные активы. Норма прибыли актива$i$ является случайной переменной с ожидаемым значением$m_i$. Проблема состоит в том, чтобы найти, какую часть$x_i$ инвестировать в каждый актив$i$ для того, чтобы минимизировать риск согласно заданной минимальной ожидаемой норме прибыли.

Позвольте$C$ обозначают, что ковариационная матрица уровней актива возвращается.

Классическая модель среднего отклонения состоит из минимизации портфельного риска, как измерено

$$\frac{1}{2}x^T C x$$

подвергните набору ограничений.

Ожидаемый доход должен быть не меньше, чем минимальной ставкой портфеля, возвращают$r$ это желания инвестора,

$$\sum_{i=1}^n m_i \; x_i \ge r,$$

сумма инвестиционных частей $x_i$должна составить в целом в общей сложности один,

$$\sum_{i=1}^n x_i = 1,$$

и, будучи частями (или проценты), они должны быть числами между нулем и один,

$$0 \le x_i \le 1, \;\;\; i = 1 \ldots n.$$

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

Проблема С 225 активами

Давайте теперь решим QP с 225 активами. Набором данных является от ИЛИ-БИБЛИОТЕКИ [Чанг, T.-J., Мид, N., Бизли, J.E. и Sharaiha, Y.M., "Эвристика для кардинальности ограничила оптимизацию портфеля" Computers & Operations Research 27 (2000) 1271-1302].

Мы загружаем набор данных и затем настраиваем ограничения для подхода, основанного на проблеме. В этом наборе данных нормы прибыли$m_i$ располагаются между-0.008489 и 0.003971; мы выбираем желаемый$r$ промежуточный возврат, e.g., 0.002 (0,2 процента).

Загрузите набор данных, сохраненный в MAT-файле.

load('port5.mat','Correlation','stdDev_return','mean_return')

Вычислите ковариационную матрицу от корреляционной матрицы.

Covariance = Correlation .* (stdDev_return * stdDev_return');
nAssets = numel(mean_return); r = 0.002;     % number of assets and desired return

Создайте задачу оптимизации, цель и ограничения

Создайте задачу оптимизации для минимизации.

portprob = optimproblem;

Создайте переменную 'x' вектора оптимизации с nAssets элементы. Эта переменная представляет часть богатства, которое инвестируют в каждый актив, так должен находиться между 0 и 1.

x = optimvar('x',nAssets,'LowerBound',0,'UpperBound',1);

Целевой функцией является 1/2*x'*Covariance*x. Включайте эту цель в проблему.

objective = 1/2*x'*Covariance*x;
portprob.Objective = objective;

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

sumcons = sum(x) == 1;
portprob.Constraints.sumcons = sumcons;

Средняя доходность должна быть больше r. Опишите это как ограничение и поместите его в проблему.

averagereturn = dot(mean_return,x) >= r;
portprob.Constraints.averagereturn = averagereturn;

Решите задачу с 225 активами

Установите некоторые опции и вызовите решатель.

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

options = optimoptions('quadprog','Display','iter','TolFun',1e-10);

Вызовите решатель и измерьте тактовое стеной время.

tic
[x1,fval1] = solve(portprob,'Options',options);
toc
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0    7.212813e+00   1.227500e+02   1.195948e+00     2.217295e-03  
    1    8.160874e-04   3.615084e-01   3.522160e-03     2.250524e-05  
    2    7.220766e-04   3.592574e-01   3.500229e-03     3.378157e-05  
    3    4.309434e-04   9.991108e-02   9.734292e-04     2.790551e-05  
    4    4.734300e-04   5.551115e-16   7.771561e-16     4.242216e-06  
    5    4.719034e-04   6.661338e-16   3.122502e-16     8.002618e-07  
    6    3.587475e-04   4.440892e-16   3.035766e-18     3.677066e-07  
    7    3.131814e-04   8.881784e-16   3.686287e-18     9.586695e-08  
    8    2.760174e-04   7.771561e-16   1.463673e-18     1.521063e-08  
    9    2.345751e-04   1.110223e-15   1.138412e-18     4.109608e-09  
   10    2.042487e-04   1.221245e-15   1.084202e-18     6.423267e-09  
   11    1.961775e-04   1.110223e-16   9.757820e-19     6.068329e-10  
   12    1.949281e-04   4.440892e-16   9.215718e-19     4.279951e-12  

Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

Elapsed time is 0.292806 seconds.

Постройте результаты.

plotPortfDemoStandardModel(x1.x)

Проблема с 225 активами с ограничениями группы

Мы теперь добавляем к ограничениям группы модели, которые требуют, чтобы 30% денег инвестора инвестировали в активы 1 - 75, 30% в активах 76 - 150, и 30% в активах 151 - 225. Каждая из этих групп активов могла быть, например, различными отраслями промышленности, такими как технология, автомобильная, и фармацевтическая. Ограничения, которые получают это новое требование,

$$\sum_{i=1}^{75} x_i \ge 0.3, \qquad$$
$$\sum_{i=76}^{150} x_i \ge 0.3, \qquad$$
$$\sum_{i=151}^{225} x_i \ge 0.3.$$

Добавьте ограничения группы в существующие равенства.

grp1 = sum(x(1:75)) >= 0.3;
grp2 = sum(x(76:150)) >= 0.3;
grp3 = sum(x(151:225)) >= 0.3;
portprob.Constraints.grp1 = grp1;
portprob.Constraints.grp2 = grp2;
portprob.Constraints.grp3 = grp3;

Вызовите решатель и измерьте тактовое стеной время.

tic
[x2,fval2] = solve(portprob,'Options',options);
toc
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0    7.212813e+00   1.227500e+02   3.539920e-01     5.253824e-03  
    1    7.004556e-03   2.901399e+00   8.367185e-03     2.207460e-03  
    2    9.181962e-04   4.095630e-01   1.181116e-03     3.749424e-04  
    3    7.515047e-04   3.567918e-01   1.028932e-03     3.486333e-04  
    4    4.238346e-04   9.005778e-02   2.597127e-04     1.607718e-04  
    5    3.695008e-04   1.909891e-04   5.507829e-07     1.341881e-05  
    6    3.691407e-04   6.146337e-07   1.772508e-09     6.817457e-08  
    7    3.010636e-04   7.691892e-08   2.218223e-10     1.837302e-08  
    8    2.669065e-04   1.088252e-08   3.138350e-11     5.474712e-09  
    9    2.195767e-04   8.122574e-10   2.342425e-12     2.814320e-08  
   10    2.102910e-04   2.839773e-10   8.189470e-13     1.037476e-08  
   11    2.060985e-04   6.713696e-11   1.936133e-13     2.876950e-09  
   12    2.015107e-04   0.000000e+00   8.131516e-19     1.522226e-10  
   13    2.009670e-04   4.440892e-16   8.673617e-19     5.264375e-13  

Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

Elapsed time is 0.162406 seconds.

Постройте результаты, наложенные на результаты предыдущей проблемы.

plotPortfDemoGroupModel(x1.x,x2.x);

Сводные данные результатов до сих пор

Мы видим из второй столбиковой диаграммы, что в результате дополнительных ограничений группы портфель теперь более равномерно распределяется через три группы актива, чем первый портфель. Эта наложенная диверсификация также привела к небольшому увеличению риска, как измерено целевой функцией (см., что столбец пометил "f(x)" для последней итерации в итеративном отображении для обоих запусков).

Проблема с 1000 активами Используя случайные данные

Для того, чтобы показать, как решатель ведет себя на большей проблеме, мы будем использовать случайным образом сгенерированный набор данных с 1000 активами. Мы генерируем случайную корреляционную матрицу (симметричный, положительно-полуопределенный с единицами на диагонали) использование gallery функция в MATLAB®.

Сбросьте случайный поток для воспроизводимости.

rng(0,'twister');
nAssets = 1000; % desired number of assets

Создайте случайные данные

Сгенерируйте средние значения возвратов между-0.1 и 0.4.

a = -0.1; b = 0.4;
mean_return = a + (b-a).*rand(nAssets,1);
r = 0.15;                                     % desired return

Сгенерируйте стандартные отклонения возвратов между 0,08 и 0.6.

a = 0.08; b = 0.6;
stdDev_return = a + (b-a).*rand(nAssets,1);

Загрузите корреляционную матрицу, которая была сгенерирована с помощью Correlation = gallery('randcorr',nAssets). (Генерация корреляционной матрицы этого размера требует времени, так загрузите предсгенерированный вместо этого.)

load('correlationMatrixDemo.mat','Correlation');

Вычислите ковариационную матрицу от корреляционной матрицы.

Covariance = Correlation .* (stdDev_return * stdDev_return');

Создайте задачу оптимизации, цель и ограничения

Создайте задачу оптимизации для минимизации.

portprob2 = optimproblem;

Создайте переменную 'x' вектора оптимизации с nAssets элементы.

x = optimvar('x',nAssets,'LowerBound',0,'UpperBound',1);

Включайте целевую функцию в проблему.

objective = 1/2*x'*Covariance*x;
portprob2.Objective = objective;

Включайте ограничения, что сумма переменных равняется 1, и средняя доходность больше r.

sumcons = sum(x) == 1;
portprob2.Constraints.sumcons = sumcons;
averagereturn = dot(mean_return,x) >= r;
portprob2.Constraints.averagereturn = averagereturn;

Решите задачу с 1000 активами

Вызовите решатель и измерьте тактовое стеной время.

tic
x3 = solve(portprob2,'Options',options);
toc
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0    2.142849e+01   5.490000e+02   3.031839e+00     5.210929e-03  
    1    9.378552e-03   6.439102e+00   3.555978e-02     6.331676e-04  
    2    1.128129e-04   3.705915e-03   2.046582e-05     1.802721e-05  
    3    1.118804e-04   1.852958e-06   1.023291e-08     1.170562e-07  
    4    8.490176e-05   7.650016e-08   4.224702e-10     7.048637e-09  
    5    3.364597e-05   4.440892e-16   3.062871e-18     1.037370e-09  
    6    1.980189e-05   2.220446e-16   8.876905e-19     8.465558e-11  

Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

Elapsed time is 0.913357 seconds.

Сводные данные

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

Более тщательно продуманные исследования возможны при помощи функций, специально предназначенных для оптимизации портфеля в Financial Toolbox™.

Похожие темы