【问题标题】:Minimize variance "intuitively"“直观地”最小化方差
【发布时间】:2011-06-17 07:51:06
【问题描述】:

我们遇到了资产管理方面的问题。我认为(并希望)它为这个论坛提出了足够有趣的问题来考虑它。我们对文献进行了相当广泛的搜索,找到了围绕这个问题讨论的内容,但没有直接涉及这个问题。

背景

我们有资产的时间序列数据,我们从中计算相关矩阵。对于使用 Mathematica 的 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%

当然,现实世界给我们带来了更大的复杂性。

我们尝试过的事情

最小化方差(有希望但不起作用)

有人建议最小化方差来做到这一点,但正如人们所看到的那样,它并没有产生一个直观的解决方案:

一些说明这一点的 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}

在这种情况下,我们为第 4 个资产分配了负数 (-0.0541658),这对于我们想要实现的目标没有意义。

结论

所以,我们需要一种 MinimizeVarianceIntuitively 函数。我希望所有这些都足够清楚地描述了我们想要实现的目标。对于以完全不同的方式解决这个问题或扩展我们已经尝试过的任何事情的任何建议或想法都非常感谢。

随便看看这个的人总是建议CAPM(资本资产定价模型)这样做。它不是。考虑到上述相关性将资产与资产相关联,而不是每个资产与“市场”相关联,因此它没有可使用的“贝塔”。此外,所描述的问题没有假设回报或使用无风险利率或价格的正态分布。我可以看到 CAPM 看起来像是一种执行此操作的方法,但我不知道它是如何应用的。

非常感谢,

阿伦·加拉帕塔

【问题讨论】:

    标签: statistics wolfram-mathematica correlation variance


    【解决方案1】:

    我将提出一个简单但略有缺陷的方法。对于每个资产,求和其协方差。然后取其百分比与该总和与协方差总和的比率成反比。

    在代码中,使用您的原始示例,我们将执行以下操作。

    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]]
    

    输出[26]= {4.129760099114916, 4.337254104111004, 4.479986290069387, \ 4.173066277624756, 15.51647047130198}

    normalized = unnormalized/Total[unnormalized]
    

    输出[27]= {0.1265379371734397, 0.1328956583819156, 0.1372690447157368, \ 0.1278648603757522, 0.4754324993531559}

    我怀疑这些值构成了此示例的合理结果。

    有两个缺陷。一是这没有考虑资产的相对强度。我不认为这是一个问题,因为我怀疑你已经为此加权了,即一美元的资产 1 值一美元的资产 2 的价值......

    --编辑--

    最后一个不太对。您需要同时考虑资产价格和相同的估计回报。不知道你想如何在我展示的代码中处理这个问题。也许稍微加权协方差,以便“更好”的资产(就回报与价格而言)给出更好的协方​​差数字?

    --结束编辑--

    一个更大的问题是,当存在很大的负相关时,这不会很好。如何处理这取决于您想要的行为。例如,如果一对资产是负相关的,你觉得它们比零相关更可取吗?如果不是,那么一个简单的解决方法是将负相关转换为正相关的一部分(或者将它们设为零,如果负相关被认为不比不相关资产更好或更差)。

    如果,正如我所怀疑的那样,负相关的一对使得它们在一起相对更可取的位置(让你更能抵御衰退),那么我们必须调整上面的代码,这样我们就不会在相关时破坏值总数达到或超过-1。我认为,一个合理的启发式方法是,如果它们的总和在 (-0.5,0) 范围内,则将它们单独放在一行中,否则将它们归一化为 -0.5。

    显然,所有这些都是启发式的,并且可以调整参数,例如可以使用逆幂关系而不仅仅是逆。可以以我建议的方式以外的方式处理负面因素。可以添加阅读茶叶...

    请注意,我不属于我的领域,因此任何对术语的滥用都是无意的。也许也超出了我的理解范围。

    丹尼尔·利希特布劳 Wolfram 研究

    【讨论】:

    • 丹尼尔 -- 谢谢你。它为我们如何解决这个问题提供了有用的补充。为了清楚起见,有几点。我们不对“估计回报”做任何假设,但我们可以并且确实衡量波动性(如果你理解我的意思,第一个给你一个向量,然后一个范围给你)。如果资产上涨但资产下跌时资产之间的正相关性很好,但我们不能预测方向(不确定任何人都可以;-)。我们并没有真正看到“大的负相关”,但预测它们会在某个时候发生当然是有道理的。
    【解决方案2】:

    在您的极端测试示例中,您有无数种解决方案;妈妈挑出其中一个。如果您希望它选择一个使(未识别的)权重大致相等的解决方案,那么您应该告诉它您关心该方面:例如,您可以对偏离相等性添加惩罚。试试这个:

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

    我使用了平均值为 1/5 的 Dirichlet 分布。调整参数包括 lambda 和 Dirichlet 分布中的参数“2”(控制均值附近的浓度)。您将不得不根据实际问题使用这些调整参数。对于您不太极端的示例,您可以尝试

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

    --标记

    【讨论】:

    • Mark -- 非常有趣的方法。乍一看,它有很多承诺。非常感谢您快速周到的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2019-11-18
    • 2020-09-24
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多