파이썬(Python)/웹스크롤링

[Python] yfinance로 고점대비 하락율 그래프 그리기 (코스피, 코스닥, MDD)

끄적끄적아무거나 2021. 11. 8. 19:55
반응형

 

목차

     

     

     

     

     

     

     

    [Python] yfinance로 고점 대비 하락율 그래프 그리기 : 배경 지식

     

     

    yfinance 는 야후파이낸스(Yahoo finance)에 나와 있는 데이터를 파이썬으로 쉽게 이용할 수 있게 만들어진 라이브러리 입니다. 

     

    이번 포스트의 목적은 yfinance를 사용해서 코스피(Kospi) 의 1년 간에 종가 데이터를 가져와서 고정 대비 하락율을 계산하는 MDD(Maximum Draw Down)와 DD(Draw Down)을 구해서 matplotlib 라이브러리를 사용해서 그래프로 표현할 생각 입니다.

     

    개인적으로 주식을 하는데 MDD가 6프로 이상 떨어질때 주식을 구입하기 위해 해당 코드를 작성 했습니다. 

     

    필요하신 분들은 아래 코드를 통해 성투하시길 바랍니다 ㅎ

     

    앞서 언급한 라이브러리에 대해 자세히 알고 싶으시면 아래 링크를 참조 하시면 됩니다.

     

     

     

    [Python] yfinance 함수 사용법 정리 (코스피,테슬라)

    목차 [Python] yfinance 함수: 차트 정보 가져오기 파이썬 yfinance 함수를 사용해서 야후 파이낸스(Yahoo Finance)의 차트(Chart)의 주가 정보를 가져오겠습니다. (시작가, 종가, etc). yfinance 는 판다스(Pand..

    scribblinganything.tistory.com

     

     

    [Python, matplotlib] 여러 그래프에 한 화면에 그리기 (subplot)

    목차 [Python, matplotlib] 여러 그래프에 한 화면에 그리기 (subplot) 이번 포스트의 주제는 크게 두가지로 진행됩니다. 여러개의 서브 그래프(Subplot) 만들기 2개 이상의 그래프를 한개의 화면에 나

    scribblinganything.tistory.com

     

     

     

    [Python] yfinance로 고점 대비 하락율 그래프 그리기 : 코스피(KOSPI) 데이터 불러오기

     

    코드>>

    yf.pdr_override()
    data = pdr.get_data_yahoo("^KS11", start="2020-01-01", end="2021-01-01")
    print(data)

     

    결과>>

    [*********************100%***********************]  1 of 1 completed
                       Open         High          Low        Close    Adj Close   Volume
    Date
    2020-01-02  2201.209961  2202.320068  2171.840088  2175.169922  2175.169922   494700
    2020-01-03  2192.580078  2203.379883  2165.389893  2176.459961  2176.459961   631600
    2020-01-06  2154.969971  2164.419922  2149.949951  2155.070068  2155.070068   592700
    2020-01-07  2166.600098  2181.620117  2164.270020  2175.540039  2175.540039   568200
    2020-01-08  2156.270020  2162.320068  2137.719971  2151.310059  2151.310059   913800
    ...                 ...          ...          ...          ...          ...      ...
    2020-12-23  2737.739990  2769.080078  2716.280029  2759.820068  2759.820068  1121300
    2020-12-24  2762.600098  2812.159912  2762.600098  2806.860107  2806.860107  1030900
    2020-12-28  2820.949951  2834.590088  2799.560059  2808.600098  2808.600098  1006200
    2020-12-29  2810.550049  2823.439941  2792.060059  2820.510010  2820.510010  1046800
    2020-12-30  2820.360107  2878.209961  2809.350098  2873.469971  2873.469971  1074000
    
    [248 rows x 6 columns]

     

     

    주석>>

     

    코드는 yfinance에서 제공하는 일반적인 사용방법입니다.

     

    1번 라인 : 선언 부분

    2번 라인 : 야후 금융에서 데이터를 불러 옵니다. 첫번째 입력 값 "^KS11"은 코스피를 의미합니다. 해당 값은 야후금융에서 코스피를 검색하면 확인할 수 있습니다. Start와 End는 불러올 데이터의 시작 시점과 끝 시점입니다. End를 작성하지 않으면 가장 최근 데이터 까지 불러 옵니다. 

     

    결과는 내용이 많을 경우 위에 5번째 줄과 아래 5번째 까지 출력합니다. 만일 전체를 확인하고 싶으시면 print(data.to_string()) 를 입력하시면 됩니다. 

    반응형

     

     

    [Python] yfinance로 고점 대비 하락율 그래프 그리기 : MDD, DD 계산하기

     

    우선 DD(Draw dowm)의 개념부터 이해해 보겠습니다.

     

     

     

    우선 최대값은 단순 최대값이 아닌 특정기간 동안 최대값 입니다. 그리고 이 특정 기간은 하루씩 이동하면서 결과를 모두 확인하여야 합니다. 즉 윈도우창(Window) 처럼 이동하면서 최대 값을 구하여야 합니다. 

     

    Pandas(판다스)에서 rolling 함수를 사용하면 쉽게 윈도우창을 이동하면서 최대값을 구할수 있습니다. yfinance에서 가져온 결과는 Pandas Dataframe 타입이므로 별도의 변경없이 사용할수 있습니다. 

     

    코드>>

    from pandas_datareader import data as pdr
    import yfinance as yf
    
    yf.pdr_override()
    data = pdr.get_data_yahoo("^KS11", start="2020-01-01", end="2021-01-01")
    
    window = 20 
    max_in_window = data['Close'].rolling(window, min_periods=1).max()
    dd = ((data['Close']/max_in_window) - 1.0)*100
    mdd = dd.rolling(window, min_periods=1).min()
    
    print(dd)

     

    결과>>

    [*********************100%***********************]  1 of 1 completed
    Date
    2020-01-02    0.000000
    2020-01-03    0.000000
    2020-01-06   -0.982784
    2020-01-07   -0.042267
    2020-01-08   -1.155542
                    ...
    2020-12-23   -0.677661
    2020-12-24    0.000000
    2020-12-28    0.000000
    2020-12-29    0.000000
    2020-12-30    0.000000
    Name: Close, Length: 248, dtype: float64

     

     

    주석>>

     

    7번 라인 : window 창의 크기를 20으로 한 것은 20일 크기의 윈도우가 움직이는 것입니다.

    8번 라인 : "Close" 열은 종가 값을 가져오는 것이고 이를 데이터프레임(Dataframe)의 rolling 함수에 넣어서 20간의 간격에서 최대값을 출력합니다. min_periods는 20일의 데이터가 없어도 1개만 있어도 max값을 가져오는 것 입니다.

    9번 라인 : 위 수식을 적용한 내용 입니다. (백분율(%))

    10번 라인 : Max draw down 으로 DD 값 중에 window를 사용해서 가장 낮은 값을 가져 옵니다.

     

    결과가 0인 경우는 현재가 윈도우 내에서 가장 고가라는 의미 입니다.

     

     

     

     

    [Python] yfinance로 고점 대비 하락율 그래프 그리기 : 코스피 DD 그래프 그리기

     

     

    코드>>

    from pandas_datareader import data as pdr
    import yfinance as yf
    
    yf.pdr_override()
    data = pdr.get_data_yahoo("^KS11", start="2020-01-01", end="2021-01-01")
    
    window = 20 
    max_in_window = data['Close'].rolling(window, min_periods=1).max()
    dd = ((data['Close']/max_in_window) - 1.0)*100
    mdd = dd.rolling(window, min_periods=1).min()
    
    import matplotlib.pyplot as plt
    
    plt.plot(dd.index, dd, color = "brown", label = "DD")
    plt.ylabel("Drop Rate(%)")
    plt.legend()
    plt.show()

     

     

    결과>>

    일년간 윈도우가 20일때 가장 많은 하락을 보인 구간은 3월 후반 정도이다 이때 투자했다면 하는 아쉬움이 있다.

     

     

     

     

    [Python] yfinance로 고점 대비 하락율 그래프 그리기 : 코스피, DD, MDD 한번에 확인하기

     

    코드>>

    from pandas_datareader import data as pdr
    import yfinance as yf
    
    yf.pdr_override()
    data = pdr.get_data_yahoo("^KS11", start="2020-01-01", end="2021-01-01")
    
    window = 20 
    max_in_window = data['Close'].rolling(window, min_periods=1).max()
    dd = ((data['Close']/max_in_window) - 1.0)*100
    mdd = dd.rolling(window, min_periods=1).min()
    
    import matplotlib.pyplot as plt
    
    plt.subplot(311)
    plt.plot(data.index, data['Close'], color = "green", label='KOSPI')
    plt.ylabel("Index")
    plt.legend()
    
    plt.subplot(312)
    plt.plot(dd.index, dd, color = "brown", label = "DD")
    plt.ylabel("Drop Rate(%)")
    plt.legend()
    
    plt.subplot(313)
    plt.plot(mdd.index, mdd, color = "red", label = "MDD")
    plt.ylabel("Drop Rate(%)")
    plt.legend()
    
    plt.show()

     

    결과>>

    반응형