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

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

| | | |

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

Больше о