Актив возвращается и сценарии Используя объект PortfolioCVaR

Как стохастические работы оптимизации

CVaR портфеля является условным ожиданием. (Для определения функции CVaR смотрите Прокси Риска.) Поэтому задача оптимизации портфеля CVaR является стохастической задачей оптимизации. Учитывая выборку сценариев, условное ожидание, которое задает демонстрационный CVaR портфеля, может быть описано как конечная сумма, взвешенное среднее потерь. Веса потерь зависят от своей относительной величины; для доверительного уровня α, только худшие (1 − α) x 100%-е потери получают положительный вес. Как функция весов портфеля, CVaR портфеля является выпуклой функцией (см. [48], [49] Rockafellar & Uryasev при Оптимизации Портфеля). Это - также несглаженная функция, но ее ребра менее резки, когда объем выборки увеличивается.

Существуют переформулировки задачи оптимизации портфеля CVaR (см. [48], [49] в Rockafellar & Uryasev), что результат в задаче линейного программирования, которая может быть решена или со стандартными линейными методами программирования или с решателями стохастического программирования. PortfolioCVaR объект, однако, не переформулирует проблему таким способом. PortfolioCVaR объект вычисляет CVaR как нелинейную функцию. Выпуклость CVaR, как функция весов портфеля и тусклых ребер, когда количество сценариев является большим, делает задачу оптимизации портфеля CVaR послушной, на практике, для определенных решателей нелинейного программирования, такой как fmincon от Optimization Toolbox™. Задача может также быть решена с помощью плоского сокращением метода (см. Келли [45] при Оптимизации Портфеля). Для получения дополнительной информации смотрите раздел Algorithms setSolver. Узнать больше о рабочем процессе при использовании PortfolioCVaR объекты, смотрите Рабочий процесс Объекта PortfolioCVaR.

Что такое сценарии?

Поскольку условная подверженная риску значения оптимизация портфеля работает со сценариями актива, возвращается, чтобы выполнить оптимизацию, несколько путей существуют, чтобы задать и симулировать сценарии. Во многих приложениях с оптимизацией портфеля CVaR возвраты актива могут иметь отчетливо ненормальные вероятностные распределения с любыми несколькими режимы, раскладывание возвратов, усечение распределений, и т.д. В других приложениях возвраты актива моделируются как результат различных методов симуляции, которые могут включать симуляцию Монте-Карло, квазислучайную симуляцию, и т.д. Часто, базовое вероятностное распределение для факторов риска может быть многомерно нормальный, но результирующие преобразования достаточно нелинейны, чтобы привести к отчетливо ненормальному активу, возвращается.

Например, это происходит со связями и производными. В случае связей с ненулевой вероятностью значения по умолчанию такие сценарии, вероятно, включали бы актив, возвращается, которые являются −100%, чтобы указать на значение по умолчанию и некоторые значения, немного больше, чем −100% указать на скорости восстановления.

Несмотря на то, что PortfolioCVaR объект имеет функции, чтобы симулировать многомерные нормальные сценарии или из данных или из моменты (simulateNormalScenariosByData и simulateNormalScenariosByMoments), обычный подход должен задать сценарии непосредственно от ваших собственных функций симуляции. Эти сценарии вводятся непосредственно как матрица с выборкой для всех активов через каждую строку матрицы и с выборками для актива вниз каждый столбец матрицы. Архитектура инструментов оптимизации портфеля CVaR ссылается на сценарии через указатель на функцию так сценарии, которые были установлены, не может быть получен доступ непосредственно как свойство PortfolioCVaR объект.

Установка сценариев Используя функцию PortfolioCVaR

Предположим, что у вас есть матрица сценариев в AssetScenarios переменная. Сценарии установлены через PortfolioCVaR объект с:

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;

AssetScenarios = mvnrnd(m, C, 20000);

p = PortfolioCVaR('Scenarios', AssetScenarios);

disp(p.NumAssets)
disp(p.NumScenarios)
4

20000

Заметьте что PortfolioCVaR объект определяет и фиксирует количество активов в NumAssets и количество сценариев в NumScenarios на основе матрицы сценария. Можно изменить количество сценариев путем вызова PortfolioCVaR объект с различной матрицей сценария. Однако однажды NumAssets свойство было установлено в объекте, вы не можете ввести матрицу сценария с различным количеством активов. getScenarios функция позволяет вам восстановить сценарии с PortfolioCVaR объект. Можно также получить среднее значение и ковариацию использования сценариев estimateScenarioMoments.

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

scenarios = p.localScenarioHandle([], []);
и получить подмножество сценариев из строк startrow к endrowИспользование
scenarios = p.localScenarioHandle(startrow, endrow);
где 1startrowendrownumScenarios.

Установка Сценариев Используя Функцию setScenarios

Можно также установить использование сценариев setScenarios. Например, учитывая среднее значение и ковариацию актива возвращается в переменных m и C, свойства момента актива могут быть установлены:

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;

AssetScenarios = mvnrnd(m, C, 20000);

p = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);

disp(p.NumAssets)
disp(p.NumScenarios)
4

20000

Оценка среднего значения и ковариации сценариев

estimateScenarioMoments функция получает оценки для среднего значения и ковариации сценариев в PortfolioCVaR объект.

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;

AssetScenarios = mvnrnd(m, C, 20000);

p = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);
[mean, covar] = estimateScenarioMoments(p)
mean =

    0.0043
    0.0085
    0.0098
    0.0153


covar =

    0.0005    0.0003    0.0002    0.0000
    0.0003    0.0024    0.0017    0.0010
    0.0002    0.0017    0.0049    0.0029
    0.0000    0.0010    0.0029    0.0102

Симуляция нормальных сценариев

Как удобство, две функции (simulateNormalScenariosByData и simulateNormalScenariosByMoments) существуйте, чтобы симулировать сценарии из данных или моменты под предположением, что они распределяются, когда многомерный нормальный случайный актив возвращается.

Симуляция нормальных сценариев от возвратов или цен

Или учитывая возвратите или учитывая ценовые данные, используйте функцию simulateNormalScenariosByData симулировать многомерные нормальные сценарии. Или возвращается или цены, хранятся как матрицы с выборками, спускающимися по строкам и активам, идущим через столбцы. Кроме того, возвращается, или цены могут храниться в a table или timetable (см. Симулирующие Нормальные Сценарии от Данных временных рядов). Проиллюстрировать использование simulateNormalScenariosByData, сгенерируйте случайные выборки 120 наблюдений за активом, возвращается для четырех активов из среднего значения, и ковариация актива возвращается в переменных m и C с portsim. Поведение по умолчанию portsim создает симулированные данные с предполагаемым средним значением и ковариацией, идентичной входным моментам m и C. В дополнение к ряду возврата, созданному portsim в переменной X ценовой ряд создается в переменной Y:

m = [ 0.0042; 0.0083; 0.01; 0.15 ];
C = [ 0.005333 0.00034 0.00016 0;
0.00034 0.002408 0.0017 0.000992;
0.00016 0.0017 0.0048 0.0028;
0 0.000992 0.0028 0.010208 ];

X = portsim(m', C, 120);
Y = ret2tick(X);

Примечание

Оптимизация портфеля требует, чтобы вы использовали совокупные доходы и не только, цена возвращается. Так, “возвраты” должны быть совокупными доходами, и “цены” должны быть ценами совокупного дохода.

Учитывая актив возвращается и цены в переменных X и Y сверху, эта последовательность примеров демонстрирует эквивалентные способы симулировать многомерные нормальные сценарии для PortfolioCVaR объект. Примите PortfolioCVaR объект создается в p это использует актив, возвращается в использовании X simulateNormalScenariosByData:

p = PortfolioCVaR;
p = simulateNormalScenariosByData(p, X, 20000);

[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0043
    0.0083
    0.0102
    0.1507


passetcovar =

    0.0053    0.0003    0.0002    0.0000
    0.0003    0.0024    0.0017    0.0010
    0.0002    0.0017    0.0049    0.0028
    0.0000    0.0010    0.0028    0.0101
Моменты, которые вы получаете из этой симуляции, будут, вероятно, отличаться с моментов, перечисленных здесь, потому что сценарии являются случайными выборками от предполагаемого многомерного нормального распределения вероятностей входа, возвращает X.

Поведение по умолчанию simulateNormalScenariosByData должен работать с активом, возвращается. Если, вместо этого, у вас есть цены активов как в переменной Y, simulateNormalScenariosByData признает, что аргумент пары "имя-значение" называет 'DataFormat' с соответствующим набором значений к 'prices' указать, что вход к функции в форме цен активов и не возвращается (значение по умолчанию для 'DataFormat' аргументом является 'returns'). Этот пример симулирует сценарии с данными цен активов в Y для PortfolioCVaR объект q:

p = PortfolioCVaR;
p = simulateNormalScenariosByData(p, Y, 20000, 'dataformat', 'prices');

[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0043
    0.0084
    0.0094
    0.1490


passetcovar =

    0.0054    0.0004    0.0001   -0.0000
    0.0004    0.0024    0.0016    0.0009
    0.0001    0.0016    0.0048    0.0028
   -0.0000    0.0009    0.0028    0.0100

Симуляция нормальных сценариев с Недостающими данными

Часто при работе с несколькими активами, у вас есть недостающие данные, обозначенные NaN значения в вашем возврате или ценовых данных. Несмотря на то, что Многомерная Нормальная Регрессия вдается в подробности о регрессии с недостающими данными, simulateNormalScenariosByData функция имеет имя аргумента пары "имя-значение" 'MissingData' это указывает с булевым значением, использовать ли недостающие возможности данных Financial Toolbox™. Значение по умолчанию для 'MissingData' false который удаляет все выборки с NaN значения. Если, однако, 'MissingData' установлен в true, simulateNormalScenariosByData использует алгоритм ECM, чтобы оценить моменты актива. В этом примере показано, как это работает над ценовыми данными с отсутствующими значениями:

m = [ 0.0042; 0.0083; 0.01; 0.15 ];
C = [ 0.005333 0.00034 0.00016 0;
0.00034 0.002408 0.0017 0.000992;
0.00016 0.0017 0.0048 0.0028;
0 0.000992 0.0028 0.010208 ];

X = portsim(m', C, 120);
Y = ret2tick(X);
Y(1:20,1) = NaN;
Y(1:12,4) = NaN;

Заметьте что цены выше в Y имейте отсутствующие значения в первом и четвертом ряду.

p = PortfolioCVaR;
p = simulateNormalScenariosByData(p, Y, 20000, 'dataformat', 'prices');

q = PortfolioCVaR;
q = simulateNormalScenariosByData(q, Y, 20000, 'dataformat', 'prices', 'missingdata', true);

[passetmean, passetcovar] = estimateScenarioMoments(p)
[qassetmean, qassetcovar] = estimateScenarioMoments(q)
passetmean =

    0.0020
    0.0074
    0.0078
    0.1476


passetcovar =

    0.0055    0.0003   -0.0001   -0.0003
    0.0003    0.0024    0.0019    0.0012
   -0.0001    0.0019    0.0050    0.0028
   -0.0003    0.0012    0.0028    0.0101


qassetmean =

    0.0024
    0.0085
    0.0106
    0.1482


qassetcovar =

    0.0071    0.0004   -0.0001   -0.0004
    0.0004    0.0032    0.0022    0.0012
   -0.0001    0.0022    0.0063    0.0034
   -0.0004    0.0012    0.0034    0.0127
Первый PortfolioCVaR объект, p, содержит сценарии, полученные из ценовых данных в Y где NaN значения отбрасываются и второй PortfolioCVaR объект, q, содержит сценарии, полученные из ценовых данных в Y это вмещает отсутствующие значения. Каждый раз, когда вы запускаете этот пример, вы получаете различные оценки за моменты в p и q.

Симуляция нормальных сценариев от данных временных рядов

simulateNormalScenariosByData функционируйте неявно работает с матрицами данных или данных в a table или timetable объект, использующий те же правила для того, являются ли данные возвратами или ценами. Чтобы проиллюстрировать, использовать array2timetable создать расписание для 14 активов от CAPMuniverse и использование расписание, чтобы симулировать сценарии для PortfolioCVaR.

load CAPMuniverse
time = datetime(Dates,'ConvertFrom','datenum');
stockTT = array2timetable(Data,'RowTimes',time, 'VariableNames', Assets);
stockTT.Properties
% Notice that GOOG has missing data, because it was not listed before Aug 2004
head(stockTT, 5)
ans = 

  TimetableProperties with properties:

             Description: ''
                UserData: []
          DimensionNames: {'Time'  'Variables'}
           VariableNames: {'AAPL'  'AMZN'  'CSCO'  'DELL'  'EBAY'  'GOOG'  'HPQ'  'IBM'  'INTC'  'MSFT'  'ORCL'  'YHOO'  'MARKET'  'CASH'}
    VariableDescriptions: {}
           VariableUnits: {}
      VariableContinuity: []
                RowTimes: [1471×1 datetime]
               StartTime: 03-Jan-2000
              SampleRate: NaN
                TimeStep: NaN
        CustomProperties: No custom properties are set.
      Use addprop and rmprop to modify CustomProperties.

ans =

  5×14 timetable

       Time          AAPL         AMZN         CSCO         DELL         EBAY       GOOG       HPQ          IBM         INTC         MSFT         ORCL         YHOO        MARKET         CASH   
    ___________    _________    _________    _________    _________    _________    ____    _________    _________    _________    _________    _________    _________    _________    __________

    03-Jan-2000     0.088805       0.1742     0.008775    -0.002353      0.12829    NaN       0.03244     0.075368      0.05698    -0.001627     0.054078     0.097784    -0.012143    0.00020522
    04-Jan-2000    -0.084331     -0.08324     -0.05608     -0.08353    -0.093805    NaN     -0.075613    -0.033966    -0.046667    -0.033802      -0.0883    -0.067368     -0.03166    0.00020339
    05-Jan-2000     0.014634     -0.14877    -0.003039     0.070984     0.066875    NaN     -0.006356      0.03516     0.008199     0.010567    -0.052837    -0.073363     0.011443    0.00020376
    06-Jan-2000    -0.086538    -0.060072    -0.016619    -0.038847    -0.012302    NaN     -0.063688    -0.017241     -0.05824    -0.033477    -0.058824     -0.10307     0.011743    0.00020266
    07-Jan-2000     0.047368     0.061013       0.0587    -0.037708    -0.000964    NaN      0.028416    -0.004386      0.04127     0.013091     0.076771      0.10609      0.02393    0.00020157

Используйте 'MissingData' опция предложена PortfolioCVaR с учетом недостающих данных.

p = PortfolioCVaR;
p = simulateNormalScenariosByData(p, stockTT, 20000 ,'missingdata',true);
[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0012
    0.0007
   -0.0005
   -0.0000
    0.0016
    0.0043
   -0.0001
    0.0000
    0.0001
   -0.0002
    0.0000
    0.0004
    0.0001
    0.0001


passetcovar =

    0.0013    0.0005    0.0006    0.0005    0.0006    0.0003    0.0005    0.0003    0.0006    0.0004    0.0005    0.0006    0.0002   -0.0000
    0.0005    0.0024    0.0007    0.0005    0.0010    0.0005    0.0005    0.0003    0.0006    0.0004    0.0006    0.0011    0.0002   -0.0000
    0.0006    0.0007    0.0013    0.0006    0.0007    0.0004    0.0006    0.0004    0.0008    0.0005    0.0008    0.0008    0.0002   -0.0000
    0.0005    0.0005    0.0006    0.0009    0.0006    0.0002    0.0005    0.0003    0.0006    0.0004    0.0005    0.0006    0.0002   -0.0000
    0.0006    0.0010    0.0007    0.0006    0.0018    0.0007    0.0005    0.0003    0.0006    0.0005    0.0007    0.0011    0.0002   -0.0000
    0.0003    0.0005    0.0004    0.0002    0.0007    0.0013    0.0002    0.0002    0.0002    0.0002    0.0003    0.0011    0.0001   -0.0000
    0.0005    0.0005    0.0006    0.0005    0.0005    0.0002    0.0010    0.0003    0.0005    0.0003    0.0005    0.0006    0.0002   -0.0000
    0.0003    0.0003    0.0004    0.0003    0.0003    0.0002    0.0003    0.0005    0.0004    0.0002    0.0004    0.0004    0.0002    0.0000
    0.0006    0.0006    0.0008    0.0006    0.0006    0.0002    0.0005    0.0004    0.0011    0.0005    0.0007    0.0007    0.0002   -0.0000
    0.0004    0.0004    0.0005    0.0004    0.0005    0.0002    0.0003    0.0002    0.0005    0.0006    0.0004    0.0005    0.0002   -0.0000
    0.0005    0.0006    0.0008    0.0005    0.0007    0.0003    0.0005    0.0004    0.0007    0.0004    0.0014    0.0007    0.0002   -0.0000
    0.0006    0.0011    0.0008    0.0006    0.0011    0.0011    0.0006    0.0004    0.0007    0.0005    0.0007    0.0020    0.0002   -0.0000
    0.0002    0.0002    0.0002    0.0002    0.0002    0.0001    0.0002    0.0002    0.0002    0.0002    0.0002    0.0002    0.0001   -0.0000
   -0.0000   -0.0000   -0.0000   -0.0000   -0.0000   -0.0000   -0.0000    0.0000   -0.0000   -0.0000   -0.0000   -0.0000   -0.0000    0.0000

Используйте вход 'DataFormat' значения имени чтобы обработать возвращаются или ценовые данные и 'MissingData' проигнорировать или использовать выборки с отсутствующими значениями. Кроме того, simulateNormalScenariosByData имена актива извлечений или идентификаторы от a table или timetable если аргумент 'GetAssetList' установлен в true (значением по умолчанию является false). Если 'GetAssetList' значением является true, идентификаторы используются, чтобы установить AssetList свойство PortfolioCVaR объект. Таким образом, повторяя формирование PortfolioCVaR объект p от предыдущего примера с 'GetAssetList' отметьте набор к true извлекает имена столбцов из объекта расписания:

p = simulateNormalScenariosByData(p, stockTT, 20000 ,'missingdata',true, 'GetAssetList', true);
disp(p.AssetList)
 'AAPL'    'AMZN'    'CSCO'    'DELL'    'EBAY'    'GOOG'    'HPQ'    'IBM'    'INTC'    'MSFT'    'ORCL'    'YHOO'    'MARKET'    'CASH'

Если вы устанавливаете the'GetAssetList' отметьте набор к true и ваши входные данные находятся в матрице, simulateNormalScenariosByData использует схему маркировки значения по умолчанию от setAssetList как описано в Подготовке Списка Идентификаторов Актива.

Симуляция нормальных сценариев со средним значением и ковариацией

Учитывая среднее значение и ковариацию актива возвращается, используйте simulateNormalScenariosByMoments функция, чтобы симулировать многомерные нормальные сценарии. Среднее значение может быть или строкой или вектор-столбцом, и ковариационная матрица должна быть симметричной положительно-полуопределенной матрицей. Различные правила для скалярного расширения применяются. Проиллюстрировать использование simulateNormalScenariosByMoments, начните с моментов в m и C и сгенерируйте 20 000 сценариев:

m = [ 0.0042; 0.0083; 0.01; 0.15 ];
C = [ 0.005333 0.00034 0.00016 0;
0.00034 0.002408 0.0017 0.000992;
0.00016 0.0017 0.0048 0.0028;
0 0.000992 0.0028 0.010208 ];

p = PortfolioCVaR;
p = simulateNormalScenariosByMoments(p, m, C, 20000);
[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0049
    0.0083
    0.0101
    0.1503


passetcovar =

    0.0053    0.0003    0.0002   -0.0000
    0.0003    0.0024    0.0017    0.0010
    0.0002    0.0017    0.0047    0.0028
   -0.0000    0.0010    0.0028    0.0101

simulateNormalScenariosByMoments выполняет скалярное расширение на аргументах в течение моментов актива, возвращается. Если NumAssets не был уже установлен, скалярный аргумент интерпретирован как скаляр с NumAssets установите на 1. simulateNormalScenariosByMoments обеспечивает дополнительный дополнительный аргумент, чтобы задать количество активов так, чтобы скалярное расширение работало с правильным количеством активов. Кроме того, если или скаляр или вектор вводятся для ковариации актива, возвращается, диагональная матрица формируется таким образом, что скаляр расширяется по диагонали, и вектор становится диагональю.

Смотрите также

| | | | | |

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

Больше о

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