본문 바로가기
주식분석/Quant 분석(프로그래밍)

주식 데이터 불러오기 : FinanceDataReader 라이브러리

by hustler78 2023. 3. 2.
728x90
반응형

이 글은

2022.07.07 - [주식분석/Quant 분석(프로그래밍)] - 주식 데이터 불러오기(yfinance) #1

 

주식 데이터 불러오기(yfinance) #1

python으로 주식이나 지수 데이터를 불러오는 다양한 방법이 있습니다. 그중 Yahoo Finance의 정보를 제공해 주는 pythion 오픈 소스가 있습니다. 바로 yfinance 입니다. yfinance tool 을 사용하기 위하여 pytho

sine-qua-none.tistory.com

에서 이어집니다.

 

위 글에서는 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가 많이 등장할 수 있음에 대한 배경 설명이었습니다.

728x90
반응형

댓글