[python] pykrx로 주가 데이터 가져오기

pykrx로 주가 데이터 가져오기

pykrx

https://github.com/sharebook-kr/pykrx

  • KRX, Naver 등의 웹사이트에서 주가정보를 스크래핑하는 모듈

1. 설치

In [1]:
# !pip install pykrx

2. 사용법

  • 먼저 pykrx의 stock 모듈을 import 한 후 다른 작업 진행
In [2]:
from pykrx import stock

2.1. 종목코드 조회

  • get_market_ticker_list(date="YYYYMMDD", market="거래소명")

  • market의 기본값은 KOSPI

  • date를 지정하지 않으면 가장 최근 영업일의 목록을 조회함

In [3]:
# KOSPI/KOSDAQ/KONEX 종목코드 조회
stock_code = stock.get_market_ticker_list(date="20210520", market="ALL")
(stock_code[:6], len(stock_code))
Out[3]:
(['060310', '095570', '006840', '054620', '265520', '211270'], 2562)
  • 2021년 5월 20일 현재 KOSPI, KOSDAQ, KONEX에는 총 2562종목이 있음
In [4]:
# KOSPI 종목코드 조회
stock_code = stock.get_market_ticker_list(date="20210520", market="KOSPI")
(stock_code[:6], len(stock_code))
Out[4]:
(['095570', '006840', '027410', '282330', '138930', '001460'], 923)
  • 그 중 코스피에는 923 종목
In [5]:
# KOSDAQ 종목코드 조회
stock_code = stock.get_market_ticker_list(date="20210520", market="KOSDAQ")
(stock_code[:6], len(stock_code))
Out[5]:
(['060310', '054620', '265520', '211270', '035760', '051500'], 1503)
  • 코스닥에는 1503종목
In [6]:
# KONEX 종목코드 조회
stock_code = stock.get_market_ticker_list(date="20210520", market="KONEX")
(stock_code[:6], len(stock_code))
Out[6]:
(['278990', '112190', '183410', '076340', '243870', '244880'], 136)
  • 코넥스에는 136종목이 있음
In [7]:
# 종목명 반환
stock_name = stock.get_market_ticker_name("005930")
stock_name
Out[7]:
'삼성전자'

2.2. 일자별 OHLCV(시가, 고가, 저가, 종가, 거래량) 조회

In [8]:
# 삼성전자의 20210501~20210520의 주가데이터
df = stock.get_market_ohlcv_by_date(fromdate="20210501", todate="20210520", ticker="005930")
df
Out[8]:
시가 고가 저가 종가 거래량
날짜
2021-05-03 81000 82400 81000 81700 15710336
2021-05-04 81900 82600 81800 82600 12532550
2021-05-06 81700 82300 81700 82300 17047511
2021-05-07 81800 82100 81500 81900 14154882
2021-05-10 82300 83500 81800 83200 19385027
2021-05-11 82500 82600 81100 81200 28996680
2021-05-12 80800 81200 79800 80000 35812268
2021-05-13 78900 79600 78400 78500 31490096
2021-05-14 79000 80300 78900 80100 16450920
2021-05-17 80800 80900 79200 79600 17740855
2021-05-18 79600 80000 79100 79600 17494407
2021-05-20 79400 79700 79100 79500 16541828
  • 한번에 많은 종목을 조회하면 ip가 차단될 수 있기 때문에 반복분을 돌면서 사용할때는 time 모듈로 sleep을 걸어주는 것이 좋음
In [9]:
import time
import pandas as pd
stock_code = stock.get_market_ticker_list() # 현재일자 기준 가장 가까운 영업일의 코스피 상장종목 리스트
res = pd.DataFrame()
for ticker in stock_code[:4]:
    df = stock.get_market_ohlcv_by_date(fromdate="20210517", todate="20210520", ticker=ticker)
    df = df.assign(종목코드=ticker, 종목명=stock.get_market_ticker_name(ticker))
    res = pd.concat([res, df], axis=0)
    time.sleep(1)
res = res.reset_index()
res
Out[9]:
날짜 시가 고가 저가 종가 거래량 종목코드 종목명
0 2021-05-17 6320 6340 5920 6180 295284 095570 AJ네트웍스
1 2021-05-18 6090 6220 6070 6190 76393 095570 AJ네트웍스
2 2021-05-20 6150 6160 5760 5820 253202 095570 AJ네트웍스
3 2021-05-17 33750 35150 33200 34900 124814 006840 AK홀딩스
4 2021-05-18 35000 35100 33800 34600 98239 006840 AK홀딩스
5 2021-05-20 34800 35100 33900 35000 65749 006840 AK홀딩스
6 2021-05-17 6990 7010 6880 6910 223309 027410 BGF
7 2021-05-18 6840 6930 6740 6880 449796 027410 BGF
8 2021-05-20 6810 6880 6770 6820 262941 027410 BGF
9 2021-05-17 177500 181500 176000 180500 30384 282330 BGF리테일
10 2021-05-18 183000 183500 180000 182000 21897 282330 BGF리테일
11 2021-05-20 178000 182000 175000 178000 37376 282330 BGF리테일

2.3 특정일자의 전체종목 시세 조회

  • get_market_ohlcv_by_ticker(date="YYYYMMDD", market="거래소명")

  • market의 기본값은 "ALL"(전체 시장; 코스피(KOSPI)/코스닥(KOSDAQ)/코넥스(KONEX))

In [10]:
df = stock.get_market_ohlcv_by_ticker(date="20210520")
df.head()
Out[10]:
시가 고가 저가 종가 거래량 거래대금 등락률
티커
095570 6150 6160 5760 5820 253202 1492626480 -5.98
006840 34800 35100 33900 35000 65749 2276759650 1.16
027410 6810 6880 6770 6820 262941 1787892060 -0.87
282330 178000 182000 175000 178000 37376 6621394500 -2.20
138930 8020 8090 7900 7960 1861401 14829564980 -1.49
In [11]:
df = stock.get_market_ohlcv_by_ticker(date="20210520", market="KOSPI")
df.head()
Out[11]:
시가 고가 저가 종가 거래량 거래대금 등락률
티커
095570 6150 6160 5760 5820 253202 1492626480 -5.98
006840 34800 35100 33900 35000 65749 2276759650 1.16
027410 6810 6880 6770 6820 262941 1787892060 -0.87
282330 178000 182000 175000 178000 37376 6621394500 -2.20
138930 8020 8090 7900 7960 1861401 14829564980 -1.49

2.4. 모든 종목의 가격 변동 조회

  • get_market_price_change_by_ticker(fromdate="조회시작일", todate="조회종료일", market="거래소명")

  • market의 기본값은 "ALL"

  • 조회시작일 대비 조회종료일의 변동을 계산

In [12]:
from pykrx import stock
df = stock.get_market_price_change_by_ticker(fromdate="20210517", todate="20210520")
df.head()
Out[12]:
종목명 시가 종가 변동폭 등락률 거래량 거래대금
티커
095570 AJ네트웍스 6260 5820 -440 -703.0 624879 3770361760
006840 AK홀딩스 33500 35000 1500 448.0 288802 9957000550
027410 BGF 6930 6820 -110 -159.0 936046 6408638450
282330 BGF리테일 177500 178000 500 28.0 89657 16027170500
138930 BNK금융지주 8100 7960 -140 -173.0 4689744 37628415360

2.5 특정일자의 종목별 DIV/BPS/PER/EPS 조회

  • get_market_fundamental_by_ticker(date="YYYYMMDD", market="거래소명")

  • market의 기본값은 "ALL"

  • DIV(배당수익률): (주가배당금/주가) * 100

  • BPS(주당순자산가치=청산가치): (순자산)/(총발행주식수)

  • PER(주가수익비율): (주가)/(주당순이익)

  • EPS(주당순이익): (당기순이익)/(총발행주식수)

  • PBR(주가순자산비율) = (주가)/(BPS) = PER*EPS / BPS

In [13]:
df = stock.get_market_fundamental_by_ticker(date="20210520")
df.head()
Out[13]:
BPS PER PBR EPS DIV DPS
티커
095570 6089 0.000000 0.959961 0 3.609375 210
006840 50471 0.000000 0.689941 0 1.139648 400
027410 15781 23.937500 0.429932 285 1.610352 110
282330 40317 25.062500 4.421875 7103 1.349609 2400
138930 26781 5.308594 0.300049 1498 4.019531 320

2.6 일자별 DIV/BPS/PER/EPS 조회

  • get_market_fundamental_by_date(fromdate, todate, ticker, freq='d', name_display=False)

  • freq: d(일), m(월), y(연도)

In [14]:
df = stock.get_market_fundamental_by_date(fromdate="20210517", todate="20210520", ticker="005930")
df.head()
Out[14]:
BPS PER PBR EPS DIV DPS
날짜
2021-05-17 39406 20.72 2.02 3841 3.76 2994
2021-05-18 39406 20.72 2.02 3841 3.76 2994
2021-05-20 39406 20.70 2.02 3841 3.77 2994
  • prkrx는 이 밖에도 거래실적 추이 조회, 시가총액 조회, 투자자별 거래정보, 인덱스 리스트 조회 등 다양한 기능을 제공하고 있음. 자세한 정보는 pykrx 깃허브를 참고