计算风险指标,最大回撤
一、如何计算最大回撤
最大回撤:在选定周期内,任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度
的最大值,它是一个非常重要的风险指标。
1.1计算公式
我们来看这张图,你可以作为一只基金的表现,它代表的是每日净值的变化。横轴是时间线:
最大回撤值 = (低谷值-最高值)/最高值
也就是一段周期内,最低值-减去最高值,再除以最高值。
比如说,我们取这个周期:
它的最高值约等于4000
,最低值约等于2000
,
最大回撤值 = (2000-4000)/ 4000 = -50%
算出来是负值,但我们通常描述为亏损50%
从实际含义上看,最大回撤就是描述,在选定周期内,购买股票产生的最糟糕的情况。亏损的最大比例是多少。
1.2实例
理财产品 | 周(收益率、最大回撤) | 月(收益率、最大回撤) | 年(收益率、最大回撤) |
---|---|---|---|
A | 7%、2% | 11%、5% | 28%、17% |
B | 7%、1% | 11%、3.8% | 28%、13% |
举例来说,假设有2个理财产品,它们近一周的收益率都是7%
,近一月的收益率都是11%
,近一年的收益率都是28%
,从收益率来看,买这两个理财产品都差不多,但是他们的最大回撤不同,产品A的最大回撤和产品B的最大回撤见表格,你觉得哪个理财产品更值得选?最大回撤更小,也就是亏损情况更好。其实是产品B,收益不错,但是回撤更小,通常别人为更抗跌,大家都在跌,但是我跌的少。更稳定,这种产品买起来更安心。
总的来说,最大回撤的意义就是帮助你做风险控制。
二、实战
2.1计算回撤率
#计算最大回撤率
def caculate_max_drawndown(data):
#选取时间周期(时间窗口)
window = 7 #(7代表过去一周的时间窗口,这里根据你的时间轴的单位而定,这里是7天)
#选取时间周期中的最大净值(min_periods表示每个窗口至少要的观测值)
data['rolling_max'] = data['close'].rolling(window=7, min_periods=1).max()
#计算当天的回撤比:[回撤比 = (谷值-峰值) / 峰值 = 谷值/峰值-1]也就是历史的最大净值和今天比,回撤了多少,这个回撤可能是负的,负的代表的是亏的。
data['daily_drawndown'] = data['close']/data['rolling_max']-1
#选取时间周期内最大的回撤比及最大回撤。
data['max_drawndown'] = data['daily_drawndown'].rolling(window, min_periods=1).min()#为什么是min最小,比如说回撤比,他可能是-10%,-50%,越是负,值越小,回撤其实就是越大的,
return data
在main
中调用函数:
if __name__ == '__main__':
# data = week_period_strategy(stock_code='000001.XSHE', timefrequency='daily', start_date=None, end_date='2021-06-01')
# print(data)
# print(data.describe())
# data['cum_profit'].plot()
# plt.show()
data = st.get_single_price(stock_code='000001.XSHE', timefrequency='daily', start_date='2020-01-01', end_date='2021-01-01')
# 计算最大回撤率
data = caculate_max_drawndown(data)
print(data)
运行结果:
2.2可视化数据
为了能够更好的观看回撤的趋势,时间窗口调整为1
年:
window = 252
#计算最大回撤率
def caculate_max_drawndown(data):
#选取时间周期(时间窗口)
window = 252 #(252代表过去一年的时间窗口,这里根据你的时间轴的单位而定,这里是252天)
#选取时间周期中的最大净值(min_periods表示每个窗口至少要的观测周期单位)
data['rolling_max'] = data['close'].rolling(window=252, min_periods=1).max()
数据样本选取的时间范围相应的选择最长的时间范围
start_date='2006-01-01'
调用绘图函数查看趋势:
data[['daily_drawndown', 'max_drawndown']].plot()
plt.show()
运行查看结果:
if __name__ == '__main__':
# data = week_period_strategy(stock_code='000001.XSHE', timefrequency='daily', start_date=None, end_date='2021-06-01')
# print(data)
# print(data.describe())
# data['cum_profit'].plot()
# plt.show()
data = st.get_single_price(stock_code='000001.XSHE', timefrequency='daily', start_date='2006-01-01', end_date='2021-01-01')
# 计算最大回撤率
data = caculate_max_drawndown(data)
print(data)
data[['daily_drawndown', 'max_drawndown']].plot()
plt.show()
橙色代表: max_drawndown
,蓝色代表:daily_drawndown
它代表过去252
个交易日,也就是1
年时间,它的最大回撤以及当天的回撤都是-0.076
左右,也就是 如果你有10000
元,到这一天,最多可能亏损8000
元。后面的情况就好多了,最多只有40%
的回撤,
回到最初的问题,2
个理财产品,收益都差不多,选风险更低的,就可以通过看他们的回撤趋势作为选择条件。哪一个距离0轴
更近,幅度越小,这个投资标的风险就更加的低一些。