В этом примере показано, как решить задачи оптимизации портфеля с помощью подхода, основанного на проблеме. Для основанного на решателе подхода смотрите Квадратичное программирование для Задач оптимизации Портфеля, Основанных на решателе.
Предположим, что портфель содержит различные активы. Норма прибыли актива является случайной переменной с ожидаемым значением. Проблема состоит в том, чтобы найти, какую часть инвестировать в каждый актив для того, чтобы минимизировать риск согласно заданной минимальной ожидаемой норме прибыли.
Позвольте обозначают, что ковариационная матрица уровней актива возвращается.
Классическая модель среднего отклонения состоит из минимизации портфельного риска, как измерено
подвергните набору ограничений.
Ожидаемый доход должен быть не меньше, чем минимальной ставкой портфеля, возвращают это желания инвестора,
сумма инвестиционных частей должна составить в целом в общей сложности один,
и, будучи частями (или проценты), они должны быть числами между нулем и один,
Поскольку цель минимизировать портфельный риск квадратична, и ограничения линейны, получившаяся задача оптимизации является квадратичной программой или QP.
Давайте теперь решим QP с 225 активами. Набором данных является от ИЛИ-БИБЛИОТЕКИ [Чанг, T.-J., Мид, N., Бизли, J.E. и Sharaiha, Y.M., "Эвристика для кардинальности ограничила оптимизацию портфеля" Computers & Operations Research 27 (2000) 1271-1302].
Мы загружаем набор данных и затем настраиваем ограничения для подхода, основанного на проблеме. В этом наборе данных нормы прибыли располагаются между-0.008489 и 0.003971; мы выбираем желаемый промежуточный возврат, 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;
Установите некоторые опции и вызовите решатель.
Установите опции включать итеративное отображение и устанавливать более трудную погрешность завершения оптимальности.
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)
Мы теперь добавляем к ограничениям группы модели, которые требуют, чтобы 30% денег инвестора инвестировали в активы 1 - 75, 30% в активах 76 - 150, и 30% в активах 151 - 225. Каждая из этих групп активов могла быть, например, различными отраслями промышленности, такими как технология, автомобильная, и фармацевтическая. Ограничения, которые получают это новое требование,
Добавьте ограничения группы в существующие равенства.
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 активами. Мы генерируем случайную корреляционную матрицу (симметричный, положительно-полуопределенный с единицами на диагонали) использование 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;
Вызовите решатель и измерьте тактовое стенкой время.
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™.