파이썬 주식 데이터 가져오기 - paisseon jusig deiteo gajyeoogi

python으로 주식이나 지수 데이터를 불러오는 다양한 방법이 있습니다. 그중 Yahoo Finance의 정보를 제공해 주는 pythion 오픈 소스가 있습니다. 바로 

yfinance

입니다.

파이썬 주식 데이터 가져오기 - paisseon jusig deiteo gajyeoogi
금융데이터로 아직 먹어주는 원로 포털 Yahoo!!

yfinance tool 을 사용하기 위하여 python 코드에 우선 

import yfinance as yf

import를 해줍니다.

자 그럼, 삼성전자(005930.KS) 주가를 yfinance로 불러오는 방법을 알아보겠습니다.

1. 삼성전자 ticker 찾기

 yahoo finance 홈페이지에서 지수나 종목의 ticker를 찾을 수 있습니다. 검색을 해보면

파이썬 주식 데이터 가져오기 - paisseon jusig deiteo gajyeoogi
삼순? 만 쳐도 자동완성으로 나옴

영어로 검색해야 하는 부담이 있으나, 종목 코드를 알고 있으면 찾기 더 쉽습니다. 어쨌든 삼성전자의 종목 코드는

005930.KS

입니다.


2. history 함수나 download 함수를 이용하여 정보 가져오기

□ yfinance.history 사용

    name = '005930.KS'
    ticker = yf.Ticker(name)
    df = ticker.history(interval='1d', period='5y', auto_adjust=False)

○ yfinance.Ticker 함수를 이용하여 삼성전자(005930.KS)의 ticker 를 생성합니다.

○ history 함수를 사용하여 data 를 불러옵니다. (예시: 1 day 즉 일봉 정보, 5년간, 수정주가 아닌 데이터)

○ python에서 지원하는 dataframe 이라는 형식의 결과를 얻습니다.

○ yfinance 의 base.py 안에 있는 history 함수를 열어보면 다음과 같습니다. 중요한 parameter들을 살펴보면

parameters 내용
period 조회 기간,  1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y,1 0y, ytd, max,  오늘부터 과거까지의 기간, 생략하면 max 값이 default
interval 일/주/월/분기 봉 등과  1분/2분/5분/15분/30분/60분/90분 봉, 생략하면 '1d'가 default
start 조회 시작일을 지정할 때,  'YYYY-MM-DD' 형식 또는 datetime 형식
end 조회 종료일을 지정할 때,  'YYYY-MM-DD' 형식 또는 datetime 형식
auto_adjust 수정 주가를 얻고 싶을 때, default 는 True, 즉 수정주가를 조회하여 줌

더보기

    def history(self, period="1mo", interval="1d",
                start=None, end=None, prepost=False, actions=True,
                auto_adjust=True, back_adjust=False,
                proxy=None, rounding=False, tz=None, timeout=None, **kwargs):
        """
        :Parameters:
            period : str
                Valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
                Either Use period parameter or use start and end
            interval : str
                Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
                Intraday data cannot extend last 60 days
            start: str
                Download start date string (YYYY-MM-DD) or _datetime.
                Default is 1900-01-01
            end: str
                Download end date string (YYYY-MM-DD) or _datetime.
                Default is now
            prepost : bool
                Include Pre and Post market data in results?
                Default is False
            auto_adjust: bool
                Adjust all OHLC automatically? Default is True
            back_adjust: bool
                Back-adjusted data to mimic true historical prices
            proxy: str
                Optional. Proxy server URL scheme. Default is None
            rounding: bool
                Round values to 2 decimal places?
                Optional. Default is False = precision suggested by Yahoo!
            tz: str
                Optional timezone locale for dates.
                (default data is returned as non-localized dates)
            timeout: None or float
                If not None stops waiting for a response after given number of
                seconds. (Can also be a fraction of a second e.g. 0.01)
                Default is None.
            **kwargs: dict
                debug: bool
                    Optional. If passed as False, will suppress
                    error message printing to console.
        """

반환되는 결과는 Dataframe으로서 다음과 같습니다.

- index : Date

- column 

Open High Low Close Adj Close Volume Dividends Stock Splits
시가 고가 저가 종가 수정 주가 거래량 배당금액 주식분할

: 소위 시고저종 이라고 불리는 가격과  액면분할, 권리락 등을 반영한 수정주가, 또 거래량, 배당금, 주식분할을 column으로 합니다.

- 만일 auto_adjust = True 라 하면 수정주가를 반환합니다. 따라서 위의 표에서 Adj Close를 제외한 결과를 보여줍니다.

□ yfinance.download사용

    name = '005930.KS'
    df = yf.download(name, period='5y')

○ history 함수와 다른 점은 ticker를 파라미터로 받는다는 것입니다.

○ interval은 생략하면 '1d'가 default입니다.

○ yfinance의 multi.py 안에 함수 설명이 있습니다.

더보기

def download(tickers, start=None, end=None, actions=False, threads=True,
             group_by='column', auto_adjust=False, back_adjust=False,
             progress=True, period="max", show_errors=True, interval="1d", prepost=False,
             proxy=None, rounding=False, timeout=None, **kwargs):
    """Download yahoo tickers
    :Parameters:
        tickers : str, list
            List of tickers to download
        period : str
            Valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
            Either Use period parameter or use start and end
        interval : str
            Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
            Intraday data cannot extend last 60 days
        start: str
            Download start date string (YYYY-MM-DD) or _datetime.
            Default is 1900-01-01
        end: str
            Download end date string (YYYY-MM-DD) or _datetime.
            Default is now
        group_by : str
            Group by 'ticker' or 'column' (default)
        prepost : bool
            Include Pre and Post market data in results?
            Default is False
        auto_adjust: bool
            Adjust all OHLC automatically? Default is False
        actions: bool
            Download dividend + stock splits data. Default is False
        threads: bool / int
            How many threads to use for mass downloading. Default is True
        proxy: str
            Optional. Proxy server URL scheme. Default is None
        rounding: bool
            Optional. Round values to 2 decimal places?
        show_errors: bool
            Optional. Doesn't print errors if True
        timeout: None or float
            If not None stops waiting for a response after given number of
            seconds. (Can also be a fraction of a second e.g. 0.01)
    """

반환되는 결과는 Dataframe으로서 다음과 같습니다.

- index : Date

- column 

Open High Low Close Adj Close Volume
시가 고가 저가 종가 수정 주가 거래량

: 소위 시고저종 이라고 불리는 가격과  액면분할, 권리락 등을 반영한 수정주가, 또 거래량을 column으로 합니다.

예제

yfinance의 download로 조회하는 예제입니다.

if __name__ == '__main__':
    # pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
    pd.set_option('display.width', 500)
    # pd.set_option('display.colheader_justify', 'center')
    # pd.set_option('display.precision', 0)

    # name = 'SPY'
    name = '005930.KS'
    ticker = yf.Ticker(name)
    # df = ticker.history(interval='1d', period='5y')
    # print(df)
    df1 = yf.download(name, period='5y')
    print('Result of yf.download(name, period=5y)')
    print(df1)
    print('\n')

    df2 = yf.download(name, interval='1h', period='1d')
    print('Result of yf.download(name, interval=1h, period=1d)')
    print(df2)
    print('\n')

    raw_datas = 100
    t_end = datetime.today()
    t_start = t_end - timedelta(days=raw_datas)
    df3 = yf.download(name, start= t_start, end= t_end)
    print('Result of yf.download(name, start= t_start, end= t_end)')
    print(df3)
    print('\n')

    df4 = yf.download(name, start='2022-01-01', end='2022-06-30')
    print('Result of yf.download(name, start=2022-01-01, end=2022-06-30)')
    print(df4)
    print('\n')

구체적으로 보면,

import yfinance as yf
from datetime import datetime, timedelta
import pandas as pd

○  yfinance를 import 합니다.

○ 오늘 날짜, 날짜 사이의 차이 등 날짜에 관련된 계산을 위해 datetime을 import 합니다.

○ dataframe을 다루기 위해 pandas를 pd라는 이름으로 import 합니다.

    # pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)

일반적으로 dataframe을 print 함수로 출력을 하게 되면 열과 행을 줄임표를 사용하여 간략하게 보여줍니다. 만일 모든 열의 데이터를 보고 싶을 때는 pandas안의 set_option에 모든 열을 보여주는 display.max_columns를 선택해 주면 됩니다.

○ 만일 모든 행의 데이터를 보고 싶으면 주석 처리되어 있는 display.max_rows를 선택해 주면 됩니다.

    name = '005930.KS'

    df1 = yf.download(name, period='5y')
    print('Result of yf.download(name, period=5y)')
    print(df1)
    print('\n')

○ start , end 가 지정되어 있지 않으므로  가장 최근일(오늘 포함)부터 5 year 기간 동안 조회합니다.

    df2 = yf.download(name, interval='1h', period='1d')
    print('Result of yf.download(name, interval=1h, period=1d)')
    print(df2)
    print('\n')

1h봉, 즉 1시간 봉을 1일(1d) 기간을 조회하여 출력합니다. 오늘로부터 1d 기간이니 오늘 하루 동안의 1시간 봉이겠네요.

    raw_datas = 100
    t_end = datetime.today()
    t_start = t_end - timedelta(days=raw_datas)
    df3 = yf.download(name, start= t_start, end= t_end)
    print(df3)

○ 조회일자를 특정한 예제입니다. 오늘과 오늘로부터 raw_dates =100일 사이의 기간 동안 주가를 조회하고 싶습니다.

○ datetime.today()를 하면 오늘 날짜를 datetime 형식으로 반환합니다.

○ 며칠 전의 날짜를 계산하기 위해 datetime 안의 timedelta를 사용해 줍니다.

    df4 = yf.download(name, start='2022-01-01', end='2022-06-30')
    print('yf.download(name, start=2022-01-01, end=2022-06-30)')
    print(df4)
    print('\n')

○ 조회 기간의 날짜를 특정일자로 지정합니다.

 결과는 아래와 같습니다.

[*********************100%***********************]  1 of 1 completed
Result of yf.download(name, period=5y)
               Open     High      Low    Close     Adj Close    Volume
Date                                                                  
2017-07-07  47740.0  48120.0  47620.0  47860.0  41580.144531   8131900
2017-07-10  48500.0  48900.0  48320.0  48660.0  42275.179688  10792750
2017-07-11  48640.0  49000.0  48280.0  49000.0  42570.566406   9717800
2017-07-12  49000.0  50000.0  48840.0  49880.0  43335.097656   9486150
2017-07-13  50080.0  50940.0  50040.0  50560.0  43925.867188  16034150
...             ...      ...      ...      ...           ...       ...
2022-07-01  56900.0  57500.0  55900.0  56200.0  56200.000000  24982097
2022-07-04  56100.0  57400.0  55700.0  57100.0  57100.000000  17807126
2022-07-05  57600.0  58200.0  57200.0  57200.0  57200.000000  14216539
2022-07-06  57300.0  57300.0  56400.0  56400.0  56400.000000  16820461
2022-07-07  56400.0  58700.0  56300.0  58200.0  58200.000000  21034193

[1225 rows x 6 columns]


[*********************100%***********************]  1 of 1 completed
Result of yf.download(name, interval=1h, period=1d)
                              Open     High      Low    Close  Adj Close   Volume
2022-07-07 09:00:00+09:00  56400.0  58200.0  56300.0  57800.0    57800.0        0
2022-07-07 10:00:00+09:00  57900.0  58000.0  57400.0  57700.0    57700.0  2402583
2022-07-07 11:00:00+09:00  57700.0  58200.0  57600.0  58100.0    58100.0  2004404
2022-07-07 12:00:00+09:00  58100.0  58200.0  58000.0  58200.0    58200.0  1233166
2022-07-07 13:00:00+09:00  58200.0  58500.0  58000.0  58500.0    58500.0  2838654
2022-07-07 14:00:00+09:00  58400.0  58700.0  58300.0  58300.0    58300.0  2554807
2022-07-07 15:00:00+09:00  58200.0  58200.0  58200.0  58200.0    58200.0        0


[*********************100%***********************]  1 of 1 completed
Result of yf.download(name, start= t_start, end= t_end)
               Open     High      Low    Close  Adj Close    Volume
Date                                                               
2022-03-29  70000.0  70300.0  69800.0  70200.0    69839.0  13686208
2022-03-30  70300.0  70500.0  69800.0  69900.0    69900.0  12670187
2022-03-31  69900.0  70200.0  69600.0  69600.0    69600.0  12510366
2022-04-01  69500.0  69500.0  69000.0  69100.0    69100.0  15916846
2022-04-04  68900.0  69300.0  68600.0  69300.0    69300.0  11107905
...             ...      ...      ...      ...        ...       ...
2022-07-01  56900.0  57500.0  55900.0  56200.0    56200.0  24982097
2022-07-04  56100.0  57400.0  55700.0  57100.0    57100.0  17807126
2022-07-05  57600.0  58200.0  57200.0  57200.0    57200.0  14216539
2022-07-06  57300.0  57300.0  56400.0  56400.0    56400.0  16820461
2022-07-07  56400.0  58700.0  56300.0  58200.0    58200.0  21034193

[69 rows x 6 columns]


[*********************100%***********************]  1 of 1 completed
Result of yf.download(name, start=2022-01-01, end=2022-06-30)
               Open     High      Low    Close     Adj Close    Volume
Date                                                                  
2022-01-04  78800.0  79200.0  78300.0  78700.0  78295.289062  12427416
2022-01-05  78800.0  79000.0  76400.0  77400.0  77001.976562  25470640
2022-01-06  76700.0  77600.0  76600.0  76900.0  76504.546875  12931954
2022-01-07  78100.0  78400.0  77400.0  78300.0  77897.343750  15163757
2022-01-10  78100.0  78100.0  77100.0  78000.0  77598.890625   9947422
...             ...      ...      ...      ...           ...       ...
2022-06-23  57700.0  58000.0  56800.0  57400.0  57400.000000  28338608
2022-06-24  57900.0  59100.0  57700.0  58400.0  58400.000000  23256103
2022-06-27  59000.0  59900.0  58300.0  58800.0  58800.000000  18122236
2022-06-28  59200.0  59500.0  58700.0  59400.0  59400.000000  13540538
2022-06-29  58500.0  58800.0  58000.0  58000.0  58000.000000  14677138

[118 rows x 6 columns]



Process finished with exit code 0

○ 결과 모두 Date를 index로 하고 column이 Open, High, Low, Close, Adj Close, Volume을 column으로 하는 주가 데이터를 잘 출력했습니다.

시고저종 데이터를 얻을 수 있으니, 이제 차트도 한번 그려봐야겠죠. 차트는 다음 글에서 그려보도록 하겠습니다.