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
объект.
Предположим, что у вас есть матрица сценариев в 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);
1
≤ startrow
≤ endrow
≤ numScenarios
.Можно также установить сценарии с помощью 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
Поведение по умолчанию 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
обеспечивает дополнительный дополнительный аргумент, чтобы задать количество активов так, чтобы скалярное расширение работало с правильным количеством активов. Кроме того, если или скаляр или вектор вводятся для ковариации актива, возвращается, диагональная матрица формируется таким образом, что скаляр расширяется по диагонали, и вектор становится диагональю.
PortfolioCVaR
| estimatePortVaR
| setCosts
| setProbabilityLevel
| setScenarios
| simulateNormalScenariosByData
| simulateNormalScenariosByMoments