CVaR портфеля является условным ожиданием. (Определение функции CVaR см. в прокси риска».) Поэтому задача оптимизации портфеля CVaR является стохастической задачей оптимизации. Учитывая выборку сценариев, условное ожидание, которое определяет выборку CVaR портфеля, может быть выражено как конечная сумма, взвешенная средним значением потерь. Веса потерь зависят от их относительной величины; для уровня доверия α только худшие (1 − α) x 100% потери получают положительный вес. Как функция от весов портфеля, CVaR портфеля является выпуклой функцией (см. [48], [49] Rockafellar & Uryasev в Portfolio Optimization). Это также функция nonsmooth, но ее ребра менее резкие, когда размер выборки увеличивается.
Существуют реформуляции задачи оптимизации портфеля CVaR (см. [48], [49] в Rockafellar & Uryasev), которые приводят к задаче линейного программирования, которая может быть решена либо стандартными методами линейного программирования, либо решателями стохастического программирования. The PortfolioCVaR
объект, однако, не переформулирует задачу таким образом. The PortfolioCVaR
объект вычисляет CVaR как нелинейную функцию. Выпуклость CVaR, как функции от весов портфеля и тусклых ребер, когда количество сценариев велико, делает задачу оптимизации портфеля CVaR отслеживаемой, на практике, для некоторых нелинейных решателей программирования, таких как fmincon
из Optimization Toolbox™. Задача может быть также решена с помощью метода секущей плоскости (см. Келли [45] в Portfolio Optimization). Для получения дополнительной информации см. Раздел Алгоритмы setSolver
. Чтобы узнать больше о рабочем процессе при использовании PortfolioCVaR
объекты, см. Рабочий процесс объекта PortfolioCVaR.
Поскольку условная оптимизация портфеля в группе риска работает со сценариями возврата активов для выполнения оптимизации, существует несколько способов определения и моделирования сценариев. Во многих приложениях с оптимизацией портфеля CVaR, возвраты активов могут иметь явно ненормальные распределения вероятностей с любыми несколькими режимами, binning of return, усечение распределений и так далее. В других приложениях возвраты активов моделируются как результат различных методов моделирования, которые могут включать симуляцию Монте-Карло, квазислучайную симуляцию и так далее. Часто базовое распределение вероятностей для факторов риска может быть многомерным нормальным, но результирующие преобразования являются достаточно нелинейными, чтобы привести к явно ненормальным возвратам активов.
Для примера это происходит со связями и производными инструментами. В случае облигаций с ненулевой вероятностью дефолта такие сценарии, вероятно, будут включать возвраты активов, которая − 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 = 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
извлекает имена активов или идентификаторы из table
или timetable
если аргумент 'GetAssetList'
установлено в true
(значение по умолчанию является false
). Если на 'GetAssetList'
значение true
идентификаторы используются для установки AssetList
свойство PortfolioCVaR
объект. Таким образом, повторяя формирование PortfolioCVaR
p объекта
из предыдущего примера с 'GetAssetList'
флаг установлен на true
извлекает имена столбцов из объекта timetable:
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'
Если вы задаете '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
предоставляет дополнительный необязательный аргумент для определения количества активов, чтобы скалярное расширение работало с правильным количеством активов. В сложение, если либо скаляр, либо вектор является входным для ковариации возвратов активов, формируется диагональная матрица, так что скаляр расширяется вдоль диагонали, а вектор становится диагональным.
estimatePortVaR
| PortfolioCVaR
| setCosts
| setProbabilityLevel
| setScenarios
| simulateNormalScenariosByData
| simulateNormalScenariosByMoments