MAD портфеля - это среднее абсолютное отклонение. Определение функции MAD см. в разделе Прокси-сервер угроз. Хотя аналитические решения для MAD существуют для нескольких вероятностных распределений, альтернативой является вычисление ожиданий для MAD с выборками из вероятностного распределения доходности активов. Эти образцы называются сценариями, и, учитывая совокупность сценариев, задача оптимизации портфеля становится стохастической задачей оптимизации.
В зависимости от веса портфеля MAD портфеля является выпуклой неровной функцией (см. Konno and Yamazaki [50] в Portfolio Optimization). Объект MAD вычисляет MAD как эту нелинейную функцию, которая может быть обработана решателем fmincon Toolbox™ оптимизации. Решатель нелинейного программирования fmincon имеет несколько алгоритмов, которые можно выбрать с помощью setSolver функция, два алгоритма, которые работают лучше всего на практике 'sqp' и 'active-set'.
Существуют переформуляции задачи оптимизации портфеля MAD (см. Konno and Yamazaki [50] в Portfolio Optimization), которые приводят к проблеме линейного программирования, которую можно решить либо стандартными методами линейного программирования, либо стохастическими решателями программирования. PortfolioMAD однако объект не переформулирует проблему таким образом. PortfolioMAD объект вычисляет MAD как нелинейную функцию. Выпуклость MAD, как функция весов портфеля и тусклых краев, когда число сценариев велико, делает задачу оптимизации портфеля MAD отслеживаемой на практике для некоторых решателей нелинейного программирования, таких как fmincon из панели инструментов оптимизации. Дополнительные сведения о рабочем процессе при использовании PortfolioMAD см. раздел Рабочий процесс объекта MAD.
Поскольку оптимизация портфеля со средним абсолютным отклонением работает со сценариями возврата активов для выполнения оптимизации, существует несколько способов определения и моделирования сценариев. Во многих приложениях с оптимизацией портфеля 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 для моделирования многомерных нормальных сценариев. Возвраты или цены сохраняются в виде матриц с выборками по строкам и основным средствам по столбцам. Кроме того, возвраты или цены могут храниться в 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' указывает с логическим значением, следует ли использовать отсутствующие возможности данных финансового 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. simulateNormalScenariosByData функция принимает возврат основных средств или цены, хранящиеся в table или timetable. simulateNormalScenariosByData функция неявно работает с матрицами данных или данных в объекте таблицы или графика, используя те же правила для определения того, являются ли данные возвратом или ценами. Для иллюстрации используйте array2timetable чтобы создать график для 14 активов из CAPMuniverse и использование графика для моделирования сценариев для CCVaR.
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' опция, предложенная MAD для учета отсутствующих данных.
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 извлекает имена столбцов из объекта расписания:
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