计算最大回撤
1. 累积计算统计特征函数
PANDAS库中累积计算统计特征函数:
1、CUMSUM()
依次给出前1,2,…,n个数的和
2、CUMPROD()
依次给出前1,2,…,n个数的积
3、CUMMAX()
依次给出前1,2,…,n个数的最大值
4、CUMMIN()
依次给出前1,2,…,n个数的最小值
2. 示例
构造一个时间序列的dataframe
df = pd.DataFrame(abs(np.random.randn(10, 4)), index=pd.date_range('1/1/2023', periods=10),
columns=list('ABCD'))
df.index.name='date'
# 测试cummax
print(df)
df.cummax()
df的数值如下:
A B C D
date
2023-01-01 0.846219 0.885561 0.928451 1.079576
2023-01-02 1.050537 0.481874 0.399358 0.699084
2023-01-03 1.185733 0.999028 0.343530 0.552860
2023-01-04 0.895051 0.293099 0.753992 1.930219
2023-01-05 1.596002 0.810764 1.824537 0.137422
2023-01-06 0.861021 0.850009 0.672150 0.915488
2023-01-07 0.620457 0.511714 0.360230 0.224636
2023-01-08 0.762900 0.240447 0.243201 1.005045
2023-01-09 1.101702 1.663476 0.425403 1.497425
2023-01-10 1.448837 1.288810 1.061639 1.234628
cummax() ,累计最大值如下:
A B C D
date
2023-01-01 0.709423 0.490958 0.056300 0.329100
2023-01-02 0.709423 1.122827 0.114792 1.275127
2023-01-03 1.944903 1.122827 0.114792 1.275127
2023-01-04 1.944903 1.122827 0.114792 1.275127
2023-01-05 1.944903 1.452571 0.114792 1.644606
2023-01-06 1.944903 1.452571 1.775677 1.644606
2023-01-07 1.944903 1.452571 1.775677 1.644606
2023-01-08 1.944903 1.452571 1.775677 1.644606
2023-01-09 1.944903 1.452571 2.300825 1.644606
2023-01-10 1.944903 1.452571 2.300825 1.644606
计算最大回撤:
# 计算每天的最大回撤率
drawdown_daily = (df.cummax() - df) / df.cummax()
print('drawdown_daily:')
print(drawdown_daily)
#取最大回撤率
total_drawdown = drawdown_daily.max()
print('total_drawdown:')
print(total_drawdown)
结果如下:
drawdown_daily:
A B C D
date
2023-01-01 0.000000 0.000000 0.000000 0.000000
2023-01-02 0.000000 0.455854 0.569866 0.352446
2023-01-03 0.000000 0.000000 0.629997 0.487892
2023-01-04 0.245150 0.706616 0.187903 0.000000
2023-01-05 0.000000 0.188447 0.000000 0.928805
2023-01-06 0.460514 0.149164 0.631605 0.525708
2023-01-07 0.611243 0.487789 0.802564 0.883622
2023-01-08 0.521993 0.759320 0.866705 0.479310
2023-01-09 0.309711 0.000000 0.766843 0.224220
2023-01-10 0.092209 0.225231 0.418132 0.360369
total_drawdown:
A 0.611243
B 0.759320
C 0.866705
D 0.928805
dtype: float64
从图示上检验:
df['A'].plot(legend=True)
df['D'].plot(legend=True)
print(drawdown_daily.loc[drawdown_daily['A']==total_drawdown['A']])
print(drawdown_daily.loc[drawdown_daily['D']==total_drawdown['D']])
查询到A和D的最大回撤日期:
A B C D
date
2023-01-07 0.611243 0.487789 0.802564 0.883622
A B C D
date
2023-01-05 0.0 0.188447 0.0 0.928805
A和D的最大回撤图示: