我正在尝试使用下面的代码计算投资组合随时间的回撤。我尝试使用 .expanding() 函数,但似乎无法获得所需的输出。如果有人能让我知道我哪里出错了,我真的很感激。
def drawdown_2(arr):
tot_return = arr.add(1).cumprod()
max_return = tot_return.add(1).cummax()
return (tot_return / max_return) - 1
df['Drawdown'] = df.groupby(df.portfolio)['performance'].expanding().apply(drawdown_2)
输入数据的格式如下
portfolio period performance
port1 201501 0.003718
port1 201502 -0.004890
port1 201503 -0.004171
port1 201504 -0.006922
port1 201505 0.003545
port1 201506 0.003545
port1 201507 0.006901
port1 201508 0.000101
port1 201509 0.009081
port1 201510 0.003062
port1 201511 -0.008425
port1 201512 0.002580
port2 201501 0.009135
port2 201502 0.009149
port2 201503 -0.004252
port2 201504 -0.008788
port2 201505 -0.006210
port2 201506 0.006020
port2 201507 0.002983
port2 201508 0.008498
port2 201509 0.008080
port2 201510 0.000138
port2 201511 -0.008425
port2 201512 0.002580
所需的输出是一个数组,它是投资组合先前的最大值与投资组合的当前值之间的差。上述投入的回撤数字如下所示,采用所需格式:
portfolio period performance Drawdown
port1 201501 0.003718 0.00000
port1 201502 -0.004890 -0.00490
port1 201503 -0.004171 -0.00900
port1 201504 -0.006922 -0.01590
port1 201505 0.003545 -0.01240
port1 201506 0.003545 -0.00890
port1 201507 0.006901 -0.00210
port1 201508 0.000101 -0.00200
port1 201509 0.009081 0.00000
port1 201510 0.003062 0.00000
port1 201511 -0.008425 -0.00842
port1 201512 0.002580 -0.00587
port2 201501 0.009135 0.00000
port2 201502 0.009149 0.00000
port2 201503 -0.004252 -0.00430
port2 201504 -0.008788 -0.01300
port2 201505 -0.006210 -0.01910
port2 201506 0.006020 -0.01320
port2 201507 0.002983 -0.01030
port2 201508 0.008498 -0.00190
port2 201509 0.008080 0.00000
port2 201510 0.000138 0.00000
port2 201511 -0.008425 -0.00860
port2 201512 0.002580 -0.00605
提前感谢一百万的帮助。
UYOU
相关分类