본 모듈은 다양한 웹 싸이트 (Naver / KRX)에서 주가 정보를 스크래핑(scraping) 합니다. API 사용에 대한 책임은 사용자 본인에게 있습니다. 도의적으로도 무분별한 API 호출은 자제해 주시기 부탁드립니다. 또한 결과물은 참고용으로만 사용해야하며, 투자에 대한 책임은 사용자에게 있습니다.
pykrx는 pip을 사용해서 쉽게 설치할 수 있습니다.
pip install pykrx
pykrx는 유가 증권시장의 주식 정보를 스크래핑 합니다. 모듈의 사용은 import부터 시작합니다.
from pykrx import stock
코스피 종목의 주가 관련 정보를 얻는 API 입니다.
get_market_ticker_list() 메서드는 전 종목의 ticker를 리스트로 반환합니다.
tickers = stock.get_market_ticker_list()
print(tickers)
['060310', '095570', '068400', '006840', '054620', ...]
날짜(YYMMDD)를 추가로 입력하면 해당 일자의 ticker를 얻을 수 있습니다.
tickers = stock.get_market_ticker_list("29100404")
print(tickers)
2394
get_market_ticker_name() 함수로 티커를 입력하면 종목이름을 반환합니다.
종목 = stock.get_market_ticker_name("000660")
print(종목)
SK하이닉스
get_market_ohlcv_by_date() 함수는 시작일/종료일/티커 세 개의 파라미터를 입력받아 OHLCV를 일자별로 정렬하여 DataFrame으로 반환합니다.
df = stock.get_market_ohlcv_by_date("20180810", "20181212", "005930")
print(df.head(3))
과거 일자의 OHLCV가 위쪽에 위치하는 것을 확인할 수 있습니다.
시가 고가 저가 종가 거래량
2018-08-10 46150 46400 44850 45400 16670643
2018-08-13 44950 45100 44650 45050 9803831
2018-08-14 44850 45400 44850 45150 6409259
get_market_ohlcv_by_date() 함수에 frequency 파라미터(d/m/y)를 추가할 수 있습니다. d는 일자, m은 월, y는 연도를 의미합니다. 다음은 20180810부터 20181212까지의 삼성전자 월별 OHLCV 데이터를 출력합니다.
df = stock.get_market_ohlcv_by_date("20180810", "20181212", "005930", "m")
print(df.head(3))
시가 고가 저가 종가 거래량
2018-08 46150 48450 43500 48450 135518029
2018-09 48200 48300 44000 46450 197984482
2018-10 46450 46800 40400 42400 234645485
get_stock_ticker_list() 함수와 함께 사용하면 전종목의 OHLCV를 가져올 수 있습니다. 한 번에 너무 많은 정보를 요청하면 KRX 서버가 차단할 수 있으므로 time 모듈을 사용해서 1초 지연 후 요청하도록 코드를 작성했습니다.
import time
for ticker in stock.get_stock_ticker_list():
df = stock.get_market_ohlcv_by_date("20181210", "20181212", ticker)
print(df.head())
time.sleep(1)
get_market_price_change_by_ticker() 함수는 입력된 기간 동안의 가격 가격 변동 정보를 반환합니다. 다음 코드는 20180301-20180320 동안의 가격 변동폭을 조회합니다.
df = stock.get_market_price_change_by_ticker("20180301", "20180320")
print(df.head(2))
종목명 시가 종가 변동폭 등락률 거래량 거래대금
000020 동화약품 11400 12300 900 7.89 4573591 54852078400
000030 우리은행 16600 15550 -1050 -6.33 21956076 345083853864
입력된 기간에 상장 폐지 되는 종목이 포함될 수 있습니다. 예를 들어 썬코어(051170)은 해당 기간에 상장 폐지가 됐으므로 종가가 0, 등락폭이 -100%로 표시된 것을 확인할 수 있습니다.
print(df.loc["051170"])
종목명 썬코어
시가 1360
종가 0
변동폭 -1360
등락률 -100
거래량 0
거래대금 0
get_market_fundamental_by_ticker() 함수는 입력된 일자의 DIV/BPS/PER/EPS/PBR를 조회합니다. PBR은 PER x EPS / BPS
로 계산된 값입니다.
df = stock.get_market_fundamental_by_ticker("20180305")
print(df.head(2))
종목명 DIV BPS PER EPS PBR
000250 삼천당제약 0.14 5689 84.480003 422 6.266578
000440 중앙에너비스 2.76 37029 25.549999 1135 0.783150
get_market_fundamental_by_date() 함수는 특정 종목에 대해 입력된 기간의 DIV/BPS/PER/EPS/PBR를 조회합니다. PBR은 PER x EPS / BPS
로 계산된 값입니다.
df = stock.get_market_fundamental_by_date("20180301", "20180320", '005930')
print(df.head(2))
DIV BPS PER EPS PBR
20180302 1.24 1156530 14.570000 157967 1.990073
20180305 1.26 1156530 14.310000 157967 1.954560
get_market_fundamental_by_date() 함수에 frequency 파라미터(d/m/y)를 추가할 수 있습니다. d는 일자, m은 월, y는 연도를 의미합니다. 다음은 20180810부터 20181212까지의 삼성전자 월별 DIV/BPS/PER/EPS를 출력합니다. 이때 해당 월의 종가를 기준으로 값이 출력됩니다.
df = stock.get_market_fundamental_by_date("20180810", "20181212", "005930", "m")
print(df.head(2))
DIV BPS PER EPS
201808 1.87 28126 7.57 5997
201809 1.79 28126 7.91 5997
코스피 인덱스를 조회합니다.
get_index_kospi_ticker_list() 함수는 코스피 인덱스 종류를 리스트로 반환합니다.
tickers = stock.get_index_kospi_ticker_list()
print(tickers)
['코스피', '코스피 200', '코스피 100', '코스피 50', ... ]
get_index_kospi_ohlcv_by_date() 함수는 입력된 기간 동안의 인덱스 OHLCV를 조회합니다. 다음은 20190101-20190228 동안의 "코스피 200" 인덱스의 OHLCV를 조회합니다.
df = get_index_kospi_ohlcv_by_date("20190101", "20190228", "코스피 200")
print(df.head(2))
시가 고가 저가 종가 거래량
20190102 263.350006 263.769989 257.470001 258.230011 69950000
20190103 258.190002 258.700012 255.350006 255.770004 90521000
get_index_kospi_ohlcv_by_date() 함수에 frequency 파라미터(d/m/y)를 추가할 수 있습니다. d는 일자, m은 월, y는 연도를 의미합니다. 다음은 20190101부터 20190228까지의 "코스피 200"의 월별 OHLCV를 출력합니다.
df = get_index_kospi_ohlcv_by_date("20190101", "20190228", "코스피 200", "m")
print(df.head(2))
시가 고가 저가 종가 거래량
201901 263.350006 288.869995 254.550003 285.890015 2157758000
201902 287.070007 290.320007 280.019989 283.799988 1498968000
get_index_kospi_by_group() 함수는 코스피 인덱스별로 기준지수와 현재지수를 출력합니다.
df = stock.get_index_kospi_by_group("20190228")
print(df.head())
기준시점 발표시점 기준지수 현재지수 시가총액
코스피 1983.01.04 1980.01.04 100.0 2195.44 1448767024
코스피 200 1994.06.15 1990.01.03 100.0 283.80 1254863174
코스피 100 2000.03.02 2000.01.04 1000.0 2152.14 1135924335
코스피 50 2000.03.02 2000.01.04 1000.0 1884.17 960728527
코스피 200 중소형주 2015.07.13 2010.01.04 1000.0 1011.56 118938839
KRX는 (T+2)일 이후의 데이터를 제공합니다. 최근 영업일이 20190405라면 20190403일을 포함한 이전 데이터를 얻을 수 있습니다.
get_shorting_status_by_date() 메서드는 시작일/종료일/티커 세 개의 파라미터를 입력받아 공매도 현황을 DataFrame으로 반환합니다.
df = stock.get_shorting_status_by_date("20181210", "20181212", "005930")
print(df)
당일 잔고와 (전일 잔고 + 당일 공매도 - 당일 상환) 수량은 정확하게 일치하지 않을 수 있습니다. 이는 투자자가 보유한 공매도잔고 비율이 상장주식수의 0.01% 미만인 경우 보고의 의무가 없기 때문에 집계되지 않을 수 있습니다.
공매도 잔고 공매도금액 잔고금액
20190401 154884 3403293 6981626250 153318349650
20190402 186528 3435390 8529586850 157169092500
20190403 211750 3380137 9837895500 157514384200
get_shorting_volume_by_ticker() 메서드는 입력받은 일자의 공매도 거래량 정보를 DataFrame으로 반환합니다.
df = stock.get_shorting_volume_by_ticker("20190401", "KOSPI")
print(df.head())
종목명 수량 거래량 비중
000020 동화약품 9 31132 0.03
000040 KR모터스 222 193986 0.11
코스피/코스닥의 공매도 거래량을 조회할 수 있습니다. 사용하지 않을 경우 코스피가 선택됩니다.
df = stock.get_shorting_volume_by_ticker("20190401", "KOSDAQ")
print(df.head())
조회 속도는 조회 기간에 비례해서 증가합니다. (내부적으로 500개씩 데이터를 조회하며, 각각의 조회 마다 0.3초 delay됩니다.)
get_shorting_investor_volume_by_date() 함수는 시작일/종료일 두 개의 파라미터를 입력받아 해당 기간동안 코스피 종목의 투자자별 공매도 거래량을 DataFrame으로 반환합니다.
df = stock.get_shorting_investor_volume_by_date("20190401", "20190405", "KOSPI")
print(df.head())
기관 개인 외국인 기타 합계
20190401 3402249 133996 5702788 200 9239233
20190402 2883434 139801 5580395 0 8603630
20190403 3589910 127075 6375248 0 10092233
20190404 3200221 119193 5604505 1405 8925324
20190405 3163018 134396 6882981 1754 10182149
market 옵션을 사용하면 코스닥의 공매도 거래량을 조회할 수 있습니다. 사용하지 않을 경우 코스피가 선택됩니다.
df = stock.get_shorting_investor_volume_by_date("20190401", "20190405", "코스닥")
print(df.head())
기관 개인 외국인 기타 합계
20190401 913528 398779 5283672 0 6595979
20190402 841544 267618 7295980 249 8405391
20190403 874047 208539 6526794 0 7609380
20190404 1136765 192503 6566776 0 7896044
20190405 1051807 232488 6618597 0 7902892
get_shorting_investor_price_by_date() 함수는 시작일/종료일 두 개의 파라미터를 입력받아 해당 기간동안 코스피 종목의 투자자별 공매도 거래대금을 DataFrame으로 반환합니다.
df = stock.get_shorting_investor_price_by_date("20190401", "20190405", "KOSPI")
print(df.head())
기관 개인 외국인 기타 합계
20190401 105536073368 2936388505 168285844893 30302100 276788608866
20190402 96384728941 2951117600 160734480125 0 260070326666
20190403 112539971387 2169492030 180355524574 0 295064987991
20190404 92635400253 2294543280 175873863029 10918080 270814724642
20190405 90581343837 1221266912 150558110496 2218810 242362940055
코스닥의 공매도 거래량 또한 조회할 수 있습니다.
df = stock.get_shorting_investor_volume_by_date("20190401", "20190405", "KOSDAQ")
print(df.head())
기관 개인 외국인 기타 합계
20190401 20345961749 2766677625 69741628204 0 92854267578
20190402 18131296688 1614215195 65974380594 7009350 85726901827
20190403 12288386154 2796139160 83568208742 0 98652734056
20190404 23535031919 2293798208 70410033688 0 96238863815
20190405 26473311289 2117625828 70100665837 0 98691602954
get_shorting_trade_top50() 메서드는 조회일자를 입력받아 해당일 코스피 종목의 거래 비중 TOP 50을 DataFrame으로 반환합니다.
df = stock.get_shorting_volume_top50("20190401", "KOSPI")
print(df.head())
순위 공매도거래대금 총거래대금 공매도비중 직전40일거래대금평균 공매도거래대금증가율 직전40일공매도평균비중 공매도비중증가율 주가수익률
DGB금융지주 1 5041915380 7429640690 67.862000 855497798 5.894 16.900000 4.015 2.081
BGF리테일 2 1594605500 3610016500 44.172001 866076025 1.841 19.277000 2.291 -3.432
쌍용차 3 301318290 787566640 38.258999 55733550 5.406 7.131000 5.366 -1.373
GS리테일 4 2121989300 5601127100 37.884998 895386019 2.370 16.672001 2.272 -1.277
한라홀딩스 5 104073700 335436950 31.025999 64204705 1.621 8.073000 3.843 1.597
코스닥의 공매도 거래량 또한 조회할 수 있습니다.
df = stock.get_shorting_volume_top50("20190401", "KOSDAQ")
print(df.head())
순위 공매도거래대금 총거래대금 공매도비중 직전40일거래대금평균 공매도거래대금증가율 직전40일공매도평균비중 공매도비중증가율 주가수익률
유니슨 1 161114740 644179185 25.011000 38085924 4.230 4.941 5.062 2.308
포스코케미칼 2 6556483500 27119922000 24.176001 4113259825 1.594 12.031 2.009 -0.332
와이지엔터테인먼트 3 3434609200 14793204050 23.216999 2342244426 1.466 11.391 2.038 -1.724
에이치엘비 4 4924909000 23529248200 20.931000 3037153098 1.622 7.379 2.836 0.125
셀트리온제약 5 837431500 4120898000 20.322001 728907003 1.149 10.656 1.907 0.903
get_shorting_balance_by_ticker() 메서드는 시작일/종료일 두 개의 파라미터를 입력받아 해당 기간동안 공매도 잔고 정보를 DataFrame으로 반환합니다.
df = stock.get_shorting_balance_by_ticker("20190401", "20190405", "005930")
print(df.head())
공매도잔고 상장주식수 공매도금액 시가총액 비중
날짜
20190401 3403293 5969782550 153318349650 268938703877500 0.06
20190402 3435390 5969782550 157169092500 273117551662500 0.06
20190403 3380137 5969782550 157514384200 278191866830000 0.06
조회 속도는 조회 기간에 비례해서 증가합니다. (내부적으로 500개씩 데이터를 조회하며, 각각의 조회 후 0.3초 delay 됩니다.)
get_shorting_balance_top50() 메서드는 조회 일자를 입력받아 해당 일의 공매도 잔고 TOp 50을 DataFrame으로 반환합니다.
df = stock.get_shorting_balance_top50("20190401", "KOSPI")
print(df.head())
종목명 순위 잔고수량 주식수 잔고금액 시가총액 비중
009150 삼성전기 1 10375082 74693696 1115321315000 8029572320000 13.89
068270 셀트리온 2 12351103 125461438 2247900746000 22833981716000 9.84
042670 두산인프라코어 3 19227597 208161279 140553734070 1521658949490 9.24
008770 호텔신라 4 3276701 39248121 313580285700 3756045179700 8.35
204320 만도 5 2741999 46957120 80477670650 1378191472000 5.84
코스닥 또한 거래량을 조회할 수 있습니다.
df = get_shorting_balance_top50("20190401", "KOSDAQ")
종목명 순위 잔고수량 주식수 잔고금액 시가총액 비중
티커
215600 신라젠 1 10682769 70363125 691175154300 4552494187500 15.18
028300 에이치엘비 2 3583715 39235182 287055571500 3142738078200 9.13
086520 에코프로 3 1537840 22090191 42675060000 613002800250 6.96
263750 펄어비스 4 868937 13015720 145286266400 2176228384000 6.68
200230 텔콘RF제약 5 5239941 82736256 39771152190 627968183040 6.33
get_etf_ticker_list() 함수는 ETF에서 사용할 수 있는 티커를 리스트로 반환합니다.
tickers = e3.get_etf_ticker_list()
print(tickers[:10])
['ARIRANG 200',
'ARIRANG 200동일가중',
'ARIRANG 200로우볼',
'ARIRANG 200모멘텀',
'ARIRANG 200밸류',
'ARIRANG 200선물레버리지',
'ARIRANG 200선물인버스2X',
'ARIRANG 200퀄리티',
'ARIRANG ESG우수기업',
'ARIRANG KRX300']
get_etf_ohlcv_by_date() 함수는 ETF의 OHLCV를 일자별로 출력합니다. 다음은 "ARIRANG 200동일가중"의 OHLCV를 출력합니다.
df = e3.get_etf_ohlcv_by_date("20190401", "20190405", "ARIRANG 200동일가중")
print(df.head())
NAV 시가 고가 저가 종가 거래량 거래대금 기초지수
20190401 9171.40 9080 9175 9080 9170 27 0 2029.91
20190402 9147.04 9150 9150 9095 9140 331 3000000 2024.53
20190403 9239.89 9115 9235 9110 9235 401 3000000 2045.12
20190404 9254.05 9250 9275 9220 9250 325 3000000 2048.28
20190405 9270.59 9235 9260 9225 9235 60 0 2051.92
get_etf_ohlcv_by_date() 함수에 frequency 파라미터(d/m/y)를 추가할 수 있습니다. d는 일자, m은 월, y는 연도를 의미합니다. 다음은 20190301부터 20190405까지의 "ARIRANG 200동일가중"의 월별 OHLCV를 출력합니다.
df = e3.get_etf_ohlcv_by_date("20190301", "20190405", "ARIRANG 200동일가중", 'm')
print(df.head())
시가 고가 저가 종가 거래량
201903 9325 9400 8950 9055 125412
201904 9080 9275 9080 9235 1144
get_etf_ticker_list()로 얻어온 티커를 사용해서 반복적으로 OHLCV를 조회할 수 있습니다.
import time
tickers = e3.get_etf_ticker_list()
for ticker in tickers[:10]:
df = e3.get_etf_ohlcv_by_date("20190301", "20190405", ticker)
print(df.head(2))
time.sleep(1)
get_etf_portfolio_deposit_file() 함수는 ETF를 구성하는 종목/비중 정보를 얻어옵니다.
df = e3.get_etf_portfolio_deposit_file("20190329", "ARIRANG 200동일가중")
print(df.head())
평가 금액이 종목당 약 26만-28정도로 비중 조절된 것을 확인할 수 있습니다.
계약수 금액 비중
LG생활건강 2 2794000 0.60
호텔신라 28 2738400 0.59
SK하이닉스 34 2686000 0.58
넥센타이어 244 2659600 0.57
NH투자증권 180 2619000 0.57
df = bond.get_treasury_yields_in_kerb_market("20190208")
수익률 등락폭
장외 일자별 채권수익률
국고채 1년 1.743 -0.008
국고채 3년 1.786 -0.015
국고채 5년 1.853 -0.023
국고채 10년 1.965 -0.030
국고채 20년 2.039 -0.022
국고채 30년 2.034 -0.021
국민주택 1종 5년 1.935 -0.023
회사채 AA-(무보증 3년) 2.234 -0.015
회사채 BBB-(무보증 3년) 8.318 -0.014
CD(91일) 1.860 0.000