Вопрос

У нас есть проблема, возникающая в управлении активами. Я думаю (и надеюсь), это поднимает достаточно интересные вопросы для этого форума, чтобы рассмотреть его. Мы сделали довольно обширный поиск литературы и находим вещи, которые говорят по этому вопросу, но ничто не касается этой проблемы.

Фон

У нас есть данные временных рядов для активов, из которых мы рассчитываем матрицу корреляции. Для 5 активов с использованием математики это может выглядеть примерно так:

m = Correlation[data]

{{1.0, 0.635562, 0.698852, 0.404792, -0.32746}, {0.635562, 1.0, 0.410075, 0.314375, -0.0636438}, {0.698852, 0.410075, 1.0, 0.374416, -0.260137}, {0.404792, 0.314375, 0.374416, 1.0, 0.293135}, {-0.32746, -0.0636438, -0.260137, 0.293135, 1.0}}

m //TableForm

1.000000, 0.635562, 0.698852, 0.404792, -0.32746

0.635562, 1.000000, 0.410075, 0.314375, -0.0636438

0.698852, 0.410075, 1.000000, 0.374416, -0.260137

0.404792, 0.314375, 0.374416, 1.000000, 0.293135

-0.32746, -0.0636438, -0.260137, 0.293135, 1.000000

В управлении активами человек хочет диверсификации. Если два или более активов в портфеле коррелируют слишком высоко, то они концентрируются, а не диверсифицируют риск.

Что мы хотим

Мы хотим, чтобы подход или метод для построения портфеля активов, который минимизирует риск «концентрации» портфеля, при этом всегда занимая некоторую позицию во всех инструментах

Я проиллюстрирую риск концентрации с помощью нескольких примеров ниже, но сначала ...

Почему это интересная проблема или вопрос?

Несколько вещей делают этот вопрос интересным и сложным вопросом:

Хотя это связано с «эффективной границей», у нас нет предположений о будущей производительности для использования отдельных инструментов.

Минимизация дисперсии дает ответ, но не интуитивно удовлетворяющий или даже полезный.

Анализ основных компонентов кажется естественным способом взглянуть на это, но также не дает нам того, что нам нужно.

Мы рассмотрели максимизацию энтропии, но, хотя один из наших парней, знакомый с дискретной энтропией, думал, что это казалось многообещающим, когда мы пытались подумать об этом с точки зрения непрерывной энтропии, это оказалось тупиком. Следующий код дает представление о том, на что мы смотрели (не уверен, что он на самом деле работает):

(* This function computes the distribution of returns, given a \
distribution of price movements.*)

returnDistribution[P_, n_] := Module[ {xv, wv},
  wv = Array[w, n];
  xv = Array[x, n];
  varsInPlane = 
   Append[Delete[xv, n], (r - Total[Delete[wv*xv, n]])/wv[[n]]];
  Integrate[PDF[P, varsInPlane], 
   Map[Function[{#, -Infinity, Infinity}], Delete[xv, n]]
   ]
  ]

dist = MultinormalDistribution[
   ConstantArray[0, 3], {{1, 0.9, 0}, {0.9, 1, 0}, {0, 0, 1}}];
rd = returnDistribution[dist, 3]

(* The problem we want to solve is this *)
wv = Array[w, n];
Maximize[{rd*Log[rd, 2], 
  Total[wv] == 1 && And @@ Thread[wv >= 0]}, wv]

Attilio Meucci имеет документ «Управление диверсификацией» и код Matlab, который выглядел многообещающе,

http://www.symmys.com/attiliomeucci/research/publfinance/publfinance.html

Но после того, как один из моих коллег прокомментировал это как:

Кажется, он делает примерно то же самое, что я хотел сделать (прежде чем отбросить идею), за исключением того, что он немного обманывает. Вместо того, чтобы фактически вычислять непрерывную энтропию, он просто рассматривает каждый основной компонент как отдельную ставку. Но в основном его статья представляет собой изысканную версию расчетов, которые я сделал с несколькими коррелированными монетами. Это заставляет вас получить энтропию от других переменных, а не от дополнительных цифр текущей переменной.

Делать то, что он делает с ненормальным распределением, может быть сложнее, хотя я полагаю, что можно использовать генеративные модели для ситуаций формы «95% стандартное нормальное распределение, 5% что-то действительно плохое».

Примеры риска концентрации

Пара простых примеров, чтобы проиллюстрировать риск концентрации

Легче всего понять, чего мы хотим достичь, если мы посмотрим на портфель из 3 активов в мыслительном эксперименте. Предположим, что 2 из инструментов имеют корреляции 1 (100%), а третий - 0, это матрица корреляции будет выглядеть так:

1, 1, 0

1, 1, 0

0, 0, 1

С нашей точки зрения в этом случае было бы смысл поставить 25% в каждом из 2 коррелированных акций и 50% в некоррелированном.

25%, 25%, 50%

Это компенсирует риск концентрации в коррелированных инструментах, в то же время признавая, что 100% коррелированные активы на самом деле все еще разные инструменты, чья корреляция в будущем может измениться.

Можно привести к тому, что, поскольку два актива, которые имеют 100% корреляцию, движутся одинаково, тогда широкий спектр возможных распределений может в равной степени служить нашим целям, например:

50%, 0%, 50%

0%, 50%, 50%

10%, 40%, 50%

... или любые такие варианты на тему.

Но, поскольку мы не знаем, как будет развиваться их будущая корреляция, мы думаем, что лучшее и наиболее интуитивное решение остается в:

25%, 25%, 50%

Другой пример

В портфеле из 5 активов с 4, имеющими 100% корреляцию и 1 с корреляцией 0%, матрица корреляции будет выглядеть следующей:

1, 1, 1, 1, 0

1, 1, 1, 1, 0

1, 1, 1, 1, 0

1, 1, 1, 1, 0

0, 0, 0, 0, 1

И распределение портфеля, которое мы хотим, будет иметь следующие пропорции:

12.5%, 12.5%, 12.5%, 12.5%, 50%

Конечно, реальный мир дает нам больше сложности.

Вещи, которые мы пробовали

Минимизация дисперсии (многообещающе, но не работает)

Кто -то предложил минимизировать дисперсию для этого, но, как видно, он не производит интуитивно понятное решение:

Некоторый код математики иллюстрирует это следующее:

For 3 assets:

m3 = {{1, 1, 0}, {1, 1, 0 }, { 0, 0 , 1}};

Array[x, Length@m3];

Minimize[{p.m3.p, Tr@p == 1 && And @@ Thread[p >= 0]}, p]

{1/2, {x[1] -> 1/4, x[2] -> 1/4, x[3] -> 1/2}}

Это выглядит хорошо. Это дает нам:

25%, 25%, 50%

но...

Для 5 активов:

m5 = {{1, 1, 1, 1, 0}, {1 , 1, 1, 1, 0 }, {1 , 1, 1, 1, 0 }, {1 , 1,1, 1, 0 }, { 0, 0 , 0, 0, 1}};

p = Array[x, Length@m5];

Minimize[{p.m5.p, Tr@p == 1 && And @@ Thread[p >= 0]}, p]

{1/2, {x[1] -> 1/16, x[2] -> 1/4, x[3] -> 1/8, x[4] -> 1/16, x[5] ->1/2}}

Не так хорошо, как дает нам:

6.25%, 25%, 12.50%, 6.25%, 50%

Таким образом, минимизация дисперсия не работает даже для этого простого (если искусственного) случая, не говоря уже о чем -то более реалистичном.

Многообещающее решение

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

Снова с кодом Mathematica:

m = {{1, 1, 0}, {1, 1, 0}, {0, 0, 1}};

Tr /@ PseudoInverse[m]/Tr[ Tr /@ PseudoInverse[m]]

{1/4, 1/4, 1/2}  

Именно то, что мы хотели бы. ПРИМЕЧАНИЕ. Для тех, кто не знаком с кодом Mathematica, функции: «TR» находит следа матрицы и «/@» отображает функцию в список или матрицу. Остальное, вероятно, имеет смысл.

Другой пример для четырех активов:

m = {{1, 1, 1, 0}, {1, 1, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 1}};

Tr /@ PseudoInverse[m]/Tr[ Tr /@ PseudoInverse[m]]

{1/6, 1/6, 1/6, 1/2}

Опять же, именно то, что мы хотим.

Это работает лучше, чем минимизация дисперсии, но в более реальном примере (первый из них описан в посте), мы получаем то, что не работает:

m = {{1.0, 0.635562, 0.698852, 0.404792, -0.32746}, {0.635562, 1.0, 0.410075, 0.314375, -0.0636438}, {0.698852, 0.410075, 1.0, 0.374416, -0.260137}, {0.404792, 0.314375, 0.374416, 1.0, 0.293135}, {-0.32746, -0.0636438, -0.260137, 0.293135, 1.0}}

Tr /@ PseudoInverse[m]/Tr[ Tr /@ PseudoInverse[m]]

{0.267806, 0.0898877, 0.22403, -0.0541658, 0.472441}

В этом случае у нас есть отрицательное распределение (-0,0541658) для 4-го активного актива, что не имеет смысла для того, чего мы хотим достичь.

Вывод

Таким образом, нам нужна своего рода минимизационная функция. Я надеюсь, что все это описывает, чего мы хотим достичь достаточно ясно. Любые предложения или идеи для атаки этой проблемы совершенно по -разному или для расширения любых вещей, которые мы пробовали, уже очень ценят.

Люди, которые смотрят на это случайно всегда предполагают, что CAPM (модель ценообразования капитала) делает это. Это не. Учтите, что описанные выше корреляции связывают активы с активом, а не каждый активы с «рынком», поэтому у него нет «бета», с которой можно работать. Кроме того, описанная задача не дает никаких предположений ни о возврате, ни в использовании ставки без риска или обычное распределение цен. Я вижу, как CAPM может показаться способом сделать это, но я не вижу, как это применимо.

Большое спасибо,

Арун Гарапата

Это было полезно?

Решение

Я предложу простой и слегка ошибочный подход. Для каждого актива суммируют его ковариации. Затем обращайте свой процент обратно к соотношению этой суммы с общей суммой ковариаций.

В коде, используя ваш исходный пример, мы бы сделали следующее.

cormat = {{1.0, 0.635562, 0.698852, 
0.404792, -0.32746}, {0.635562, 1.0, 0.410075, 
0.314375, -0.0636438}, {0.698852, 0.410075, 1.0, 
0.374416, -0.260137}, {0.404792, 0.314375, 0.374416, 1.0, 
0.293135}, {-0.32746, -0.0636438, -0.260137, 0.293135, 1.0}};

n = Length[cormat];
xvars = Array[x, n];
corrs = Map[Total, cormat];
cortot = Total[Total[cormat]];

unnormalized = 
  xvars /. First[Solve[xvars == cortot/corrs, xvars]]

Out [26] = {4.129760099114916, 4.337254104111004, 4.479986290069387, 4.173066277624756, 15.51647047130198}

normalized = unnormalized/Total[unnormalized]

Out [27] = {0,1265379371734397, 0,1328956583819156, 0,1372690447157368, 0,1278648603757522, 0,4754324993531559

Я подозреваю, что эти значения составляют разумный результат для этого примера.

Есть два недостатка. Одним из них является то, что это не учитывает относительную силу активов. Я не думаю, что это проблема, потому что я подозреваю, что вы уже взвешивали это, то есть один доллар актива 1 стоит один доллар актива 2, стоит ...

--редактировать--

Это последнее не может быть совершенно правильным. Вам нужно будет учитывать как по цене активов, так и по оценке доходов. Не уверен, как вы хотите справиться с этим в коде, который я показал. Может быть, ковариации веса немного, чтобы «лучшие» активы (с точки зрения доходности по сравнению с ценой) давали лучшие ковариационные номера?

-РЕДАКТИРОВАТЬ-

Более важная проблема заключается в том, что это не будет играть хорошо, когда будут большие негативные корреляции. Как справиться с этим зависит от того, что, как вы хотите. Например, если пара активов негативно коррелирует, считаете ли вы их предпочтительными для нулевой корреляции? Если нет, то легкое исправление - превратить негативы в некоторую часть положительной корреляции (или сделать их нулевым, если отрицательная корреляция считается не лучше или хуже, чем некоррелированные активы).

Если, насколько я подозреваю, пара с отрицательной корреляцией делает их вместе относительно более желательными, чтобы иметь позиции (делает вас более защищенным от рецессии), то мы должны регулировать код выше, чтобы мы не взорвали значения, когда общины корреляции попадают или превышает -1. Я думаю, что разумная эвристика -оставить негативы в одиночку, если их сумма находится в диапазоне (-0,5,0), иначе нормализовать их до -0,5.

Очевидно, что все это является эвристическим, и параметры могут быть настроены, например, могут использовать отношение обратной мощности вместо просто обратного. Мог бы справиться с негативами в некотором роде, кроме того, что я предлагаю. Мог добавить чтение чайных листьев ...

Обратите внимание, что я здесь вне своей области, поэтому любое неправильное использование терминологии непреднамеренно. Может быть, также из моей глубины.

Daniel Lichtblau Wolfram Research

Другие советы

В ваших экстремальных примерах испытания вы есть бесконечное количество решений; ММА выбирает одного из них. Если вы хотите, чтобы он выбрал решение, которое делает (неопознанные) веса примерно равными друг другу, то вы должны сказать, что вы заботитесь об этом аспекте: например, вы можете добавить штраф за отклонение от равенства. Попробуй это:

lambda = .00001;
NMinimize[{p.m5.p - 
   lambda*PDF[DirichletDistribution[Table[2, {5}]], Most[p]], 
  Tr@p == 1 && And @@ Thread[p >= 0]}, p]

Я использовал распределение Dirichlet со средним значением 1/5. Параметры настройки включают как Lambda, так и параметр «2» в распределении Дирихле (который контролирует концентрацию вокруг среднего значения). Вам придется подняться с этими параметрами настройки в зависимости от фактической проблемы. Для вашего менее экстремального примера вы можете попробовать

lambda = .0001;
NMinimize[{p.m.p - 
   lambda*PDF[DirichletDistribution[Table[2, {5}]], Most[p]], 
  Tr@p == 1 && And @@ Thread[p >= 0]}, p]

--Отметка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top