-
PER PBR 활용02 : 주식목록 입수(공공데이터API)금융퀀트/(퀀트)PERPBR활용 2023. 5. 31. 08:10반응형
PER과 PBR의 산출대상
PER과 PBR의 사용 방법: 산업별 비교에서도 언급했듯이 개별기업의 단순 PER과 PBR 데이터는 큰 의미가 없다. 기업 간 PER, PBR 비교가 중요하기 때문에 전체 기업목록에 대한 PER, PBR을 구해서 정리하는 것이 필요하다. 우리는 이미 04 투자전략: PER PBR 활용하기01(PER, PBR 찾기:python)에서 네이버 증권(https://finance.naver.com/)을 통해 개별기업의 PER과 PBR에 그림 1처럼 주식코드를 통해서 접근할 수 있다는 것을 파악했다.
따라서 주식코드별로 위 그림 1처럼 조립한 네이버 증권의 URL을 통해서 각 기업의 PER, PBR 데이터를 뽑아내서 정리할 수 있다.주식코드목록 찾기: 공공데이터 포털(https://www.data.go.kr)
주식코드별로 그림 1과 같은 URL을 만들려면 먼저 KOSPI, KOSDAQ, KONEX의 주식목록을 알아야 한다. 주식목록과 종가는 공공데이터 포털(https://www.data.go.kr)에서 API로 제공해 주고 있다. 공공데이터포털 회원가입 후 로그인 한 뒤 아래 그림 2와 같이 검색하여 활용신청 절차를 거치면 공공데이터 포털 API 중 "주식시세정보"를 활용할 수 있는 상태가 된다.( 자세한 것은 (OpenAPI)DATA.GO.KR(공공데이터포털): 인증키 발급을 참조하면 된다.)
이후 마이페이지 화면 -> 좌측 데이터 활용 -> OpenAPI -> 활용신청 현황을 조회하면 아래 그림 3처럼 내가 신청한 API 목록이 나오고 목록을 클릭하면 개발계정 상세 보기 화면을 볼 수 있다.
아래 그림 4처럼 해당화면에서 요청 URL 은 어떻게 되는지 요청시 parameter로는 뭘 넣을 수 있는지 등을 볼 수 있다. 그리고 직접 코딩을 짜보지 않아도 웹에서 API 요청도 간단하게 해 볼 수도 있다.
주식코드 목록 GET 함수 생성
API입수 데이터 구조파악
먼저 아래와 같이 첫번째 페이지("pageNo")에 기준일자가("basDt") 2023-05-24 인 데이터를 아래와 같이 요청해 보자.
import requests from bs4 import BeautifulSoup opendatakey = "나의 API키" url = "https://apis.data.go.kr/1160100/service/GetStockSecuritiesInfoService/getStockPriceInfo" params = { "serviceKey":opendatakey, "pageNo": "1", "basDt": "20230524" } headers = { "accept": "application/xml" } res = requests.get(url, params=params, headers=headers) soup = BeautifulSoup(res.text, "lxml") print(soup)
그러면 아래 xml 데이터 예시와 같은 데이터가 나온다. 중요한 부분은 기본적으로 10 row 씩 데이터가 제공되고(<numofrows>10</numofrows>), 기준일자가 2023-05-24 인 데이터의 row의 개수는 2717개라는 것이다.(<totalcount>2717 </totalcount>) 한 row는 item이라는 tag로 감싸져 있다는 것도 중요한 부분이다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><html><body><response> <header> <resultcode>00</resultcode> <resultmsg>NORMAL SERVICE.</resultmsg> </header> <numofrows>10</numofrows> <pageno>1</pageno> <totalcount>2717</totalcount> <items> <item> <basdt>20230524</basdt> <srtncd>003080</srtncd> <isincd>KR7003080009</isincd> <itmsnm>성보화학</itmsnm> <mrktctg>KOSPI</mrktctg> <clpr>3495</clpr> <vs>40</vs> <fltrt>1.16</fltrt> <mkp>3450</mkp> <hipr>3510</hipr> <lopr>3405</lopr> <trqu>46131</trqu> <trprc>160179450</trprc> <lstgstcnt>20020000</lstgstcnt> <mrkttotamt>69969900000</mrkttotamt> </item> ...중략... </response> </body></html>
주식코드 목록 GET 함수 생성
한 페이지에 10줄이 나오고 2023-05-24 일 기준 모든 데이터는 2717 줄이므로 2023-05-24 일 기준으로 모든 데이터를 보는 방법은 두 가지가 된다. 요청 페이지 수, 기준일자, 출력 ROW 개수 를 변수로 받는 함수를 만들어서 페이지 번호에 1을 넣고, 출력 ROW 수를 2717로 하든지 페이지 번호를 272를 넣고, 출력 ROW 수를 10으로 하든지 하면 된다는 뜻이다. 아래는 getStockList 함수 예시이다.
import pandas as pd import requests from bs4 import BeautifulSoup opendatakey = "나의 API 키" # getStockList 함수 생성 def getStockList(pageno, basedt,noofrows, apikey): # 빈 데이터 리스트 생성 df_list = [] # 함수에서 변수로 받은 pageno를 page 에 입력(range(1,3) 이면 작업이 1~2 까지 실행 됨 주의) for page in range(1,pageno+1): # API 요청 기본 URL url = "https://apis.data.go.kr/1160100/service/GetStockSecuritiesInfoService/getStockPriceInfo" # API 요청 Parameter 활용신청 상세기능정보의 요청변수들(함수에서 변수로 받은 값) params = { "serviceKey":apikey, "pageNo": page, "basDt": basedt, "numOfRows" : noofrows } # 해당 데이터는 xml 형식으로 제공되어 xml 형식으로 요청함을 header 에 붙임 headers = { "accept": "application/xml" } # request 라이브러리로 get 요청을 api 에 보냄 res = requests.get(url, params=params, headers=headers) # response 받은 결과를 soup 에 lxml 형식으로 저장 soup = BeautifulSoup(res.text, "lxml") # soup 객체에 item 별로 내용(text)를 변수에 저장하고 df_if list 에 저장 for stock in soup.find_all("item"): stockcode = stock.find("srtncd").text #종목코드 stockname = stock.find("itmsnm").text #종목명 mrkctg = stock.find("mrktctg").text #시장구분 lstgstcnt = stock.find("lstgstcnt").text #상장주식수 mrkttotamt = stock.find("mrkttotamt").text #시가총액 df_if = [stockcode, stockname, mrkctg, lstgstcnt, mrkttotamt] # 최초에 만든 df_list 라는 list 에 df_if list를 추가 df_list.append(df_if) # 입수된 데이터를 종합하여 DataFrame 형태로 변환 및 컬럼 값 부여 df_list = pd.DataFrame(df_list, columns = ["주식코드", "주식명", "시장구분", "상장주식수", "시가총액"]) return df_list if __name__ == "__main__": # 예시로 요청 페이지 수는 2 일자는 2023-05-24, 출력 row 수는 30 으로 함수 실행 df = getStockList(2,"20230524","30", opendatakey) print(df)
반응형'금융퀀트 > (퀀트)PERPBR활용' 카테고리의 다른 글
PER PBR 활용06 : 기업별 산업코드 PER PBR 데이터 생성 프로그램 CLASS 구성 (0) 2023.06.10 PER PBR 활용05 : DART기업고유번호매핑 및 산업코드 매핑 (2) 2023.06.03 PER PBR 활용04 : 주식 종목 산업분류 데이터 받아오기(DART API) (0) 2023.06.02 PER PBR 활용03 : 주식별 PER PBR 목록 만들기 (0) 2023.06.01 PER PBR 활용01 : PER PBR 데이터 입수(파이썬) (0) 2023.05.30