为了账号安全,请及时绑定邮箱和手机立即绑定

使用 .expanding() Python 计算投资组合回撤

使用 .expanding() Python 计算投资组合回撤

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

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

我正在使用 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

累积回报和峰值:

//img1.sycdn.imooc.com//64c20be20001fd6306510437.jpg

回撤:

//img1.sycdn.imooc.com//64c20bf2000198ac06530439.jpg

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


我认为这会做你想要的:


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


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信