estimateFrontier

Оценка заданного количества оптимальных портфелей на эффективной границе

Описание

пример

[pwgt,pbuy,psell] = estimateFrontier(obj) оценивает заданное количество оптимальных портфелей на эффективной границе для Portfolio, PortfolioCVaR, или PortfolioMAD объекты. Для получения дополнительной информации о соответствующих рабочих процессах при использовании этих различных объектов смотрите Рабочий процесс объекта портфеля, Рабочий процесс объекта PortfolioCVaR и Рабочий процесс объекта PortfolioMAD.

пример

[pwgt,pbuy,psell] = estimateFrontier(obj,NumPorts) оценивает заданное количество оптимальных портфелей на эффективной границе с дополнительной опцией, заданной для NumPorts.

Примеры

свернуть все

Создайте эффективные портфели:

load CAPMuniverse

p = Portfolio('AssetList',Assets(1:12));
p = estimateAssetMoments(p, Data(:,1:12),'missingdata',true);
p = setDefaultConstraints(p);
plotFrontier(p);

Figure contains an axes. The axes with title \bfEfficient Frontier contains an object of type line.

pwgt = estimateFrontier(p, 5);

pnames = cell(1,5);
for i = 1:5
	pnames{i} = sprintf('Port%d',i);
end

Blotter = dataset([{pwgt},pnames],'obsnames',p.AssetList);

disp(Blotter);
            Port1        Port2       Port3       Port4      Port5
    AAPL     0.017926    0.058247    0.097816    0.12955    0    
    AMZN            0           0           0          0    0    
    CSCO            0           0           0          0    0    
    DELL    0.0041906           0           0          0    0    
    EBAY            0           0           0          0    0    
    GOOG      0.16144     0.35678     0.55228    0.75116    1    
    HPQ      0.052566    0.032302    0.011186          0    0    
    IBM       0.46422     0.36045     0.25577    0.11928    0    
    INTC            0           0           0          0    0    
    MSFT      0.29966     0.19222    0.082949          0    0    
    ORCL            0           0           0          0    0    
    YHOO            0           0           0          0    0    

Создайте Portfolio объект для 12 запасов на основе CAPMuniverse.mat.

load CAPMuniverse
p0 = Portfolio('AssetList',Assets(1:12));
p0 = estimateAssetMoments(p0, Data(:,1:12),'missingdata',true);
p0 = setDefaultConstraints(p0);

Использование setMinMaxNumAssets для определения максимального количества 3 активов.

p1 = setMinMaxNumAssets(p0, [], 3);

Использование setBounds для определения нижней и верхней границы и BoundType от 'Conditional'.

p1 = setBounds(p1, 0.1, 0.5,'BoundType', 'Conditional');
pwgt = estimateFrontier(p1, 5);     

Следующая таблица показывает, что оптимизированные распределения имеют только максимум 3 инвестированных активов, и небольшие позиции менее 0,1 избегаются.

result = table(p0.AssetList', pwgt)
result=12×2 table
      Var1                             pwgt                        
    ________    ___________________________________________________

    {'AAPL'}          0          0          0    0.14308          0
    {'AMZN'}          0          0          0          0          0
    {'CSCO'}          0          0          0          0          0
    {'DELL'}          0          0          0          0          0
    {'EBAY'}          0          0          0          0        0.5
    {'GOOG'}    0.16979    0.29587    0.42213    0.49998        0.5
    {'HPQ' }          0          0          0          0          0
    {'IBM' }    0.49602     0.4363    0.37309    0.35694          0
    {'INTC'}          0          0          0          0          0
    {'MSFT'}    0.33419    0.26783    0.20479          0          0
    {'ORCL'}          0          0          0          0          0
    {'YHOO'}          0          0          0          0          0

The estimateFrontier функция использует решатель MINLP, чтобы решить эту задачу. Используйте setSolverMINLP функция для конфигурирования SolverType и опции.

p1.solverTypeMINLP
ans = 
'OuterApproximation'
p1.solverOptionsMINLP
ans = struct with fields:
                           MaxIterations: 1000
                    AbsoluteGapTolerance: 1.0000e-07
                    RelativeGapTolerance: 1.0000e-05
                  NonlinearScalingFactor: 1000
                  ObjectiveScalingFactor: 1000
                                 Display: 'off'
                           CutGeneration: 'basic'
                MaxIterationsInactiveCut: 30
                      ActiveCutTolerance: 1.0000e-07
                  IntMasterSolverOptions: [1x1 optim.options.Intlinprog]
    NumIterationsEarlyIntegerConvergence: 30

Создайте эффективные портфели:

load CAPMuniverse

p = PortfolioCVaR('AssetList',Assets(1:12));
p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true);
p = setDefaultConstraints(p);
p = setProbabilityLevel(p, 0.95);

plotFrontier(p);

Figure contains an axes. The axes with title \bfEfficient Frontier contains an object of type line.

pwgt = estimateFrontier(p, 5);

pnames = cell(1,5);
for i = 1:5
	pnames{i} = sprintf('Port%d',i);
end

Blotter = dataset([{pwgt},pnames],'obsnames',p.AssetList);

disp(Blotter);
            Port1       Port2        Port3       Port4      Port5
    AAPL    0.010562      0.07364     0.11931    0.13073    0    
    AMZN           0            0           0          0    0    
    CSCO           0            0           0          0    0    
    DELL    0.022649            0           0          0    0    
    EBAY           0            0           0          0    0    
    GOOG       0.203      0.38011     0.56202    0.75919    1    
    HPQ     0.042772    0.0094711           0          0    0    
    IBM      0.44444      0.36456     0.26305    0.11009    0    
    INTC           0            0           0          0    0    
    MSFT     0.27658      0.17222    0.055624          0    0    
    ORCL           0            0           0          0    0    
    YHOO           0            0           0          0    0    

Создайте эффективные портфели:

load CAPMuniverse

p = PortfolioMAD('AssetList',Assets(1:12));
p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true);
p = setDefaultConstraints(p);

plotFrontier(p);

Figure contains an axes. The axes with title \bfEfficient Frontier contains an object of type line.

pwgt = estimateFrontier(p, 5);

pnames = cell(1,5);
for i = 1:5
	pnames{i} = sprintf('Port%d',i);
end

Blotter = dataset([{pwgt},pnames],'obsnames',p.AssetList);

disp(Blotter);
            Port1        Port2       Port3       Port4      Port5
    AAPL     0.029787    0.076199     0.11265    0.13397    0    
    AMZN            0           0           0          0    0    
    CSCO            0           0           0          0    0    
    DELL    0.0089177           0           0          0    0    
    EBAY            0           0           0          0    0    
    GOOG      0.16094      0.3516     0.54479    0.74898    1    
    HPQ      0.056856    0.023073           0          0    0    
    IBM       0.46074     0.37919     0.29379    0.11705    0    
    INTC            0           0           0          0    0    
    MSFT      0.28277     0.16994    0.048762          0    0    
    ORCL            0           0           0          0    0    
    YHOO            0           0           0          0    0    

Получите количество эффективных портфелей по умолчанию во всей области значений эффективных границ.

m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
    0.00408 0.0289 0.0204 0.0119;
    0.00192 0.0204 0.0576 0.0336;
    0 0.0119 0.0336 0.1225 ];

p = Portfolio;
p = setAssetMoments(p, m, C);
p = setDefaultConstraints(p);
pwgt = estimateFrontier(p);
disp(pwgt);
  Columns 1 through 7

    0.8891    0.7215    0.5540    0.3865    0.2190    0.0515         0
    0.0369    0.1289    0.2209    0.3129    0.4049    0.4969    0.4049
    0.0404    0.0567    0.0730    0.0893    0.1056    0.1219    0.1320
    0.0336    0.0929    0.1521    0.2113    0.2705    0.3297    0.4630

  Columns 8 through 10

         0         0         0
    0.2314    0.0579         0
    0.1394    0.1468         0
    0.6292    0.7953    1.0000

Начиная с начального портфеля, estimateFrontier функция возвращает покупки и продажи, чтобы получить от вашего начального портфеля к каждому эффективному портфелю на эффективной границе. Учитывая начальный портфель в pwgt0, вы можете получить покупки и продажи.

m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
      0.00408 0.0289 0.0204 0.0119;
      0.00192 0.0204 0.0576 0.0336;
      0 0.0119 0.0336 0.1225 ];
 
p = Portfolio;
p = setAssetMoments(p, m, C);
p = setDefaultConstraints(p);
pwgt0 = [ 0.3; 0.3; 0.2; 0.1 ];
p = setInitPort(p, pwgt0);
[pwgt, pbuy, psell] = estimateFrontier(p);

display(pwgt);
pwgt = 4×10

    0.8891    0.7215    0.5540    0.3865    0.2190    0.0515         0         0         0         0
    0.0369    0.1289    0.2209    0.3129    0.4049    0.4969    0.4049    0.2314    0.0579         0
    0.0404    0.0567    0.0730    0.0893    0.1056    0.1219    0.1320    0.1394    0.1468         0
    0.0336    0.0929    0.1521    0.2113    0.2705    0.3297    0.4630    0.6292    0.7953    1.0000

display(pbuy);
pbuy = 4×10

    0.5891    0.4215    0.2540    0.0865         0         0         0         0         0         0
         0         0         0    0.0129    0.1049    0.1969    0.1049         0         0         0
         0         0         0         0         0         0         0         0         0         0
         0         0    0.0521    0.1113    0.1705    0.2297    0.3630    0.5292    0.6953    0.9000

display(psell);
psell = 4×10

         0         0         0         0    0.0810    0.2485    0.3000    0.3000    0.3000    0.3000
    0.2631    0.1711    0.0791         0         0         0         0    0.0686    0.2421    0.3000
    0.1596    0.1433    0.1270    0.1107    0.0944    0.0781    0.0680    0.0606    0.0532    0.2000
    0.0664    0.0071         0         0         0         0         0         0         0         0

Получите количество эффективных портфелей по умолчанию во всей области значений эффективных границ.

m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
    0.00408 0.0289 0.0204 0.0119;
    0.00192 0.0204 0.0576 0.0336;
    0 0.0119 0.0336 0.1225 ];
m = m/12;
C = C/12;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);

p = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);
p = setProbabilityLevel(p, 0.95);

pwgt = estimateFrontier(p);

disp(pwgt);
  Columns 1 through 7

    0.8451    0.6849    0.5159    0.3541    0.1903    0.0323         0
    0.0613    0.1429    0.2291    0.3165    0.3983    0.4721    0.3528
    0.0451    0.0634    0.0944    0.1082    0.1340    0.1580    0.1736
    0.0485    0.1089    0.1606    0.2213    0.2775    0.3376    0.4736

  Columns 8 through 10

         0         0         0
    0.1804         0         0
    0.1918    0.2212         0
    0.6277    0.7788    1.0000

Функция rng(seed) сбрасывает генератор случайных чисел, чтобы получить задокументированные результаты. Не обязательно сбрасывать генератор случайных чисел, чтобы симулировать сценарии.

Начиная с начального портфеля, estimateFrontier функция возвращает покупки и продажи, чтобы получить от вашего начального портфеля к каждому эффективному портфелю на эффективной границе. Учитывая начальный портфель в pwgt0, вы можете получить покупки и продажи.

m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
    0.00408 0.0289 0.0204 0.0119;
    0.00192 0.0204 0.0576 0.0336;
    0 0.0119 0.0336 0.1225 ];
m = m/12;
C = C/12;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);
p = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);
p = setProbabilityLevel(p, 0.95);

pwgt0 = [ 0.3; 0.3; 0.2; 0.1 ];
p = setInitPort(p, pwgt0);
[pwgt, pbuy, psell] = estimateFrontier(p);

display(pwgt);
pwgt = 4×10

    0.8451    0.6849    0.5159    0.3541    0.1903    0.0323         0         0         0         0
    0.0613    0.1429    0.2291    0.3165    0.3983    0.4721    0.3528    0.1804         0         0
    0.0451    0.0634    0.0944    0.1082    0.1340    0.1580    0.1736    0.1918    0.2212         0
    0.0485    0.1089    0.1606    0.2213    0.2775    0.3376    0.4736    0.6277    0.7788    1.0000

display(pbuy);
pbuy = 4×10

    0.5451    0.3849    0.2159    0.0541         0         0         0         0         0         0
         0         0         0    0.0165    0.0983    0.1721    0.0528         0         0         0
         0         0         0         0         0         0         0         0    0.0212         0
         0    0.0089    0.0606    0.1213    0.1775    0.2376    0.3736    0.5277    0.6788    0.9000

display(psell);
psell = 4×10

         0         0         0         0    0.1097    0.2677    0.3000    0.3000    0.3000    0.3000
    0.2387    0.1571    0.0709         0         0         0         0    0.1196    0.3000    0.3000
    0.1549    0.1366    0.1056    0.0918    0.0660    0.0420    0.0264    0.0082         0    0.2000
    0.0515         0         0         0         0         0         0         0         0         0

Функция rng(seed) сбрасывает генератор случайных чисел, чтобы получить задокументированные результаты. Не обязательно сбрасывать генератор случайных чисел, чтобы симулировать сценарии.

Получите количество эффективных портфелей по умолчанию во всей области значений эффективных границ.

m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
    0.00408 0.0289 0.0204 0.0119;
    0.00192 0.0204 0.0576 0.0336;
    0 0.0119 0.0336 0.1225 ];
m = m/12;
C = C/12;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);

p = PortfolioMAD;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);

pwgt = estimateFrontier(p);

disp(pwgt);
  Columns 1 through 7

    0.8817    0.7150    0.5488    0.3812    0.2167    0.0494         0
    0.0431    0.1285    0.2127    0.2993    0.3832    0.4679    0.3599
    0.0387    0.0604    0.0826    0.1047    0.1237    0.1480    0.1799
    0.0366    0.0961    0.1559    0.2148    0.2763    0.3348    0.4601

  Columns 8 through 10

         0         0         0
    0.1758         0         0
    0.2091    0.2266         0
    0.6151    0.7734    1.0000

Функция rng(seed) сбрасывает генератор случайных чисел, чтобы получить задокументированные результаты. Не обязательно сбрасывать генератор случайных чисел, чтобы симулировать сценарии.

Начиная с начального портфеля, estimateFrontier функция возвращает покупки и продажи, чтобы получить от вашего начального портфеля к каждому эффективному портфелю на эффективной границе. Учитывая начальный портфель в pwgt0, вы можете получить покупки и продажи.

m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
    0.00408 0.0289 0.0204 0.0119;
    0.00192 0.0204 0.0576 0.0336;
    0 0.0119 0.0336 0.1225 ];
m = m/12;
C = C/12;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);
p = PortfolioMAD;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);

pwgt0 = [ 0.3; 0.3; 0.2; 0.1 ];
p = setInitPort(p, pwgt0);
[pwgt, pbuy, psell] = estimateFrontier(p);

display(pwgt);
pwgt = 4×10

    0.8817    0.7150    0.5488    0.3812    0.2167    0.0494         0         0         0         0
    0.0431    0.1285    0.2127    0.2993    0.3832    0.4679    0.3599    0.1758         0         0
    0.0387    0.0604    0.0826    0.1047    0.1237    0.1480    0.1799    0.2091    0.2266         0
    0.0366    0.0961    0.1559    0.2148    0.2763    0.3348    0.4601    0.6151    0.7734    1.0000

display(pbuy);
pbuy = 4×10

    0.5817    0.4150    0.2488    0.0812         0         0         0         0         0         0
         0         0         0         0    0.0832    0.1679    0.0599         0         0         0
         0         0         0         0         0         0         0    0.0091    0.0266         0
         0         0    0.0559    0.1148    0.1763    0.2348    0.3601    0.5151    0.6734    0.9000

display(psell);
psell = 4×10

         0         0         0         0    0.0833    0.2506    0.3000    0.3000    0.3000    0.3000
    0.2569    0.1715    0.0873    0.0007         0         0         0    0.1242    0.3000    0.3000
    0.1613    0.1396    0.1174    0.0953    0.0763    0.0520    0.0201         0         0    0.2000
    0.0634    0.0039         0         0         0         0         0         0         0         0

Функция rng(seed) сбрасывает генератор случайных чисел, чтобы получить задокументированные результаты. Не обязательно сбрасывать генератор случайных чисел, чтобы симулировать сценарии.

Входные параметры

свернуть все

Объект для портфеля, заданный с помощью Portfolio, PortfolioCVaR, или PortfolioMAD объект. Для получения дополнительной информации о создании объекта портфеля см.

Типы данных: object

Число точек для получения на эффективной границе, заданное в виде скалярного целого числа.

Примечание

Если значение не задано для NumPortsзначение по умолчанию получается из скрытого свойства defaultNumPorts (значение по умолчанию является 10). Если NumPorts = 1эта функция возвращает портфолио, заданное скрытым свойством defaultFrontierLimit (текущее значение по умолчанию 'min').

Типы данных: double

Выходные аргументы

свернуть все

Оптимальные портфели на эффективной границе с заданным количеством портфелей, разделенных равномерно от минимальной до максимального возврата портфеля, возвращенные как NumAssets-by- NumPorts матрица. pwgt возвращается на Portfolio, PortfolioCVaR, или PortfolioMAD входной объект (obj).

Покупки относительно начального портфеля для оптимальных портфелей на эффективной границе, возвращенные как NumAssets-by- NumPorts матрица.

Примечание

Если начальный портфель не задан в obj.InitPort, это значение принято как 0 таким образом pbuy = max(0, pwgt) и psell = max(0, -pwgt).

pbuy возвращается на Portfolio, PortfolioCVaR, или PortfolioMAD входной объект (obj).

Продажи относительно начального портфеля для оптимальных портфелей на эффективной границе, возвращенные как NumAssets-by- NumPorts матрица.

Примечание

Если начальный портфель не задан в obj.InitPort, это значение принято как 0 таким образом pbuy = max(0, pwgt) и psell = max(0, -pwgt).

psell возвращается для Portfolio, PortfolioCVaR, или PortfolioMAD входной объект (obj).

Совет

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

     	[pwgt, pbuy, psell] = obj.estimateFrontier(NumPorts);

  • При введении транзакционных издержек и ограничений оборота в Portfolio, PortfolioCVaR, или PortfolioMAD объект, цель оптимизации портфеля содержит член с абсолютным значением. Для получения дополнительной информации о том, как Financial Toolbox™ обрабатывает такие случаи алгоритмически, смотрите Ссылки.

Ссылки

[1] Cornuejols, G., and R. Tutuncu. Методы оптимизации в финансах. Cambridge University Press, 2007.

Введенный в R2011a