pandas 的尾部依赖矩阵

Tail dependence matrix with pandas

给定 3 种资产的 return 时间序列:

             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

...

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

                   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 的更多数值方法?用矩阵运算?

你的例子很不具有代表性(任何资产都在它的尾部只有一行)。然而,以下解决方案可能会有所帮助。

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

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

(是的,这个例子很差。)