exponenta event banner

Прибыль актива и сценарии Используя объект PortfolioCVaR

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

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

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

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

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

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

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

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

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

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' вариант, предложенный CCVaR для учета недостающих данных.

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

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

См. также

| | | | | |

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

Подробнее

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