Актив возвращается и сценарии Используя объект PortfolioMAD

Как стохастические работы оптимизации

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 объект.

Установка сценариев Используя функцию 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);
где 1startrowendrownumScenarios.

Установка сценариев Используя 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
Моменты, которые вы получаете из этой симуляции, будут, вероятно, отличаться с моментов, перечисленных здесь, потому что сценарии являются случайными выборками от предполагаемого многомерного нормального распределения вероятностей входа, возвращает X.

Поведение по умолчанию 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 = 

  struct with fields:

             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]

Используйте '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 извлекает имена столбцов из объекта расписания:

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 обеспечивает дополнительный дополнительный аргумент, чтобы задать количество активов так, чтобы скалярное расширение работало с правильным количеством активов. Кроме того, если или скаляр или вектор вводятся для ковариации актива, возвращается, диагональная матрица формируется таким образом, что скаляр расширяется по диагонали, и вектор становится диагональю.

Смотрите также

| | | |

Связанные примеры

Больше о