使用.expansing()Python计算投资组合提取

使用.expansing()Python计算投资组合提取,python,finance,Python,Finance,我试图使用下面的代码计算投资组合随时间的下降。我曾尝试使用.expansing()函数,但似乎无法获得所需的输出。如果有人能告诉我哪里出了问题,我将不胜感激 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.groupb

我试图使用下面的代码计算投资组合随时间的下降。我曾尝试使用.expansing()函数,但似乎无法获得所需的输出。如果有人能告诉我哪里出了问题,我将不胜感激

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

提前感谢您的帮助。

我使用的是来自yfinance的以下数据:

import yfnance as yf

df = yf.download('aapl', start='2020-01-01')[['Close']]
df['Chg'] = df['Close'].pct_change()

    Close
Date    
2019-12-31  73.412498
2020-01-02  75.087502
2020-01-03  74.357498
2020-01-06  74.949997
2020-01-07  74.597504
... ...
2020-09-03  120.879997
2020-09-04  120.959999
2020-09-08  112.820000
2020-09-09  117.320000
2020-09-10  118.930000
计算累积收益、滚动最大峰值和从后续峰值开始的下降,如下所示:

df['Cum_ret'] = (1+ df['Chg']).cumprod()  # cumulative return
df['Peaks'] = df['Cum_ret'].cummax()      # cumulative peaks
df['Drawdown'] = (df['Cum_ret'] - df['Peaks']) / df['Peaks']  # drawdown from trailing peak
累积回报和峰值:

提款:

编辑:刚刚注意到你有两个投资组合回报,你正在处理,所以这并没有真正回答你的问题

我想这会满足你的要求:

df['Drawdown'] = df.groupby('portfolio')['performance'].apply(drawdown_2)

    portfolio   period  performance Drawdown
0   port1   201501  0.003718    0.000000
1   port1   201502  -0.004890   -0.004890
2   port1   201503  -0.004171   -0.009041
3   port1   201504  -0.006922   -0.015900
4   port1   201505  0.003545    -0.012411
5   port1   201506  0.003545    -0.008910
6   port1   201507  0.006901    -0.002071
7   port1   201508  0.000101    -0.001970
8   port1   201509  0.009081    0.000000
9   port1   201510  0.003062    0.000000
10  port1   201511  -0.008425   -0.008425
11  port1   201512  0.002580    -0.005867
12  port2   201501  0.009135    0.000000
13  port2   201502  0.009149    0.000000
14  port2   201503  -0.004252   -0.004252
15  port2   201504  -0.008788   -0.013003
16  port2   201505  -0.006210   -0.019132
17  port2   201506  0.006020    -0.013227
18  port2   201507  0.002983    -0.010284
19  port2   201508  0.008498    -0.001873
20  port2   201509  0.008080    0.000000
21  port2   201510  0.000138    0.000000
22  port2   201511  -0.008425   -0.008425
23  port2   201512  0.002580    -0.005867