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
我不想依赖循环来实现所需的输出。是否有使用 pandas
或 numpy
的更多数值方法?用矩阵运算?
你的例子很不具有代表性(任何资产都在它的尾部只有一行)。然而,以下解决方案可能会有所帮助。
首先找到相应资产位于其尾部的所有单元格:
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
(是的,这个例子很差。)
给定 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
我不想依赖循环来实现所需的输出。是否有使用 pandas
或 numpy
的更多数值方法?用矩阵运算?
你的例子很不具有代表性(任何资产都在它的尾部只有一行)。然而,以下解决方案可能会有所帮助。
首先找到相应资产位于其尾部的所有单元格:
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
(是的,这个例子很差。)