이 글은
2022.07.07 - [주식분석/Quant 분석(프로그래밍)] - 주식 데이터 불러오기(yfinance) #1
에서 이어집니다.
위 글에서는 yfinance라는 python 라이브러리를 이용하여 주식 데이터를 불러오는 방법을 알아봤습니다. 그런데 분석을 위해 제가 관심종목에 넣어둔 기업하나를 넣어보니, 데이터가 제대로 불러와지지가 않아서 난감했습니다.
이 글에서는, 주식 데이터를 불러오는 다른 라이브러리를 알아보도록 하겠습니다. 바로
입니다(그림을 누르면 관련사이트로 연결됩니다.) 라이브러에 대한 소개는
한국 주식 가격, 미국주식 가격, 지수, 환율, 암호화폐 가격, 종목 리스팅 등 금융 데이터 수집 라이브러리
라 되어있습니다. 잘은 모르지만, 우리나라에서 개발한 라이브러리 같은 느낌입니다.
해당 모듈에 대한 설명은, 제가 평소에도 활발히 이용하는 Wikidocs 사이트에 자세히 설명되어 있습니다.
그럼 FinanceDataReader와 yfinance 라이브러리를 비교해 볼게요.
두 라이브러리의 비교
FinanceDataReader 라이브러리를 쓰려면 먼저 import를 해줘야 합니다.
import pandas as pd
import numpy as np
import yfinance
import datetime
from dateutil.relativedelta import relativedelta
import FinanceDataReader as fdr
def load_data(stock_code, start_date, end_date):
df = fdr.DataReader(stock_code, start_date, end_date)
return df
def load_date_by_yfinance(stock_code, start_date, end_date):
ticker = yfinance.Ticker(stock_code)
df = ticker.history(interval="1d", start=start_date, end=end_date)
return df
def fdr_vs_yfinance():
# stock_code_fdr = '065770'
# stock_code_yfinance = '065770.KQ'
stock_code_fdr = '005930'
stock_code_yfinance = '005930.KS'
end_date = datetime.datetime.today()
start_date = end_date - relativedelta(years=1)
df_fdr = load_data(stock_code_fdr, start_date,end_date)
df_yfinance = load_date_by_yfinance(stock_code_yfinance,start_date,end_date)
pd.set_option('display.max_columns', None)
print(df_fdr)
print(df_yfinance)
if __name__ == '__main__':
fdr_vs_yfinance()
간략히 살펴보겠습니다.
import FinanceDataReader as fdr #FinanceDataReader import
def load_data(stock_code, start_date, end_date):
df = fdr.DataReader(stock_code, start_date, end_date)
# stock_code: 종목코드(ex 삼성전자: 005930 처럼 6 letter로 이루어져 있는 str)
# start_date : data load 시작일자: datetime형
# end_date : data load 종료일자: datetime형
# output으로는 dataframe을 반환한다.
# dataframe의 index는 일자(datetime)
# dataframe의 column : Open, High, Low, Close, Volume, Change
# Open : 시가
# High : 고가
# Low : 저가
# Close : 종가
# Volume : 거래량
# Change : 일간 수익률
return df
def load_date_by_yfinance(stock_code, start_date, end_date):
ticker = yfinance.Ticker(stock_code)
df = ticker.history(interval="1d", start=start_date, end=end_date)
# dataframe df의 columns : Open, High, Low, Close, Volume, Dividends, Stock Splits
# FinancialDataReader에 비해 2 column Dividends, Stock Spilts를 더 가지는데 각각 배당, 액면분할에 대한 정보임
return df
이 코드는 전의 글에서 소개한 바 있습니다. interval ="1d"로 설정하여 일봉 데이터를 얻습니다.
def fdr_vs_yfinance():
# stock_code_fdr = '065770' # 종목명 CS의 FinancialDataReader 표기법
# stock_code_yfinance = '065770.KQ'
stock_code_fdr = '005930' # 종목명 삼성전자
stock_code_yfinance = '005930.KS' # 삼성전가의 내부표기(종목명 + '.KS')
# 만일 Kosdaq 종목이면 +'.KQ')
end_date = datetime.datetime.today() # 조회 끝날짜는 오늘로
start_date = end_date - relativedelta(years=1) # 시작일자는 종료일자보다 1년전이 되는 날
df_fdr = load_data(stock_code_fdr, start_date,end_date) #FianicialDataReader의 결과
df_yfinance = load_date_by_yfinance(stock_code_yfinance,start_date,end_date) #Yfinance의 결과
pd.set_option('display.max_columns', None) # 모든 column을 모두 보여주는 print 문 명령어
print(df_fdr)
print(df_yfinance)
○ from dateutil.relativedelta import relativedelta을 통해 조금 긴 (year, month, day ) 날짜 차이를 반영할 수 있습니다.
○ pd.set_option('display.max_columns', None) : df의 모든 column을 display 하는 명령어입니다.
결과
삼성전자 (005930)
먼저 국민주식 "삼성전자"입니다. 삼성전자는 종목코드 005930으로 yfinance에서는 ''005930.KS' 즉, KOSPI지수 내 종목임을 부각하는 접미어 '. KS'를 달고 있습니다. 결과를 보겠습니다.
Open High Low Close Volume Change
Date
2022-03-03 72300 73100 72200 72900 13232638 0.016736
2022-03-04 72700 72700 71200 71500 13409634 -0.019204
2022-03-07 70000 70600 69900 70100 18617138 -0.019580
2022-03-08 68800 70000 68700 69500 15828269 -0.008559
2022-03-10 70800 71200 70500 71200 21159248 0.024460
... ... ... ... ... ... ...
2023-02-23 61700 62500 61500 62000 13047099 0.014730
2023-02-24 62300 62600 61300 61300 10308143 -0.011290
2023-02-27 60800 60800 60200 60500 11155697 -0.013051
2023-02-28 60800 61400 60500 60600 13715861 0.001653
2023-03-02 60900 61800 60500 60900 9515825 0.004950
[248 rows x 6 columns]
Open High Low Close Volume \
Date
2022-03-02 70562.014383 70659.610530 69781.245206 69976.437500 12481430
2022-03-03 70562.016847 71342.786051 70464.420696 71147.593750 13232638
2022-03-04 71147.593750 71147.593750 71147.593750 71147.593750 0
2022-03-07 68317.310093 68902.887036 68219.713935 68414.906250 18617138
2022-03-08 67146.155036 68317.308903 67048.558880 67829.328125 15828269
... ... ... ... ... ...
2023-02-23 61700.000000 62500.000000 61500.000000 62000.000000 37145
2023-02-24 62300.000000 62600.000000 61300.000000 61300.000000 50792
2023-02-27 60800.000000 60800.000000 60200.000000 60500.000000 11155697
2023-02-28 60800.000000 61400.000000 60500.000000 60600.000000 13715861
2023-03-02 60900.000000 61800.000000 60500.000000 60900.000000 9343752
Dividends Stock Splits
Date
2022-03-02 0.0 0
2022-03-03 0.0 0
2022-03-04 0.0 0
2022-03-07 0.0 0
2022-03-08 0.0 0
... ... ...
2023-02-23 0.0 0
2023-02-24 0.0 0
2023-02-27 0.0 0
2023-02-28 0.0 0
2023-03-02 0.0 0
[248 rows x 7 columns]
Process finished with exit code 0
yfinance로 불러온 자료들을 보면, 소수점 아래 5자리 까지 시고저종 자료를 제공하고 있네요. 숫자가 복잡한 걸로 봐서 조정가격을 제공하는 것으로 보입니다(조정가격이란, 증자/감자, 주식의 수의 변화 등으로 가격 조정의 이슈가 있을 때 가격 시계열의 단차가 발생하지 않게끔 과거 자료의 주가를 조정해 주는 것을 말합니다.)
그런데 어떤 종목에서는 아예 데이터가 조회되지 않는 경우도 있습니다. 위 코드의 주석처리한 부분인 065770 주식을 볼까요?
CS (065770)
Open High Low Close Volume Change
Date
2022-03-03 2400 2440 2305 2410 841357 -0.036000
2022-03-04 2435 2595 2335 2380 562341 -0.012448
2022-03-07 2340 2395 2315 2320 382591 -0.025210
2022-03-08 2260 2285 2205 2215 446691 -0.045259
2022-03-10 2110 2195 1910 2165 764905 -0.022573
... ... ... ... ... ... ...
2023-02-23 1654 1654 1630 1650 26564 -0.012567
2023-02-24 1650 1666 1615 1643 39269 -0.004242
2023-02-27 1634 1653 1595 1650 32393 0.004260
2023-02-28 1633 1690 1627 1690 46720 0.024242
2023-03-02 1696 1707 1671 1694 28011 0.002367
[248 rows x 6 columns]
Open High Low Close Volume Dividends Stock Splits
Date
2023-03-02 1696.0 1707.0 1671.0 1697.0 28173 0 0
Process finished with exit code 0
이런.. yfinance로 불러온 자료에는 가장 최근인 오늘 데이터뿐이 없습니다. 반면에 FinanceDataReader 라이브러리로 호출하면 1년 시계열이 다 들어오고 있죠.
Kospi, Kosdaq 전 종목으로 조회해 보니, yfinance 에는 조금 미진한 부분이 있는 것 같습니다.
앞으로 대한민국 주식의 시계열을 조회할 때는 FinanceDataReader를 써야 할 것 같습니다.
여담
많은 개미들에게 다소 생소한 종목인 CS는 5G 섹터주로서, 통신 중계기를 만드는 회사입니다. 주식을 모르던 4년여 전, 지인의 소개(여기부터가 잘못)로 인생 최대금액을 투자한 종목이죠.
영업 손실이 난 해도 있고, 수익이 나더라도 거의 면피만 하는 수준의, 매출처라고는 SK텔레콤 정도 하나만 바라보고 있는 회사였습니다. 코로나 폭락 시에는 동전주가 되기도 했습니다(2023.3.2 현재, 1678원)
반 포기상태로 기다림을 지속하고 있던 와중, 20대 대선(2022.3.9)을 1년여 앞둔 시점부터 묘한 움직임을 보이기 시작했습니다. 5G 테마는커녕, 갑자기 민주당 대선주자 관련주로 엮이더니 21년 4월경에는 3 연상이라는 기염(귀여움?)을 토하기 시작했습니다. 한번 달구어진 상승세는 그 여운을 즐기기라도 하는 듯 동년 5월 12일 8,490원이라는 신고가를 찍게 됩니다.
이미 이성을 잃은 상태로 매도 목표가를 11,000원으로 한껏 부풀려 놨던 저는 그 보기 좋은 풍경을 감상만 하고 있었죠. 아무런 액션도 취하지 못한 채 2년 가까이 흐르며 주가는 다시 1,600원대, 저의 매집단가였던 3,300원 수준의 반타작 레벨로 회귀하였습니다.
지금까지, 앞으로 이 블로그에서 주가 분석의 예시로 CS가 많이 등장할 수 있음에 대한 배경 설명이었습니다.
'주식분석 > Quant 분석(프로그래밍)' 카테고리의 다른 글
기술적 지표 #1. AB Ratio (0) | 2023.03.08 |
---|---|
지지선과 저항선 (0) | 2023.03.05 |
주식 차트 그리기 #2: candlestick_ohlc 시고저종 봉차트 (0) | 2022.07.16 |
주식 차트 그리기 #1 : mplfinance (0) | 2022.07.08 |
주식 데이터 불러오기(yfinance) #1 (0) | 2022.07.07 |
댓글