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.0133
PortfolioMAD
объект, 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.0102
simulateNormalScenariosByMoments
выполняет скалярное расширение аргументов для моментов возвратов активов. Если NumAssets
еще не задан, скалярный аргумент интерпретируется как скаляр с NumAssets
установлено на 1
. simulateNormalScenariosByMoments
предоставляет дополнительный необязательный аргумент для определения количества активов, чтобы скалярное расширение работало с правильным количеством активов. В сложение, если либо скаляр, либо вектор является входным для ковариации возвратов активов, формируется диагональная матрица, так что скаляр расширяется вдоль диагонали, а вектор становится диагональным.
PortfolioMAD
| setCosts
| setScenarios
| simulateNormalScenariosByData
| simulateNormalScenariosByMoments