熊猫的尾巴依赖矩阵

时间:2018-08-17 20:51:39

标签: python pandas finance

给出以下3种资产的时间序列回报:

             Asset 1     Asset 2          Asset 3
date                                             
2018-08-09  0.004475    0.008847         0.006195
2018-08-10  0.025081    0.006637         0.013696
2018-08-13 -0.003005    0.011540         0.003559
2018-08-14 -0.012873   -0.009074        -0.005245
2018-08-15  0.003383    0.004275         0.000268

...

我需要计算一个矩阵,该矩阵指示如果一项资产位于其收益分布的末尾,而另一项资产也位于其收益分布的末尾的概率。我需要这样的输出:

                   Asset1      Asset2        Asset3
         Asset1  1.000000     0.00000      0.073171
         Asset2  0.000000     1.00000      0.048780
         Asset3  0.046875     0.04878      1.000000

的解释是,如果资产1处于尾部,则资产3也有4.6%的可能性也位于其尾部。 我写的代码是这样的:

import pandas as pd
"""r is the dataframe of time series returns in the format presented."""
def dummy_tail_dependence(r):
    x = r[r<r.quantile(q=0.025)]
    df = pd.DataFrame(index = r.columns)
    for asset in list(r.columns):
        df[asset] = (x.dropna(subset=[asset]).count())/(x[asset].count())
    return df

我不想依靠循环来获得所需的输出。是否有使用pandasnumpy进行数字化处理的更多方法?用矩阵运算?

1 个答案:

答案 0 :(得分:1)

您的示例非常具有代表性(只有一行位于其尾部)。但是,以下解决方案可能会有所帮助。

首先找到相应资产位于其尾部的所有单元格:

in_tail = df < df.quantile(q=0.025)

现在,为每个资产尾部的每个其他资产计算平均值。布尔序列的均值是该序列为真的概率:

probs = pd.concat([in_tail[in_tail[col]==True].mean() 
                   for col in in_tail], axis=1)
probs.columns = probs.index
#        Asset1  Asset2  Asset3
#Asset1     1.0     1.0     1.0
#Asset2     1.0     1.0     1.0
#Asset3     1.0     1.0     1.0

(是的,例子很差。)