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

В этом примере показано, как решить задачи оптимизации портфеля с помощью алгоритма квадратичного программирования внутренней точки в quadprog. Функциональный quadprog принадлежит Optimization Toolbox™.

Матрицы, которые задают проблемы в этом примере, являются плотными; однако, алгоритм внутренней точки в quadprog может также использовать разреженность в проблемных матрицах для увеличенной скорости. Для разреженного примера см. Большую Разреженную Квадратичную Программу с Алгоритмом Внутренней точки.

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

Предположим, что существуют$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].

Мы загружаем набор данных и затем настраиваем ограничения в формате, ожидаемом quadprog. В этом наборе данных нормы прибыли$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
Aeq = ones(1,nAssets); beq = 1;              % equality Aeq*x = beq
Aineq = -mean_return'; bineq = -r;           % inequality Aineq*x <= bineq
lb = zeros(nAssets,1); ub = ones(nAssets,1); % bounds lb <= x <= ub
c = zeros(nAssets,1);                        % objective has no linear term; set it to zero

Выберите алгоритм внутренней точки в Quadprog

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

options = optimoptions('quadprog','Algorithm','interior-point-convex');

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

Мы теперь устанавливаем некоторые дополнительные опции и вызываем решатель quadprog.

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

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

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

tic
[x1,fval1] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);
toc
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0    2.384401e+01   2.253410e+02   1.337381e+00     1.000000e+00  
    1    1.338822e-03   7.394864e-01   4.388791e-03     1.038098e-02  
    2    1.186079e-03   6.443975e-01   3.824446e-03     8.727381e-03  
    3    5.923977e-04   2.730703e-01   1.620650e-03     1.174211e-02  
    4    5.354880e-04   5.303581e-02   3.147632e-04     1.549549e-02  
    5    5.181994e-04   2.651791e-05   1.573816e-07     2.848171e-04  
    6    5.066191e-04   9.285375e-06   5.510794e-08     1.041224e-04  
    7    3.923090e-04   7.619855e-06   4.522322e-08     5.536006e-04  
    8    3.791545e-04   1.770065e-06   1.050519e-08     1.382075e-04  
    9    2.923749e-04   8.850319e-10   5.252597e-12     3.858983e-05  
   10    2.277722e-04   4.429486e-13   2.627194e-15     6.204101e-06  
   11    1.992243e-04   2.242130e-16   6.938894e-18     4.391483e-07  
   12    1.950468e-04   4.449566e-16   6.938894e-18     1.429441e-08  
   13    1.949141e-04   6.670012e-16   6.938894e-18     9.731942e-10  
   14    1.949121e-04   4.449566e-16   2.158478e-18     2.209702e-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.266215 seconds.

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

plotPortfDemoStandardModel(x1)

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

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

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

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

Groups = blkdiag(ones(1,nAssets/3),ones(1,nAssets/3),ones(1,nAssets/3));
Aineq = [Aineq; -Groups];         % convert to <= constraint
bineq = [bineq; -0.3*ones(3,1)];  % by changing signs

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

tic
[x2,fval2] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);
toc
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0    2.384401e+01   4.464410e+02   1.337324e+00     1.000000e+00  
    1    1.346872e-03   1.474737e+00   4.417606e-03     3.414918e-02  
    2    1.190113e-03   1.280566e+00   3.835962e-03     2.934585e-02  
    3    5.990845e-04   5.560762e-01   1.665738e-03     1.320038e-02  
    4    3.890097e-04   2.780381e-04   8.328691e-07     7.287370e-03  
    5    3.887354e-04   1.480950e-06   4.436214e-09     4.641988e-05  
    6    3.387787e-04   8.425389e-07   2.523842e-09     2.578178e-05  
    7    3.089240e-04   2.707587e-07   8.110631e-10     9.217509e-06  
    8    2.639458e-04   6.586817e-08   1.973094e-10     6.509001e-06  
    9    2.252657e-04   2.225507e-08   6.666550e-11     6.783212e-06  
   10    2.105838e-04   5.811528e-09   1.740855e-11     1.967570e-06  
   11    2.024362e-04   4.129222e-12   1.237074e-14     5.924109e-08  
   12    2.009703e-04   4.509847e-15   1.402827e-17     6.353270e-10  
   13    2.009650e-04   1.665335e-16   6.938894e-18     1.596041e-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.117457 seconds.

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

plotPortfDemoGroupModel(x1,x2);

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

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

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

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

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

a = 0.08; b = 0.6;
stdDev_return = a + (b-a).*rand(nAssets,1);
% Correlation matrix, generated using Correlation = gallery('randcorr',nAssets).
% (Generating a correlation matrix of this size takes a while, so we load
% a pre-generated one instead.)
load('correlationMatrixDemo.mat','Correlation');
% Calculate covariance matrix from correlation matrix.
Covariance = Correlation .* (stdDev_return * stdDev_return');

Задайте и решите случайным образом сгенерированную задачу с 1000 активами

Мы теперь описываем стандартную задачу QP (никакие ограничения группы здесь) и решаем.

r = 0.15;                                     % desired return
Aeq = ones(1,nAssets); beq = 1;               % equality Aeq*x = beq
Aineq = -mean_return'; bineq = -r;            % inequality Aineq*x <= bineq
lb = zeros(nAssets,1); ub = ones(nAssets,1);  % bounds lb <= x <= ub
c = zeros(nAssets,1);                         % objective has no linear term; set it to zero

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

tic
x3 = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);
toc
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0    7.083800e+01   1.142266e+03   1.610094e+00     1.000000e+00  
    1    5.603619e-03   7.133717e+00   1.005541e-02     9.857295e-02  
    2    1.076070e-04   3.566858e-03   5.027704e-06     9.761758e-03  
    3    1.068230e-04   2.513041e-06   3.542286e-09     8.148386e-06  
    4    7.257177e-05   1.230928e-06   1.735068e-09     3.979480e-06  
    5    3.610589e-05   2.634706e-07   3.713780e-10     1.175001e-06  
    6    2.077811e-05   2.562892e-08   3.612554e-11     5.617206e-07  
    7    1.611590e-05   4.711777e-10   6.641537e-13     5.652911e-08  
    8    1.491953e-05   4.923562e-12   6.940741e-15     2.427880e-09  
    9    1.477930e-05   1.324774e-13   1.849718e-16     2.454705e-10  
   10    1.476910e-05   6.938894e-16   1.074695e-18     2.786060e-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.557634 seconds.

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

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

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

Смотрите также