Актив возвращается и сценарии Используя объект 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, чтобы моделировать многомерные нормальные сценарии. Или возвращается или цены, хранятся как матрицы с выборками, спускающимися по строкам и активам, идущим через столбцы. Кроме того, возвращается, или цены могут храниться в 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 неявно работает с матрицами данных или данных в объекте 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 = 

  struct with fields:

             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]

Используйте опцию '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 извлекает имена актива или идентификаторы от 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 обеспечивает дополнительный дополнительный аргумент, чтобы задать количество активов так, чтобы скалярное расширение работало с правильным количеством активов. Кроме того, если или скаляр или вектор вводятся для ковариации актива, возвращается, диагональная матрица формируется таким образом, что скаляр расширяется по диагонали, и вектор становится диагональю.

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

| | | | | |

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

Больше о

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