목차
[Python] yfinance로 고점 대비 하락율 그래프 그리기 : 배경 지식
yfinance 는 야후파이낸스(Yahoo finance)에 나와 있는 데이터를 파이썬으로 쉽게 이용할 수 있게 만들어진 라이브러리 입니다.
이번 포스트의 목적은 yfinance를 사용해서 코스피(Kospi) 의 1년 간에 종가 데이터를 가져와서 고정 대비 하락율을 계산하는 MDD(Maximum Draw Down)와 DD(Draw Down)을 구해서 matplotlib 라이브러리를 사용해서 그래프로 표현할 생각 입니다.
개인적으로 주식을 하는데 MDD가 6프로 이상 떨어질때 주식을 구입하기 위해 해당 코드를 작성 했습니다.
필요하신 분들은 아래 코드를 통해 성투하시길 바랍니다 ㅎ
앞서 언급한 라이브러리에 대해 자세히 알고 싶으시면 아래 링크를 참조 하시면 됩니다.
[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()
결과>>
'파이썬(Python) > 웹스크롤링' 카테고리의 다른 글
[Python]Selenium BluetoothAvailability()에러 해결 방법 (usb_device_handle_win) (0) | 2022.01.24 |
---|---|
[Python] 네이버 금융 주식 정보 가져오기 (ex. 삼성전자) (0) | 2021.11.09 |
[Python] yfinance 함수 사용법 정리 (코스피,테슬라) (0) | 2021.11.02 |
[Python] BS4로 네이버금융 종목분석-재무분석 값 가져오기 (0) | 2021.10.27 |
selenium 에러발생 시 해결방법 "selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element" (4) | 2021.07.15 |