Возвраты активов и сценарии с использованием объекта PortfolioMAD

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

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

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

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

См. также

| | | |

Похожие примеры

Подробнее о