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

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

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

Предположим, что портфель содержит$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-Asset задачи

Давайте теперь решим QP с 225 активами. Набор данных получен из библиотеки OR [Chang, T.-J., Meade, N., Beasley, J.E. and Sharaiha, Y.M., «Eurististics for cardinality constabled portfolio optimization» Computers & Операции Research 27 (2000) 1271-1302].

Мы загружаем набор данных, а затем настраиваем ограничения для основанного на проблеме подхода. В этом наборе данных скорости возврата$m_i$ варьируются между -0.008489 и 0.003971; мы выбираем желаемый возврат$r$ между ними, например, 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-Asset задачу

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

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

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-Asset проблема с ограничениями группы

Теперь мы добавляем к модели группы ограничения, которые требуют, чтобы 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-Asset задачи с использованием случайных данных

В порядок, чтобы показать, как решатель ведет себя в большей задаче, мы будем использовать 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-Asset задачу

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

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™.

Похожие темы