exponenta event banner

Оптимизация портфеля на основе эталонного теста

В этом примере показано, как выполнить оптимизацию портфеля с помощью Portfolio объект в финансовой Toolbox™.

Этот пример, в частности, демонстрирует оптимизацию портфеля для максимизации информационного соотношения по отношению к рыночному эталону. В частности, финансовые данные, содержащиеся в table считывается в MATLAB ® и выполняется визуализация (на ежедневном и годовом уровнях). APortfolio объект создается с рыночными данными с использованием активного ежедневного возврата для каждого основного средства. Использование функций, поддерживающих Portfolio объект, вычисляется непосредственно эффективная граница. Затем решается настраиваемая задача оптимизации, чтобы найти распределение активов с максимизированным коэффициентом информации.

Импорт исторических данных с помощью MATLAB

®

Импортные исторические цены для вселенной активов и рыночный эталон Dow Jones Industrial Average (DJI). Данные импортируются в table из электронной таблицы Microsoft ® Excel ® с использованием MATLAB ®readtable функция.

data = readtable('dowPortfolio.xlsx');
head(data, 10)
ans=10×32 table
       Dates        DJI      AA       AIG      AXP      BA        C       CAT      DD       DIS      GE       GM       HD       HON      HPQ      IBM     INTC      JNJ      JPM      KO       MCD      MMM      MO       MRK     MSFT      PFE      PG        T       UTX      VZ       WMT      XOM 
    ___________    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____    _____

    03-Jan-2006    10847    28.72    68.41    51.53    68.63    45.26    55.86    40.68    24.18     33.6    17.82    39.79    36.14    28.35    80.13    24.57    59.08    37.78    38.98    32.72    75.93    52.27    30.73    26.19    22.16    56.38     22.7    54.94    26.79     44.9    56.64
    04-Jan-2006    10880    28.89    68.51    51.03    69.34    44.42    57.29    40.46    23.77    33.56     18.3    39.05    35.99    29.18    80.03     24.9    59.99    37.56    38.91    33.01    75.54    52.65    31.08    26.32    22.88    56.48    22.87    54.61    27.58    44.99    56.74
    05-Jan-2006    10882    29.12     68.6    51.57    68.53    44.65    57.29    40.38    24.19    33.47    19.34    38.67    35.97    28.97    80.56    25.25    59.74    37.67     39.1    33.05    74.85    52.52    31.13    26.34     22.9     56.3    22.92    54.41     27.9    44.38    56.45
    06-Jan-2006    10959    29.02    68.89    51.75    67.57    44.65    58.43    40.55    24.52     33.7    19.61    38.96    36.53     29.8    82.96    25.28    60.01    37.94    39.47    33.25    75.47    52.95    31.08    26.26    23.16    56.24    23.21    54.58    28.01    44.56    57.57
    09-Jan-2006    11012    29.37    68.57    53.04    67.01    44.43    59.49    40.32    24.78    33.61    21.12    39.38    36.23    30.17    81.76    25.44    60.38    38.55    39.66    33.88    75.84    53.11    31.58    26.21    23.16    56.67     23.3     55.2    28.12     44.4    57.54
    10-Jan-2006    11012    28.44    69.18    52.88    67.33    44.57    59.25     40.2    25.09    33.43    20.79    40.33    36.17    30.33     82.1     25.1    60.49    38.61     39.7    33.91    75.37    53.04    31.27    26.35    22.77    56.45    23.16    55.24    28.24    44.54    57.99
    11-Jan-2006    11043    28.05     69.6    52.59     68.3    44.98    59.28    38.87    25.33    33.66    20.61    41.44    36.19    30.88    82.19    25.12    59.91    38.58    39.72     34.5    75.22    53.31    31.39    26.63    23.06    56.65    23.34    54.41    28.58    45.23    58.38
    12-Jan-2006    10962    27.68    69.04     52.6     67.9    45.02    60.13    38.02    25.41    33.25    19.76    41.05    35.77    30.57    81.61    24.96    59.63    37.87     39.5    33.96    74.57    53.23    31.41    26.48     22.9    56.02    23.24     53.9    28.69    44.43    57.77
    13-Jan-2006    10960    27.81    68.84     52.5     67.7    44.92    60.24    37.86    25.47    33.35     19.2    40.43    35.85    31.43    81.22    24.78    59.26    37.84    39.37    33.65    74.38    53.29     31.4    26.53    22.99    56.49    23.27     54.1    28.75     44.1    59.06
    17-Jan-2006    10896    27.97    67.84    52.03    66.93    44.47    60.85    37.75    25.15     33.2    18.68    40.11    35.56     31.2    81.05    24.52    58.74    37.64    39.11    33.77    73.99    52.85    31.16    26.34    22.63    56.25    23.13    54.41    28.12    43.66    59.61

Отделите названия активов, цены активов и эталонные цены DJI от таблицы. Визуализация показывает эволюцию всех цен активов, нормализованных для начала с единицы, то есть накопительной доходности.

benchPrice = data.DJI;
assetNames = data.Properties.VariableNames(3:2:end); % using half of the assets for display
assetPrice = data(:,assetNames).Variables;

assetP = assetPrice./assetPrice(1, :);  
benchmarkP = benchPrice / benchPrice(1);

figure;
plot(data.Dates,assetP);
hold on;
plot(data.Dates,benchmarkP,'LineWidth',3,'Color','k');
hold off;
xlabel('Date');
ylabel('Normalized Price');
title('Normalized Asset Prices and Benchmark');
grid on;

Figure contains an axes. The axes with title Normalized Asset Prices and Benchmark contains 16 objects of type line.

Жирная линия указывает на рыночный ориентир DJIA.

Вычислить доходность и скорректированную на риск доходность

Вычислите серию возврата из серии цен и вычислите моменты актива (исторические возвраты и стандартные отклонения). Визуализация показывает разрозненный график характеристик риск-доходность всех активов и эталон рынка DJI.

benchReturn = tick2ret(benchPrice);
assetReturn = tick2ret(assetPrice);

benchRetn = mean(benchReturn);
benchRisk =  std(benchReturn);
assetRetn = mean(assetReturn);
assetRisk =  std(assetReturn);

Рассчитайте историческую статистику и постройте график годовой доходности от риска. Следует отметить, что график находится на годовом уровне, поэтому масштабирование выполняется на ежедневной доходности.

scale = 252;

assetRiskR = sqrt(scale) * assetRisk;
benchRiskR = sqrt(scale) * benchRisk;
assetReturnR = scale * assetRetn;
benchReturnR = scale * benchRetn;

figure;
scatter(assetRiskR, assetReturnR, 6, 'm', 'Filled');
hold on
scatter(benchRiskR, benchReturnR, 6, 'g', 'Filled');
for k = 1:length(assetNames)
    text(assetRiskR(k) + 0.005, assetReturnR(k), assetNames{k}, 'FontSize', 8);
end
text(benchRiskR + 0.005, benchReturnR, 'Benchmark', 'Fontsize', 8);
hold off;

xlabel('Risk (Std Dev of Return)');
ylabel('Expected Annual Return');
grid on;

Figure contains an axes. The axes contains 18 objects of type scatter, text.

Настройка оптимизации портфеля

Настройка задачи оптимизации портфеля путем заполнения объекта с помощью Portfolio. Поскольку цель состоит в оптимизации распределения портфеля на основе эталонного показателя, активная доходность каждого актива рассчитывается и используется в Portfolio объект. В этом примере ожидаемые доходности и ковариации активов в портфеле устанавливаются на их исторические значения.

p = Portfolio('AssetList',assetNames);

Настройка ограничений портфеля по умолчанию (все веса суммируются с 1, без короткого замыкания и 100% инвестиций в рискованные активы).

p = setDefaultConstraints(p);

Добавление возвратов активов и ковариации в Portfolio объект.

activReturn = assetReturn - benchReturn;
pAct = estimateAssetMoments(p,activReturn,'missingdata',false)
pAct = 
  Portfolio with properties:

          BuyCost: []
         SellCost: []
     RiskFreeRate: []
        AssetMean: [15x1 double]
       AssetCovar: [15x15 double]
    TrackingError: []
     TrackingPort: []
         Turnover: []
      BuyTurnover: []
     SellTurnover: []
             Name: []
        NumAssets: 15
        AssetList: {1x15 cell}
         InitPort: []
      AInequality: []
      bInequality: []
        AEquality: []
        bEquality: []
       LowerBound: [15x1 double]
       UpperBound: []
      LowerBudget: 1
      UpperBudget: 1
      GroupMatrix: []
       LowerGroup: []
       UpperGroup: []
           GroupA: []
           GroupB: []
       LowerRatio: []
       UpperRatio: []
     MinNumAssets: []
     MaxNumAssets: []
        BoundType: [15x1 categorical]

Вычислите эффективную границу с помощью Portfolio Объект

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

pwgtAct = estimateFrontier(pAct, 20); % Estimate the weights.
[portRiskAct, portRetnAct] = estimatePortMoments(pAct, pwgtAct); % Get the risk and return.

% Extract the asset moments and names.
[assetActRetnDaily, assetActCovarDaily] = getAssetMoments(pAct);
assetActRiskDaily = sqrt(diag(assetActCovarDaily));
assetNames = pAct.AssetList;

% Rescale.
assetActRiskAnnual = sqrt(scale) * assetActRiskDaily;
portRiskAnnual  = sqrt(scale) *  portRiskAct;
assetActRetnAnnual = scale * assetActRetnDaily;
portRetnAnnual = scale *  portRetnAct;

figure;
subplot(2,1,1);
plot(portRiskAnnual, portRetnAnnual, 'bo-', 'MarkerFaceColor', 'b');
hold on;

scatter(assetActRiskAnnual, assetActRetnAnnual, 12, 'm', 'Filled');
hold on;
for k = 1:length(assetNames)
    text(assetActRiskAnnual(k) + 0.005, assetActRetnAnnual(k), assetNames{k}, 'FontSize', 8);
end

hold off;

xlabel('Risk (Std Dev of Active Return)');
ylabel('Expected Active Return');
grid on;

subplot(2,1,2);
plot(portRiskAnnual, portRetnAnnual./portRiskAnnual, 'bo-', 'MarkerFaceColor', 'b');
xlabel('Risk (Std Dev of Active Return)');
ylabel('Information Ratio');
grid on;

Figure contains 2 axes. Axes 1 contains 17 objects of type line, scatter, text. Axes 2 contains an object of type line.

Выполнение максимизации информационного отношения с помощью оптимизации Toolbox™

Выполните гибридную оптимизацию, чтобы найти портфель вдоль границы с максимальным информационным соотношением. Отношение информации представляет собой отношение относительного возврата к относительному риску (известному как «ошибка отслеживания»). В то время как коэффициент Шарпа рассматривает доходность по отношению к безрисковому активу, коэффициент информации основан на доходности по отношению к рискованному эталону, в данном случае эталону DJI. Это делается путем выполнения оптимизации, которая находит оптимальное ограничение возврата, для которого задача оптимизации портфеля возвращает портфель максимального информационного отношения. Функции оптимизации портфеля вызываются из целевой функции. infoRatioTargetReturn который оптимизирован функцией Optimization Toolbox™ fminbnd. Локальная функция infoRatioTargetReturn вычисляет минимальный (активный) портфель рисков с целевой активной доходностью.

infoRatioTargetReturn локальная функция называется целевой функцией в подпрограмме оптимизации (fminbnd), который стремится найти целевой возврат, который максимизирует информационный коэффициент и минимизирует отрицательный информационный коэффициент.

objFun = @(targetReturn) -infoRatioTargetReturn(targetReturn,pAct);
options = optimset('TolX',1.0e-8);
[optPortRetn, ~, exitflag] = fminbnd(objFun,min(portRetnAct),max(portRetnAct),options);

Получите вес, соотношение информации и доходность от рисков для оптимального портфеля.

[optInfoRatio,optWts] = infoRatioTargetReturn(optPortRetn,pAct);
optPortRisk = estimatePortRisk(pAct,optWts) 
optPortRisk = 0.0040

Постройте график оптимального портфеля

Убедитесь, что найденный портфель действительно является максимальным портфелем информационных отношений.

% Rescale.
optPortRiskAnnual = sqrt(scale) * optPortRisk;
optPortReturnAnnual = scale * optPortRetn;

figure;
subplot(2,1,1);

scatter(assetActRiskAnnual, assetActRetnAnnual, 6, 'm', 'Filled');
hold on
for k = 1:length(assetNames)
    text(assetActRiskAnnual(k) + 0.005,assetActRetnAnnual(k),assetNames{k},'FontSize',8);
end
plot(portRiskAnnual,portRetnAnnual,'bo-','MarkerSize',4,'MarkerFaceColor','b');
plot(optPortRiskAnnual,optPortReturnAnnual,'ro-','MarkerFaceColor','r');
hold off;

xlabel('Risk (Std Dev of Active Return)');
ylabel('Expected Active Return');
grid on;

subplot(2,1,2);
plot(portRiskAnnual,portRetnAnnual./portRiskAnnual,'bo-','MarkerSize',4,'MarkerFaceColor','b');
hold on
plot(optPortRiskAnnual,optPortReturnAnnual./optPortRiskAnnual,'ro-','MarkerFaceColor','r');
hold off;

xlabel('Risk (Std Dev of Active Return)');
ylabel('Information Ratio');
title('Information Ratio with Optimal Portfolio');
grid on;

Figure contains 2 axes. Axes 1 contains 18 objects of type scatter, text, line. Axes 2 with title Information Ratio with Optimal Portfolio contains 2 objects of type line.

Просмотр решения по оптимизации портфеля

Просмотрите решение по оптимизации портфеля.

assetIndx = optWts > .001;
results = table(assetNames(assetIndx)', optWts(assetIndx)*100, 'VariableNames',{'Asset', 'Weight'});
disp('Maximum Information Ratio Portfolio:')
Maximum Information Ratio Portfolio:
disp(results)
     Asset      Weight 
    ________    _______

    {'AA'  }      1.539
    {'AXP' }    0.35551
    {'C'   }     9.6533
    {'DD'  }     4.0684
    {'HPQ' }     17.698
    {'JPM' }     21.565
    {'MCD' }     26.736
    {'MO'  }     13.648
    {'MSFT'}     2.6858
    {'UTX' }     2.0509
fprintf('Active return for Max. Info Ratio portfolio is %0.2f%%\n', optPortRetn*25200);
Active return for Max. Info Ratio portfolio is 12.14%
fprintf('Tracking error for Max. Info Ratio portfolio is %0.2f%%\n', optPortRisk*sqrt(252)*100);
Tracking error for Max. Info Ratio portfolio is 6.32%

Локальная функция

function [infoRatio,wts] = infoRatioTargetReturn(targetReturn,portObj)
% Calculate information ratio for a target-return portfolio along the
% efficient frontier.
wts = estimateFrontierByReturn(portObj,targetReturn);
portRiskAct = estimatePortRisk(portObj,wts);
infoRatio = targetReturn/portRiskAct;
end

См. также

| |

Связанные примеры

Подробнее

Внешние веб-сайты