파이썬으로 CAGR과 MDD 구현하기(Pandas)
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

파이썬으로 CAGR과 MDD 구현하기(Pandas)

by Squat Lee 2024. 3. 20.

파이썬으로 CAGR과 MDD를 구현해 보았습니다.

 

CAGR은 구글링을 해서 찾으면 여러 자료가 보이는데, MDD는 제가 쓸만한것을 찾기가 쉽지 않네요.

 

매번 찾기가 귀찮아서 코드를 만든 후 포스트에 기록해 놓으려고 합니다.

 

 

CAGR

#CAGR
    diff = df.index[-1].year - df.index[0].year
    cagr_etf = (df['주가백분율'].iloc[-1] / df['주가백분율'].iloc[0]) ** (1 / diff) - 1
    cagr_전략 = (df['전략백분율'].iloc[-1] / df['전략백분율'].iloc[0]) ** (1 / diff) - 1
    cagr = f'CAGR(ETF) : {round(cagr_etf, 3)} / CAGR(전략) : {round(cagr_전략, 3)}'
    print(cagr)

 

제 블로그의 다른 포스트를 보면 백테스트 한 자료들이 많습니다. 저는 서로 다른 자산의 수익률을 비교하기 위해 주가를 백분율로 나타내서 계산을 합니다.

 

CAGR은 (처음가격/마지막가격)^(1/투자년수) - 1 로 계산이 됩니다. 

 

여기에서 투자년도는 데이터프레임의 첫번째 데이터와 마지막 데이터의 연도의 차로 구했습니다.

 

 

 

MDD

#MDD 구하기
def get_mdd(col):
    window = 252 #1년간 영업일을 252일로 가정
    peak = col.rolling(window, min_periods=1).max() #기간 동안에 최고 주가(결과값은 시리즈로 나옴)
    drawdown = col/peak - 1 #최고치 대비 현재 주가가 얼마나 하락했는지 구함
    연도별mdd = drawdown.rolling(window, min_periods=1).min()#"최고치-현재주가" 중 가장 작은값을 구함
    mdd = 연도별mdd.min()
    return mdd

 

MDD 는 1년동안 최고주가에서 가장 주가가 많이 떨어진 값의 퍼센티지를 구했습니다.

 

판다스는 통계에 최적화가 되어 있어서 잘만 사용하면 정말 편리합니다. 그런데 저에게는 쉽지가 않네요.

 

rolling 함수는 행(또는 열)을 하나씩 이동하면서 Window 개수만큼 연산을 합니다. 위의 코드에서는 과거 252일동안의 최대값을 하나씩 이동하며 계산을 하고 결과값은 시리즈로 나옵니다.

 

최소값을 지정하면 Nan으로 결과가 나오는것을 방지할 수 있습니다. 저는 행단위로 연산이 되니 최소값은 min_periods=1 로 지정하였습니다.

 

개념은 간단한데 이렇게 처음으로 만든 사람은 아마 천재가 아닐까 하는 생각이 듭니다.

728x90
반응형

댓글