Python
如何在 python 中計算最大回撤 MDD
我需要在 Python 中計算時間動態最大回撤。問題是,例如:
( df.CLOSE_SPX.max() - df.CLOSE_SPX.min() ) / df.CLOSE_SPX.max()
無法工作,因為這些函式使用所有數據,而不是例如僅考慮時間軸上給定最大值之後的最小值。有人知道如何在python中實現它嗎?
這是使用的數據框的一個簡短範例:
CLOSE_SPX Close_iBoxx A_Returns B_Returns A_Vola B_Vola 2014-05-15 1870.85 234.3017 -0.009362 0.003412 0.170535 0.075468 2014-05-16 1877.86 234.0216 0.003747 -0.001195 0.170153 0.075378 2014-05-19 1885.08 233.7717 0.003845 -0.001068 0.170059 0.075384 2014-05-20 1872.83 234.2596 -0.006498 0.002087 0.170135 0.075410 2014-05-21 1888.03 233.9101 0.008116 -0.001492 0.169560 0.075326 2014-05-22 1892.49 233.5429 0.002362 -0.001570 0.169370 0.075341 2014-05-23 1900.53 233.8605 0.004248 0.001360 0.168716 0.075333 2014-05-27 1911.91 234.0368 0.005988 0.000754 0.168797 0.075294 2014-05-28 1909.78 235.4454 -0.001114 0.006019 0.168805 0.075474 2014-05-29 1920.03 235.1813 0.005367 -0.001122 0.168866 0.075451 2014-05-30 1923.57 235.2161 0.001844 0.000148 0.168844 0.075430 2014-06-02 1924.97 233.8868 0.000728 -0.005651 0.168528 0.075641 2014-06-03 1924.24 232.9049 -0.000379 -0.004198 0.167852 0.075267
您可以使用 pandas rolling_max 在視窗中找到過去的最大值來計算當天的回撤,然後使用 rolling_min 來確定已經歷的最大回撤。
假設我們想要特定交易品種經歷的 1 年移動(252 個交易日)最大回撤。以下應該可以解決問題:
import pandas as pd import pandas_datareader as web import matplotlib.pyplot as pp import datetime # Get SPY data for past several years SPY_Dat = web.DataReader('SPY', 'yahoo', datetime.date(2007,1,1)) # We are going to use a trailing 252 trading day window window = 252 # Calculate the max drawdown in the past window days for each day in the series. # Use min_periods=1 if you want to let the first 252 days data have an expanding window Roll_Max = SPY_Dat['Adj Close'].rolling(window, min_periods=1).max() Daily_Drawdown = SPY_Dat['Adj Close']/Roll_Max - 1.0 # Next we calculate the minimum (negative) daily drawdown in that window. # Again, use min_periods=1 if you want to allow the expanding window Max_Daily_Drawdown = Daily_Drawdown.rolling(window, min_periods=1).min() # Plot the results Daily_Drawdown.plot() Max_Daily_Drawdown.plot() pp.show()
哪個收益率(藍色是每天執行 252 天的回撤,綠色是過去一年中最大的 252 天回撤):
注:以最新的