В этом примере показано, как решить задачи оптимизации портфеля с помощью алгоритма квадратичного программирования внутренней точки в quadprog
. Функциональный quadprog
принадлежит Optimization Toolbox™.
Матрицы, которые задают проблемы в этом примере, являются плотными; однако, алгоритм внутренней точки в quadprog
может также использовать разреженность в проблемных матрицах для увеличенной скорости. Для разреженного примера см. Большую Разреженную Квадратичную Программу с Алгоритмом Внутренней точки.
Предположим, что существуют различные активы. Норма прибыли актива является случайной переменной с ожидаемым значением. Проблема состоит в том, чтобы найти, какую часть инвестировать в каждый актив для того, чтобы минимизировать риск согласно заданной минимальной ожидаемой норме прибыли.
Позвольте обозначают, что ковариационная матрица уровней актива возвращается.
Классическая модель среднего отклонения состоит из минимизации портфельного риска, как измерено
подвергните набору ограничений.
Ожидаемый доход должен быть не меньше, чем минимальной ставкой портфеля, возвращают это желания инвестора,
сумма инвестиционных частей должна составить в целом в общей сложности один,
и, будучи частями (или проценты), они должны быть числами между нулем и один,
Поскольку цель минимизировать портфельный риск квадратична, и ограничения линейны, получившаяся задача оптимизации является квадратичной программой или QP.
Давайте теперь решим QP с 225 активами. Набором данных является от ИЛИ-БИБЛИОТЕКИ [Чанг, T.-J., Мид, N., Бизли, J.E. и Sharaiha, Y.M., "Эвристика для кардинальности ограничила оптимизацию портфеля" Computers & Operations 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 использование алгоритма внутренней точки, мы устанавливаем опцию Алгоритм на 'выпуклый внутренней точкой'.
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.148099 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.050313 seconds.
Постройте результаты, наложенные на результаты предыдущей проблемы.
plotPortfDemoGroupModel(x1,x2);
Мы видим из второй столбиковой диаграммы, что в результате дополнительных ограничений группы портфель теперь более равномерно распределяется через три группы актива, чем первый портфель. Эта наложенная диверсификация также привела к небольшому увеличению риска, как измерено целевой функцией (см., что столбец пометил "f(x)" для последней итерации в итеративном отображении для обоих запусков).
Для того, чтобы показать как 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');
Мы теперь описываем стандартную задачу 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.404422 seconds.
Этот пример иллюстрирует, как использовать алгоритм внутренней точки в quadprog
на задаче оптимизации портфеля, и показывает время выполнения алгоритма на квадратичных проблемах различных размеров.
Более тщательно продуманные исследования возможны при помощи функций, специально предназначенных для оптимизации портфеля в Financial Toolbox™.
Смешано-целочисленная оптимизация портфеля квадратичного программирования: основанный на решателе