파이썬으로 MDD 구하기(pandas, numpy)
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

파이썬으로 MDD 구하기(pandas, numpy)

by Squat Lee 2024. 3. 6.

파이썬으로 MDD를 구해보겠습니다.

MDD는 Maximum Drawdown으로 최대손실폭을 나타냅니다. 즉, 내가 투자를 한다고 가정했을 때 최대 손실이 얼마나 나올지에 대한 값입니다.

 

 

우선 MDD의 공식은 아래와 같습니다.

MDD = (최저점 - 최고점) / 최저점

 

이 공식을 바탕으로 이제부터 MDD를 구하는 공식을 만들어 보겠습니다.

 

데이터 가져오기

from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
import numpy as np


ticker = 'QQQ'
df = pdr.get_data_yahoo(ticker)

df

 

우선 미국 ETF 중 QQQ를 Ticker로 하는 종목의 데이터를 가져왔습니다.

 

최대낙폭을 구하기 위해서는 데이터가 시간순서로 바뀌면서 최고점을 유지해야 하고 이때 최고점과 현재 주가의 차이를 구해서 이 값이 가장 크면 최저점을 구할 수 있습니다.

 

최고점은 위에서 최저점을 구한 기간까지의 데이터에서 최고점을 찾으면 됩니다.

 

저는 이해가 어려웠는데 이 글을 읽으시는 분들은 이해가 될 지 모르겠네요.

 

우선 최저점부터 구해보겠습니다.

arr_v = np.array(df['Close'])
arr_v
np.maximum.accumulate(arr_v)

 

 ETF  의 종가를 array로 만든다음 시간 순으로 가장 높은데이터만 나오도록 array를 만듭니다.

 

위의 그림과 같이 만약 1, 2, 1, 4, 3, ... 이렇게 값이 변한다면 array는 1, 2, 2, 4, 4,.... 이런식으로 나들어집니다.

 

np.maximum.accumulate(arr_v)-arr_v

가장 높은 값에서 현재 주가를 빼버리면 그 차액이 위와 같이 표시 됩니다.

 

np.argmax(np.maximum.accumulate(arr_v)-arr_v)

차액 중 가장 큰 값이 최대낙폭(MDD)가 발생하는 구간입니다. np.argmax 는 가장 큰 값이 있는 array의 위치값을 반환합니다. 여기서는 '5991'번째 값이 되겠죠. 여기가 최저점이 됩니다.

 

peak_upper = np.argmax(arr_v[:peak_lower])
peak_upper

 

이제는 최고점을 찾아야 하겠죠? 위에서 5991번째 값 중 ETF 주가가 가장 큰 값을 찾으면 됩니다. 위와 같이 코드를 만들면 '5714'번째 값이 최고점이 되겠네요.

 

포스트에 맨 처음에 알려드린 공식대로 코드를 만들기만 하면 됩니다.

 

MDD = (최저점 - 최고점) / 최저점

(arr_v[peak_lower] - arr_v[peak_upper]) / arr_v[peak_upper]

 

 

전체 코드는 아래와 같습니다.

from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
import numpy as np

ticker = 'QQQ'
df = pdr.get_data_yahoo(ticker)

peak_lower = np.argmax(np.maximum.accumulate(arr_v)-arr_v)
peak_upper = np.argmax(arr_v[:peak_lower])

(arr_v[peak_lower] - arr_v[peak_upper]) / arr_v[peak_upper]

 

728x90
반응형

댓글