MAD портфеля является средним абсолютным отклонением. Для определения функции MAD смотрите Прокси Риска. Несмотря на то, что аналитические решения для MAD существуют для нескольких вероятностных распределений, альтернатива должна вычислить ожидание Обезумевшего от выборок от вероятностного распределения актива, возвращается. Эти выборки названы сценариями и, даны набор сценариев, задача оптимизации портфеля становится стохастической задачей оптимизации.
В зависимости от весов портфеля MAD портфеля является выпуклой несглаженной функцией (см. Конно и Иамазаки [50] при Оптимизации Портфеля). Объект PortfolioMAD вычисляет MAD как эту нелинейную функцию, которая может быть обработана решателем fmincon
Optimization Toolbox™. Решатель нелинейного программирования fmincon
имеет несколько алгоритмов, которые могут быть выбраны с setSolver
функцией, два алгоритма, которые работают лучше всего на практике, является 'sqp'
и 'active-set'
.
Существуют переформулировки задачи оптимизации портфеля MAD (см. Конно и Иамазаки [50] при Оптимизации Портфеля), что результат в задаче линейного программирования, которая может быть решена или со стандартными линейными методами программирования или с решателями стохастического программирования. PortfolioMAD
объект, однако, не переформулирует проблему таким способом. PortfolioMAD
объект вычисляет MAD как нелинейную функцию. Выпуклость MAD, в зависимости от весов портфеля и тусклых ребер, когда количество сценариев является большим, делает задачу оптимизации портфеля MAD послушной, на практике, для определенных решателей нелинейного программирования, такой как fmincon
от Optimization Toolbox. Узнать больше о рабочем процессе при использовании PortfolioMAD
объекты, смотрите Рабочий процесс Объекта PortfolioMAD.
Поскольку средняя абсолютная оптимизация портфеля отклонения работает со сценариями актива, возвращается, чтобы выполнить оптимизацию, несколько путей существуют, чтобы задать и симулировать сценарии. Во многих приложениях с оптимизацией портфеля MAD возвраты актива могут иметь отчетливо ненормальные вероятностные распределения с любыми несколькими режимы, раскладывание возвратов, усечение распределений, и т.д. В других приложениях возвраты актива моделируются как результат различных методов симуляции, которые могут включать симуляцию Монте-Карло, квазислучайную симуляцию, и т.д. Часто, базовое вероятностное распределение для факторов риска может быть многомерно нормальный, но результирующие преобразования достаточно нелинейны, чтобы привести к отчетливо ненормальному активу, возвращается.
Например, это происходит со связями и производными. В случае связей с ненулевой вероятностью значения по умолчанию такие сценарии, вероятно, включали бы актив, возвращается, которые являются −100%, чтобы указать на значение по умолчанию и некоторые значения, немного больше, чем −100% указать на скорости восстановления.
Несмотря на то, что PortfolioMAD
объект имеет функции, чтобы симулировать многомерные нормальные сценарии или из данных или из моменты (simulateNormalScenariosByData
и simulateNormalScenariosByMoments
), обычный подход должен задать сценарии непосредственно от ваших собственных функций симуляции. Эти сценарии вводятся непосредственно как матрица с выборкой для всех активов через каждую строку матрицы и с выборками для актива вниз каждый столбец матрицы. Архитектура инструментов оптимизации портфеля MAD ссылается на сценарии через указатель на функцию так сценарии, которые были установлены, не может быть получен доступ непосредственно как свойство PortfolioMAD
объект.
Предположим, что у вас есть матрица сценариев в AssetScenarios
переменная. Сценарии установлены через PortfolioMAD
объект с:
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 = PortfolioMAD('Scenarios', AssetScenarios);
disp(p.NumAssets)
disp(p.NumScenarios)
4 20000
Заметьте, что PortfolioMAD
объект определяет и фиксирует количество активов в NumAssets
и количество сценариев в NumScenarios
на основе матрицы сценария. Можно изменить количество сценариев путем вызова PortfolioMAD
объект с различной матрицей сценария. Однако однажды NumAssets
свойство было установлено в объекте, вы не можете ввести матрицу сценария с различным количеством активов. getScenarios
функция позволяет вам восстановить сценарии с PortfolioMAD
объект. Можно также получить среднее значение и ковариацию использования сценариев estimateScenarioMoments
.
Несмотря на то, что не рекомендуемый для обычного пользователя, альтернативный путь существует, чтобы восстановить сценарии путем работы с указателем на функцию, который указывает на сценарии в PortfolioMAD
объект. Получить доступ к некоторым или всем сценариям от PortfolioMAD
объект, скрытое свойство localScenarioHandle
указатель на функцию, который указывает на функцию, чтобы получить сценарии, которые были уже установлены. Получить сценарии непосредственно от PortfolioMAD
объект p
Использование
scenarios = p.localScenarioHandle([], []);
startrow
к endrow
Использованиеscenarios = p.localScenarioHandle(startrow, endrow);
1
≤ startrow
≤ endrow
≤ numScenarios
.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 = PortfolioMAD; p = setScenarios(p, AssetScenarios); disp(p.NumAssets) disp(p.NumScenarios)
4 20000
estimateScenarioMoments
функция получает оценки для среднего значения и ковариации сценариев в PortfolioMAD
объект.
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 = PortfolioMAD; p = setScenarios(p, AssetScenarios); [mean, covar] = estimateScenarioMoments(p)
mean = 0.0044 0.0084 0.0108 0.0155 covar = 0.0005 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.0103
Как удобство, две функции (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 сверху, эта последовательность примеров демонстрирует эквивалентные способы симулировать многомерные нормальные сценарии для PortfolioMAD
объект. Примите PortfolioMAD
объект создается в p
это использует актив, возвращается в использовании X simulateNormalScenariosByData
:
p = PortfolioMAD; p = simulateNormalScenariosByData(p, X, 20000); [passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean = 0.0033 0.0085 0.0095 0.1503 passetcovar = 0.0055 0.0004 0.0002 0.0001 0.0004 0.0024 0.0017 0.0010 0.0002 0.0017 0.0049 0.0028 0.0001 0.0010 0.0028 0.0102
Поведение по умолчанию simulateNormalScenariosByData
должен работать с активом, возвращается. Если, вместо этого, у вас есть цены активов как в переменной Y, simulateNormalScenariosByData
признает, что аргумент пары "имя-значение" называет 'DataFormat'
с соответствующим набором значений к 'prices'
указать, что вход к функции в форме цен активов и не возвращается (значение по умолчанию для 'DataFormat'
аргументом является 'returns'
). Этот пример симулирует сценарии с данными цен активов в Y для PortfolioMAD
объект q
:
p = PortfolioMAD; p = simulateNormalScenariosByData(p, Y, 20000, 'dataformat', 'prices'); [passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean = 0.0043 0.0083 0.0099 0.1500 passetcovar = 0.0053 0.0003 0.0001 0.0002 0.0003 0.0024 0.0017 0.0010 0.0001 0.0017 0.0047 0.0027 0.0002 0.0010 0.0027 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 = PortfolioMAD; p = simulateNormalScenariosByData(p, Y, 20000, 'dataformat', 'prices'); q = PortfolioMAD; q = simulateNormalScenariosByData(q, Y, 20000, 'dataformat', 'prices', 'missingdata', true); [passetmean, passetcovar] = estimateScenarioMoments(p) [qassetmean, qassetcovar] = estimateScenarioMoments(q)
passetmean = 0.0095 0.0103 0.0124 0.1505 passetcovar = 0.0054 0.0000 -0.0005 -0.0006 0.0000 0.0021 0.0015 0.0010 -0.0005 0.0015 0.0046 0.0026 -0.0006 0.0010 0.0026 0.0100 qassetmean = 0.0092 0.0082 0.0094 0.1463 qassetcovar = 0.0071 -0.0000 -0.0006 -0.0006 -0.0000 0.0032 0.0023 0.0015 -0.0006 0.0023 0.0064 0.0036 -0.0006 0.0015 0.0036 0.0133
PortfolioMAD
объект, p
, содержит сценарии, полученные из ценовых данных в Y
где NaN
значения отбрасываются и второй PortfolioMAD
объект, q
, содержит сценарии, полученные из ценовых данных в Y
это вмещает отсутствующие значения. Каждый раз, когда вы запускаете этот пример, вы получаете различные оценки за моменты в p
и q
. simulateNormalScenariosByData
функция признает, что актив возвращается или цены, сохраненные в table
или timetable
. simulateNormalScenariosByData
функционируйте неявно работает с матрицами данных или данных в объекте таблицы или расписания использование тех же правил для того, являются ли данные возвратами или ценами. Чтобы проиллюстрировать, использовать 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'
опция предложена PortfolioMAD с учетом недостающих данных.
p = PortfolioMAD;
p = simulateNormalScenariosByData(p, stockTT, 20000 ,'missingdata',true);
[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean = 0.0017 0.0013 0.0005 0.0001 0.0019 0.0049 0.0003 0.0003 0.0006 -0.0001 0.0005 0.0011 0.0002 0.0001 passetcovar = 0.0014 0.0005 0.0006 0.0006 0.0006 0.0003 0.0005 0.0003 0.0006 0.0004 0.0005 0.0007 0.0002 -0.0000 0.0005 0.0025 0.0007 0.0005 0.0010 0.0005 0.0005 0.0003 0.0006 0.0004 0.0006 0.0012 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.0006 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.0008 0.0002 -0.0000 0.0007 0.0012 0.0008 0.0006 0.0011 0.0011 0.0006 0.0004 0.0007 0.0005 0.0008 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
свойство PortfolioMAD
объект. Таким образом, повторяя формирование PortfolioMAD
объект 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 = PortfolioMAD; p = simulateNormalScenariosByMoments(p, m, C, 20000); [passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean = 0.0040 0.0084 0.0105 0.1513 passetcovar = 0.0053 0.0003 0.0002 0.0001 0.0003 0.0024 0.0017 0.0009 0.0002 0.0017 0.0048 0.0028 0.0001 0.0009 0.0028 0.0102
simulateNormalScenariosByMoments
выполняет скалярное расширение на аргументах в течение моментов актива, возвращается. Если NumAssets
не был уже установлен, скалярный аргумент интерпретирован как скаляр с NumAssets
установите на 1
. simulateNormalScenariosByMoments
обеспечивает дополнительный дополнительный аргумент, чтобы задать количество активов так, чтобы скалярное расширение работало с правильным количеством активов. Кроме того, если или скаляр или вектор вводятся для ковариации актива, возвращается, диагональная матрица формируется таким образом, что скаляр расширяется по диагонали, и вектор становится диагональю.
PortfolioMAD
| setCosts
| setScenarios
| simulateNormalScenariosByMoments
| simulateNormalScenariosByData