Минимизировать дисперсию "интуитивно" - PullRequest
3 голосов
/ 28 января 2011

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

Фон

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

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]

У Аттилио Меуччи есть статья «Управление диверсификацией» и некоторый код 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%

Anotее пример

В портфеле из 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%

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

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

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

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

Ниже приведен код Mathematica, иллюстрирующий это:

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-го актива, что не имеет смысла для того, чего мы хотим достичь.

Заключение

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 30 января 2011

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

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

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.

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

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

Даниэль Лихтблау Wolfram Research

2 голосов
/ 28 января 2011

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

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

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

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

- Mark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...