본문 바로가기
업무자동화 with Python

[업무자동화 with Python] 파이썬으로 미국주식 MDD 계산 해보기 / Max Draw Down(최대낙폭) 계산해보기

by CodeCrafter 2025. 3. 10.
반응형

 

이번에는 파이썬의 yfinance 라이브러리와 bt 라이브러리를 활용해서

 

간단하게 미국주식의 연도별 MDD(Max Draw Down, 최대 낙폭)을 계산해보는 코드를 구현해보겠습니다.

 

1. 파이썬으로 미국주식 MDD 계산 해보기 / Max Draw Down(최대낙폭) 계산해보기

 

이번 구현은 상당히 간단합니다.

 

사용할 라이브러리는 데이터를 위한 yfinance와 MDD 계산기가 내장되어있는 bt 라이브러리입니다.

 

 

먼저 bt 라이브러리를 설치해줍니다.

!pip install bt

 

 

이후  아래와 같은 함수를 활용해서 MDD 계산기를 만들어줍니다.

import yfinance as yf
import bt
import pandas as pd

def calculate_annual_mdd(tickers, start_year, end_year):
    """
    여러 주식 티커에 대해 연도별 MDD(Maximum Drawdown, 최대 낙폭)를 계산하여 반환하는 함수
    """
    mdd_results = []

    for year in range(start_year, end_year + 1):
        year_start = f"{year}-01-01"
        year_end = f"{year}-12-31"

        for ticker in tickers:
            stock_data = yf.download(ticker, start=year_start, end=year_end)[['Close']]
            stock_data = stock_data.dropna()
            if stock_data.empty:
                continue

            strategy = bt.Strategy(f"{ticker} Strategy",
                                   [bt.algos.SelectAll(),
                                    bt.algos.WeighEqually(),
                                    bt.algos.RunOnce(),
                                    bt.algos.Rebalance()])
           
            backtest = bt.Backtest(strategy, stock_data)
            result = bt.run(backtest)

            # 📌 MDD(최대 낙폭) 저장
            mdd_results.append({"Year": year, "Ticker": ticker, "MDD": result.stats.loc['max_drawdown']})

    # 📌 DataFrame 변환 후 정리
    mdd_df = pd.DataFrame(mdd_results)

    # 📌 피벗 테이블 생성 (연도별 정리)
    mdd_df = mdd_df.pivot(index="Year", columns="Ticker", values="MDD")

    return mdd_df

def clean_mdd_results(mdd_df):
    """
    불필요한 문자열 제거, % 변환 및 정리
    """
    # 📌 값이 숫자인지 확인 후 변환
    def extract_mdd(value):
        try:
            return float(value) * 100  # % 변환
        except:
            return None  # 변환 불가능한 값은 None 처리

    # 📌 데이터 변환 적용
    mdd_df_cleaned = mdd_df.map(extract_mdd)

    # 📌 소수점 2자리까지 표시
    return mdd_df_cleaned.round(2)

 

 

이제 실제 주식 데이터를 가지고 결과를 도출해보겠습니다.

 

 

알아보고 싶은 종목의 티커를 입력해주고, 시작년도와 종료년도를 입력만 해주면 됩니다. 

 

저는 아래와같이 애플, 마이크로소프트, 구글 아마존, 테슬라, SCHD, SPY, QQQ를 해보았습니다.

# ✅ 사용할 티커 리스트 및 분석 기간 설정
tickers = ["AAPL", "MSFT", "GOOGL", "AMZN", "TSLA", "SCHD", "SPY", "QQQ"]
start_year = 2011
end_year = 2024

# ✅ 연도별 MDD 계산 및 정리
annual_mdd_results = calculate_annual_mdd(tickers, start_year, end_year)
cleaned_mdd_results = clean_mdd_results(annual_mdd_results)

 

 

계산된 결과를 확인해보겠습니다.

cleaned_mdd_results

 

연도별 결과들이 잘 나왔네요

 

조금 더 보기 좋게 히트맵을 활용해서 알아보겠습니다.

 

import matplotlib.pyplot as plt
import seaborn as sns

# 📌 시각화 설정
plt.figure(figsize=(12, 6))
sns.heatmap(cleaned_mdd_results, annot=True, fmt=".2f", cmap="coolwarm", center=0, linewidths=0.5)

# 📌 그래프 제목 및 라벨 설정
plt.title("Annual MDD(%) Heatmap", fontsize=14)
plt.xlabel("Ticker", fontsize=12)
plt.ylabel("Year", fontsize=12)

# 📌 시각화 출력
plt.show()

 

 

결과는 아래와 같습니다.

 

2018년과 2020년 그리고 2022년은 정말 쉽지 않은 한해였던 것 같습니다. 다들 MDD가 크네요

 

대부분 기술주이다보니 MDD가 굉장히 큰것을 알 수 있으며, 배당성장 ETF인 SCHD의 경우에도 코로나때 33%의 하락이 있었네요..

 

반응형

댓글