Python量化交易实战-17计算最大回撤率,挑选同样收益,风险更低股票

auto-trade xuhss 1675℃ 0评论

计算风险指标,最大回撤

一、如何计算最大回撤

最大回撤:在选定周期内,任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度最大值,它是一个非常重要的风险指标。

1.1计算公式

我们来看这张图,你可以作为一只基金的表现,它代表的是每日净值的变化。横轴是时间线:

20210607070420 - Python量化交易实战-17计算最大回撤率,挑选同样收益,风险更低股票

最大回撤值 = (低谷值-最高值)/最高值

也就是一段周期内,最低值-减去最高值,再除以最高值。

比如说,我们取这个周期:

20210607071054 - Python量化交易实战-17计算最大回撤率,挑选同样收益,风险更低股票

它的最高值约等于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)

运行结果:

20210607230729 - Python量化交易实战-17计算最大回撤率,挑选同样收益,风险更低股票

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()

20210607232248 - Python量化交易实战-17计算最大回撤率,挑选同样收益,风险更低股票

橙色代表: max_drawndown,蓝色代表:daily_drawndown它代表过去252个交易日,也就是1年时间,它的最大回撤以及当天的回撤都是-0.076左右,也就是 如果你有10000元,到这一天,最多可能亏损8000元。后面的情况就好多了,最多只有40%的回撤,

回到最初的问题,2个理财产品,收益都差不多,选风险更低的,就可以通过看他们的回撤趋势作为选择条件。哪一个距离0轴更近,幅度越小,这个投资标的风险就更加的低一些。

转载请注明:xuhss » Python量化交易实战-17计算最大回撤率,挑选同样收益,风险更低股票

喜欢 (7)

您必须 登录 才能发表评论!