在財務風險指標中,最大回撤是一個很重要的指標。
自己在計算最大回撤時,最開始是網上想找一些成熟的解決方案。
但是最后發現,要不是代碼不通用,要不就是性能不好,還有一些本來就是錯誤的。
所以最后只能理解最大回撤的算法思路,再寫出代碼,最后再優化性能了!
例子:
初始資金是1塊錢的話,資金連續一周的變化如下:
周一:1.01
周二:1.02
周三:0.98
周四:1.0
周五:0.97
那么我們要計算的樣本為:[1, 1.01, 1.02, 0.98, 1.0, 0.97]
如果計算截至到周二的最大回撤,那么我們要拿到周二的值:1.02,再拿周二之前最大的值,即,周一的1.01,再計算回撤:(1.02/1.01-1)*100=0.99%,這時間 0.99% >0 ,所以是不存在回撤的。
如果計算截至到周三的最大回撤,那么我們要拿到周三的值:0.98,再拿周三之前最大的值,即,周二的1.02,再計算回撤:(0.98/1.02-1)*100=-3.9215%,這時間 -3.9215% < 0 ,所以是存在回撤的。
如果計算截至到周五的最大回撤,那么我們要拿到周五的值:0.97,再拿周五之前最大的值,即,周二的1.02,再計算回撤:(0.97/1.02-1)*100=-4.9019%,這時間 -4.9019% < 0 ,所以是存在回撤的。
這時間再比較 Min(-4.9019%, -3.9215%),得出最大回撤為 -4.9019%。
用Python 代碼來實現:
returns = [1.0, 1.01, 1.05, 1.1, 1.11, 1.07, 1.03, 1.03, 1.01, 1.02, 1.04, 1.05, 1.07, 1.06, 1.05, 1.06, 1.07, 1.09, 1.12, 1.18, 1.15, 1.15, 1.18, 1.16, 1.19, 1.17, 1.17, 1.18, 1.19, 1.23, 1.24, 1.25, 1.24, 1.25, 1.24, 1.25, 1.24, 1.25, 1.24, 1.27, 1.23, 1.22, 1.18, 1.2, 1.22, 1.25, 1.25, 1.27, 1.26, 1.31, 1.32, 1.31, 1.33, 1.33, 1.36, 1.33, 1.35, 1.38, 1.4, 1.42, 1.45, 1.43, 1.46, 1.48, 1.52, 1.53, 1.52, 1.55, 1.54, 1.53, 1.55, 1.54, 1.52, 1.53, 1.53, 1.5, 1.45, 1.43, 1.42, 1.41, 1.43, 1.42, 1.45, 1.45, 1.49, 1.49, 1.51, 1.54, 1.53, 1.56, 1.52, 1.53, 1.58, 1.58, 1.58, 1.61, 1.63, 1.61, 1.59]
max_draw_down = 0 temp_max_value = 0 for i in range(1, len(returns)): temp_max_value = max(temp_max_value, returns[i-1]) max_draw_down = min(max_draw_down, returns[i]/temp_max_value-1) print(str(max_draw_down))
同時,如果你拿到到的是每日的漲跌幅,而不是資金總量變化,計算思想和上面類似,但是要考慮回撤的復利情況,不能直接套用, 但是思想相同!
本文首發於,博客園,請搜索:博客園 - 尋自己,查看原版文章