给出以下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
我不想依靠循环来获得所需的输出。是否有使用pandas
或numpy
进行数字化处理的更多方法?用矩阵运算?
答案 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
(是的,例子很差。)