В этом примере показано, как решить задачи оптимизации портфеля с помощью квадратичного алгоритма программирования внутренних точек в quadprog
. Функция quadprog
принадлежит Optimization Toolbox™.
Матрицы, которые определяют задачи в этом примере, плотны; однако алгоритм внутренней точки в quadprog
может также использовать разреженность в матрицах задач для увеличения скорости. Разреженный пример см. в Большой разреженной квадратичной программе с алгоритмом внутренней точки.
Предположим, что существуют разные активы. Норма возврата актива является случайной переменной с ожидаемым значением. Задача состоит в том, чтобы найти, какую долю инвестировать в каждый актив, порядок минимизировать риск, удовлетворяющий определенной минимальной ожидаемой ставке возврата.
Обозначим ковариационную матрицу ставок возвратов активов.
Классическая модель средней дисперсии состоит из минимизации портфельного риска, измеряемой
удовлетворяющее набору ограничений.
Ожидаемый возврат должна быть не меньше минимальной скорости портфеля возврата того, что желает инвестор,
сумма инвестиционных фракций должна составлять в общей сложности единицу,
и, будучи дробями (или процентами), они должны быть числами от нуля до единицы,
Поскольку цель минимизации риска портфеля квадратичная, и ограничения линейны, полученная задача оптимизации является квадратичной программой, или QP.
Давайте теперь решим 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].
Загружаем набор данных и затем настраиваем ограничения в формате, ожидаемом quadprog
. В этом наборе данных скорости возврата варьируются между -0.008489 и 0.003971; мы выбираем желаемый возврат между ними, например, 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
Для порядок решить QP с помощью алгоритма внутренней точки, мы установите опцию Algorithm на 'interior-point-convex'.
options = optimoptions('quadprog','Algorithm','interior-point-convex');
Теперь мы устанавливаем некоторые дополнительные опции и вызываем решатель 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.850332e-10 5.252599e-12 3.858983e-05 10 2.277722e-04 4.422799e-13 2.626104e-15 6.204101e-06 11 1.992243e-04 1.140581e-16 2.161231e-18 4.391483e-07 12 1.950468e-04 0.000000e+00 1.387779e-17 1.429441e-08 13 1.949141e-04 1.114560e-16 1.206517e-18 9.731942e-10 14 1.949121e-04 6.670012e-16 2.483738e-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.153874 seconds.
Постройте график результатов.
plotPortfDemoStandardModel(x1)
Теперь мы добавляем к модели группы ограничения, которые требуют, чтобы 30% денег инвестора были инвестированы в активы с 1 по 75, 30% в активы с 76 по 150 и 30% в активы с 151 по 225. Каждая из этих групп активов может быть, для образца, различными отраслями промышленности, такими как технологии, автомобилестроение и фармацевтика. Ограничения, которые захватывают это новое требование,
Добавьте групповые ограничения к существующим равенствам.
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.586818e-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.811527e-09 1.740855e-11 1.967570e-06 11 2.024362e-04 4.129608e-12 1.237090e-14 5.924109e-08 12 2.009703e-04 4.289971e-15 1.369512e-17 6.353270e-10 13 2.009650e-04 5.555452e-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.042448 seconds.
Отобразите результаты, наложенные на результаты предыдущей задачи.
plotPortfDemoGroupModel(x1,x2);
На второй столбиковой диаграмме мы видим, что в результате дополнительных групповых ограничений портфель теперь распределен более равномерно по трем группам активов, чем первый портфель. Эта навязанная диверсификация также привела к незначительному увеличению риска, измеренному целевой функцией (последнюю итерацию в итерационном отображении для обоих запусков см. в столбце «f (x)»).
В порядок показать, как quadprog
алгоритм внутренней точки ведет себя на большей задаче, мы будем использовать 1000-asset случайным образом сгенерированный набор данных. Мы генерируем матрицу случайной корреляции (симметричную, положительно-полусемидефинитную, с таковыми на диагонали), используя 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');
Теперь мы определяем стандартную задачу 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.711765e-10 6.641535e-13 5.652911e-08 8 1.491953e-05 4.924477e-12 6.940646e-15 2.427880e-09 9 1.477930e-05 1.308120e-13 1.850666e-16 2.454705e-10 10 1.476910e-05 1.165734e-15 7.679047e-19 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.429395 seconds.
Этот пример иллюстрирует, как использовать алгоритм внутренней точки в quadprog
по задаче оптимизации портфеля и показывает время работы алгоритма по квадратичным задачам разных размеров.
Более подробный анализ возможен при помощи функций, специально разработанных для оптимизации портфеля в Financial Toolbox™.
Оптимизация портфеля смешано-целочисленного квадратичного программирования: основанная на решателе