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

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

CVaR портфеля является условным ожиданием. (Определение функции CVaR см. в прокси риска».) Поэтому задача оптимизации портфеля CVaR является стохастической задачей оптимизации. Учитывая выборку сценариев, условное ожидание, которое определяет выборку CVaR портфеля, может быть выражено как конечная сумма, взвешенная средним значением потерь. Веса потерь зависят от их относительной величины; для уровня доверия α только худшие (1 − α) x 100% потери получают положительный вес. Как функция от весов портфеля, CVaR портфеля является выпуклой функцией (см. [48], [49] Rockafellar & Uryasev в Portfolio Optimization). Это также функция nonsmooth, но ее ребра менее резкие, когда размер выборки увеличивается.

Существуют реформуляции задачи оптимизации портфеля CVaR (см. [48], [49] в Rockafellar & Uryasev), которые приводят к задаче линейного программирования, которая может быть решена либо стандартными методами линейного программирования, либо решателями стохастического программирования. The PortfolioCVaR объект, однако, не переформулирует задачу таким образом. The PortfolioCVaR объект вычисляет CVaR как нелинейную функцию. Выпуклость CVaR, как функции от весов портфеля и тусклых ребер, когда количество сценариев велико, делает задачу оптимизации портфеля CVaR отслеживаемой, на практике, для некоторых нелинейных решателей программирования, таких как fmincon из Optimization Toolbox™. Задача может быть также решена с помощью метода секущей плоскости (см. Келли [45] в Portfolio Optimization). Для получения дополнительной информации см. Раздел Алгоритмы setSolver. Чтобы узнать больше о рабочем процессе при использовании PortfolioCVaR объекты, см. Рабочий процесс объекта PortfolioCVaR.

Что такое сценарии?

Поскольку условная оптимизация портфеля в группе риска работает со сценариями возврата активов для выполнения оптимизации, существует несколько способов определения и моделирования сценариев. Во многих приложениях с оптимизацией портфеля CVaR, возвраты активов могут иметь явно ненормальные распределения вероятностей с любыми несколькими режимами, binning of return, усечение распределений и так далее. В других приложениях возвраты активов моделируются как результат различных методов моделирования, которые могут включать симуляцию Монте-Карло, квазислучайную симуляцию и так далее. Часто базовое распределение вероятностей для факторов риска может быть многомерным нормальным, но результирующие преобразования являются достаточно нелинейными, чтобы привести к явно ненормальным возвратам активов.

Для примера это происходит со связями и производными инструментами. В случае облигаций с ненулевой вероятностью дефолта такие сценарии, вероятно, будут включать возвраты активов, которая − 100% для указания дефолта и некоторые значения чуть больше − 100% для указания коэффициентов возмещения.

Хотя и PortfolioCVaR объект имеет функции для моделирования многомерных нормальных сценариев из данных или моментов (simulateNormalScenariosByData и simulateNormalScenariosByMoments), обычный подход - задавать сценарии непосредственно из собственных функций симуляции. Эти сценарии вводятся непосредственно как матрица с выборкой для всех основных средств в каждой строке матрицы и с выборками для основного средства вниз по каждому столбцу матрицы. Архитектура инструментов оптимизации портфеля CVaR ссылается на сценарии через указатель на функцию, поэтому сценарии, которые были установлены, не могут быть доступны непосредственно как свойство PortfolioCVaR объект.

Настройка сценариев с помощью функции PortfolioCVaR

Предположим, что у вас есть матрица сценариев в AssetScenarios переменная. Сценарии устанавливаются через PortfolioCVaR объект с:

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 = PortfolioCVaR('Scenarios', AssetScenarios);

disp(p.NumAssets)
disp(p.NumScenarios)
4

20000

Заметьте, что PortfolioCVaR объект определяет и фиксирует количество активов в NumAssets и количество сценариев в NumScenarios на основе матрицы сценария. Количество сценариев можно изменить, позвонив в PortfolioCVaR объект с другой матрицей сценариев. Однако один раз в NumAssets свойство было задано в объекте, вы не можете ввести матрицу сценария с другим количеством активов. getScenarios функция позволяет вам восстановить сценарии из PortfolioCVaR объект. Вы также можете получить среднее и ковариационное значения ваших сценариев, используя estimateScenarioMoments.

Хотя не рекомендуемый для случайного пользователя, существует альтернативный способ восстановления сценариев путем работы с указателем на функцию, который указывает на сценарии в PortfolioCVaR объект. Чтобы получить доступ к некоторым или всем сценариям из PortfolioCVaR объект, скрытое свойство localScenarioHandle - указатель на функцию, который указывает на функцию для получения сценариев, которые уже были заданы. Чтобы получить сценарии непосредственно от PortfolioCVaR 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 = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);

disp(p.NumAssets)
disp(p.NumScenarios)
4

20000

Оценка среднего и ковариационного сценариев

estimateScenarioMoments функция получает оценки для среднего и ковариации сценариев в PortfolioCVaR объект.

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 = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);
[mean, covar] = estimateScenarioMoments(p)
mean =

    0.0043
    0.0085
    0.0098
    0.0153


covar =

    0.0005    0.0003    0.0002    0.0000
    0.0003    0.0024    0.0017    0.0010
    0.0002    0.0017    0.0049    0.0029
    0.0000    0.0010    0.0029    0.0102

Симуляция нормальных сценариев

Как удобство, эти две функции (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 сверху, эта последовательность примеров демонстрирует эквивалентные способы моделирования многомерных нормальных сценариев для PortfolioCVaR объект. Предположим, что PortfolioCVaR объект, созданный в p который использует возвраты активов в X использовании simulateNormalScenariosByData:

p = PortfolioCVaR;
p = simulateNormalScenariosByData(p, X, 20000);

[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0043
    0.0083
    0.0102
    0.1507


passetcovar =

    0.0053    0.0003    0.0002    0.0000
    0.0003    0.0024    0.0017    0.0010
    0.0002    0.0017    0.0049    0.0028
    0.0000    0.0010    0.0028    0.0101
Моменты, которые вы получаете из этой симуляции, вероятно, будут отличаться от моментов, перечисленных здесь, потому что сценарии являются случайными выборками от предполагаемого многомерного нормального распределения вероятностей входных < reservedrangesplaceholder0 > возвратов.

Поведение по умолчанию simulateNormalScenariosByData для работы с возвратами активов. Если вместо этого у вас есть цены основных средств, как в переменной Y, simulateNormalScenariosByData принимает имя аргумента пары "имя-значение" 'DataFormat' с соответствующим набором значений 'prices' указать, что вход в функцию находится в форме цен на основные средства, а не возвратов (значение по умолчанию для 'DataFormat' аргумент 'returns'). В этом примере моделируются сценарии с данными цены основного средства в Y для PortfolioCVaR q объекта:

p = PortfolioCVaR;
p = simulateNormalScenariosByData(p, Y, 20000, 'dataformat', 'prices');

[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0043
    0.0084
    0.0094
    0.1490


passetcovar =

    0.0054    0.0004    0.0001   -0.0000
    0.0004    0.0024    0.0016    0.0009
    0.0001    0.0016    0.0048    0.0028
   -0.0000    0.0009    0.0028    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 = PortfolioCVaR;
p = simulateNormalScenariosByData(p, Y, 20000, 'dataformat', 'prices');

q = PortfolioCVaR;
q = simulateNormalScenariosByData(q, Y, 20000, 'dataformat', 'prices', 'missingdata', true);

[passetmean, passetcovar] = estimateScenarioMoments(p)
[qassetmean, qassetcovar] = estimateScenarioMoments(q)
passetmean =

    0.0020
    0.0074
    0.0078
    0.1476


passetcovar =

    0.0055    0.0003   -0.0001   -0.0003
    0.0003    0.0024    0.0019    0.0012
   -0.0001    0.0019    0.0050    0.0028
   -0.0003    0.0012    0.0028    0.0101


qassetmean =

    0.0024
    0.0085
    0.0106
    0.1482


qassetcovar =

    0.0071    0.0004   -0.0001   -0.0004
    0.0004    0.0032    0.0022    0.0012
   -0.0001    0.0022    0.0063    0.0034
   -0.0004    0.0012    0.0034    0.0127
Первый PortfolioCVaR объект, p, содержит сценарии, полученные из данных о цене в Y где NaN значения отбрасываются, и второй PortfolioCVaR объект, q, содержит сценарии, полученные из данных о цене в Y которые учитывают отсутствующие значения. Каждый раз, когда вы запускаете этот пример, вы получаете различные оценки для моментов в p и q.

Симуляция нормальных сценариев из данных временных рядов

simulateNormalScenariosByData функция неявно работает с матрицами данных или данных в table или timetable объект использует те же правила для того, являются ли данные возвратами или ценами. Чтобы проиллюстрировать, используйте 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' опция, предлагаемая PortfolioCVaR, для учета недостающих данных.

p = PortfolioCVaR;
p = simulateNormalScenariosByData(p, stockTT, 20000 ,'missingdata',true);
[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0012
    0.0007
   -0.0005
   -0.0000
    0.0016
    0.0043
   -0.0001
    0.0000
    0.0001
   -0.0002
    0.0000
    0.0004
    0.0001
    0.0001


passetcovar =

    0.0013    0.0005    0.0006    0.0005    0.0006    0.0003    0.0005    0.0003    0.0006    0.0004    0.0005    0.0006    0.0002   -0.0000
    0.0005    0.0024    0.0007    0.0005    0.0010    0.0005    0.0005    0.0003    0.0006    0.0004    0.0006    0.0011    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.0005    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.0007    0.0002   -0.0000
    0.0006    0.0011    0.0008    0.0006    0.0011    0.0011    0.0006    0.0004    0.0007    0.0005    0.0007    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 свойство PortfolioCVaR объект. Таким образом, повторяя формирование PortfolioCVaR 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 = PortfolioCVaR;
p = simulateNormalScenariosByMoments(p, m, C, 20000);
[passetmean, passetcovar] = estimateScenarioMoments(p)
passetmean =

    0.0049
    0.0083
    0.0101
    0.1503


passetcovar =

    0.0053    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.0101

simulateNormalScenariosByMoments выполняет скалярное расширение аргументов для моментов возвратов активов. Если NumAssets еще не задан, скалярный аргумент интерпретируется как скаляр с NumAssets установлено на 1. simulateNormalScenariosByMoments предоставляет дополнительный необязательный аргумент для определения количества активов, чтобы скалярное расширение работало с правильным количеством активов. В сложение, если либо скаляр, либо вектор является входным для ковариации возвратов активов, формируется диагональная матрица, так что скаляр расширяется вдоль диагонали, а вектор становится диагональным.

См. также

| | | | | |

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

Подробнее о

Внешние веб-сайты

Для просмотра документации необходимо авторизоваться на сайте