MAD портфеля является средним абсолютным отклонением. Для определения функции MAD смотрите Прокси. Несмотря на то, что аналитические решения для MAD существуют для нескольких распределений вероятностей, альтернативой является вычисление ожиданий для MAD с выборками из распределения вероятностей возвратов активов. Эти выборки называются сценариями, и, учитывая набор сценариев, задача оптимизации портфеля становится стохастической задачей оптимизации.
Как функция от весов портфеля, MAD портфеля является выпуклой неоднородной функцией (см. Konno и Yamazaki [50] в Portfolio Optimization). Объект PortfolioMAD вычисляет MAD как эту нелинейную функцию, которую может обрабатывать решатель fmincon Optimization Toolbox™. Решатель нелинейного программирования fmincon имеет несколько алгоритмов, которые могут быть выбраны с setSolver функция, два алгоритма, которые работают лучше всего на практике 'sqp' и 'active-set'.
Существуют реформации задачи оптимизации портфеля MAD (см. Konno и Yamazaki [50] в Portfolio Optimization), которые приводят к задаче линейного программирования, которая может быть решена либо стандартными методами линейного программирования, либо стохастическими решателями программирования. The PortfolioMAD объект, однако, не переформулирует задачу таким образом. The PortfolioMAD объект вычисляет MAD как нелинейную функцию. Выпуклость MAD, как функции от весов портфеля и тусклых ребер, когда количество сценариев велико, делает задачу оптимизации портфеля MAD отслеживаемой, на практике, для некоторых решателей нелинейного программирования, таких как fmincon из Optimization Toolbox. Чтобы узнать больше о рабочем процессе при использовании PortfolioMAD объекты, см. раздел Рабочий процесс объекта PortfolioMAD.
Поскольку оптимизация портфеля по среднему абсолютному отклонению работает со сценариями возврата активов для выполнения оптимизации, существует несколько способов определения и моделирования сценариев. Во многих приложениях с оптимизацией портфеля MAD, возвраты активов могут иметь явно ненормальные распределения вероятностей с несколькими режимами, binning of returning, усечение распределений и так далее. В других приложениях возвраты активов моделируются как результат различных методов моделирования, которые могут включать симуляцию Монте-Карло, квазислучайную симуляцию и так далее. Часто базовое распределение вероятностей для факторов риска может быть многомерным нормальным, но результирующие преобразования являются достаточно нелинейными, чтобы привести к явно ненормальным возвратам активов.
Для примера это происходит со связями и производными инструментами. В случае облигаций с ненулевой вероятностью дефолта такие сценарии, вероятно, будут включать возвраты активов, которая − 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 функция для моделирования многомерных сценариев нормали. Возвраты или цены хранятся как матрицы с выборками, идущими вниз по строкам и активам, идущим через столбцы. В сложении возвратов или цены могут храниться в 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.0133PortfolioMAD объект, p, содержит сценарии, полученные из данных о цене в Y где NaN значения отбрасываются, и второй PortfolioMAD объект, q, содержит сценарии, полученные из данных о цене в Y которые учитывают отсутствующие значения. Каждый раз, когда вы запускаете этот пример, вы получаете различные оценки для моментов в p и q. The 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 извлекает имена активов или идентификаторы из table или timetable если аргумент 'GetAssetList' установлено в true (значение по умолчанию является false). Если на 'GetAssetList' значение trueидентификаторы используются для установки AssetList свойство PortfolioMAD объект. Таким образом, повторяя формирование PortfolioMAD 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 = 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.0102simulateNormalScenariosByMoments выполняет скалярное расширение аргументов для моментов возвратов активов. Если NumAssets еще не задан, скалярный аргумент интерпретируется как скаляр с NumAssets установлено на 1. simulateNormalScenariosByMoments предоставляет дополнительный необязательный аргумент для определения количества активов, чтобы скалярное расширение работало с правильным количеством активов. В сложение, если либо скаляр, либо вектор является входным для ковариации возвратов активов, формируется диагональная матрица, так что скаляр расширяется вдоль диагонали, а вектор становится диагональным.
PortfolioMAD | setCosts | setScenarios | simulateNormalScenariosByData | simulateNormalScenariosByMoments