exponenta event banner

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

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

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

Предположим, что портфель содержит$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. и Sharaiha, Y.M., «Эвристика для оптимизации портфеля ограниченных возможностей» Computers & Operations 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 активами Используя случайные данные

Чтобы показать, как решатель работает с более крупной проблемой, мы используем набор данных из 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™.

Связанные темы