반응형
https://marketward.tistory.com/4
[Python/파이썬]네이버증권API 활용 - PER, PBR 기준으로 종목 검색(3/4)
https://marketward.tistory.com/3 [Python/파이썬]네이버증권API 활용 - 네이버증권API + 종목코드로 json 결과 확인(2/3) [Python/파이썬]네이버증권API 활용 - 회사명, 종목코드 받아오기(1/3) marketward.tistory.com 네
marketward.tistory.com
까지 실행시켜보고... 시간이 너무 오래 걸려 '아차' 싶어서 multiprocessing 단계를 추가합니다. (87초나 걸립니다.)
Python에서는 multiprocessing 모듈을 기본 제공합니다. 아래와 같이 multiprocessing의 Pool 메서드를 import 합니다.
from multiprocessing import Pool
이전 스크립트에서 stock_list를 for으로 순차처리 했던 부분을 함수로 변경 합니다.
#multiprocessing을 위해 함수로 작성합니다.
def func(stock_set):
#회사명을 가져옵니다.
item_name = stock_set[0]
#종목코드를 가져옵니다.
item_code = stock_set[1]
#네이버증권API인 요약 정보 기능을 사용 합니다.
url = "https://api.finance.naver.com/service/itemSummary.nhn?itemcode=%s"%(item_code)
#urllib.request를 통해 링크의 결과를 가져옵니다.
raw_data = urllib.request.urlopen(url).read()
#추후, 데이터 가공을 위해 json 형식으로 변경 합니다.
json_data = json.loads(raw_data)
#PER과 PBR을 변수로 지정합니다.
per_value = json_data['per']
pbr_value = json_data['pbr']
#우선, PER 값이 있는 종목을 골라 냅니다.
if per_value :
#PER이 0보다 크고 2보다 작은 종목이면서 PBR이 0.7보다 작은 종목을 찾습니다.
if 0 < per_value < 2 and 0.7 > pbr_value :
print("[%s]의 per은 %s 입니다. (pbr %s)" %(item_name, per_value, pbr_value))
마지막으로 func 함수의 대상이 되는 stock_list를 입력하여 리스트 안의 값을 병렬로 처리하게 됩니다. Pool(6) 에서 숫자 부분은 사용할 코어의 개수를 지정하게 됩니다.
if __name__ == '__main__':
with Pool(6) as p:
p.map(func, stock_list)
전체코드는 아래와 같습니다.
from multiprocessing import Pool
import pandas as pd
import json
import urllib.request
#한국거래소에서 종목 코드 받아옵니다. [0]은 헤더를 첫번째 행으로 지정하기 위해 사용 했습니다.
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13')[0]
#종목코드가 6자리이기 때문에 6자리를 맞춰주기 위해 설정해줍니다.
code_df.종목코드 = code_df.종목코드.map('{:06d}'.format)
#우리에게 필요한 회사명과 종목코드만 남깁니다.
code_df = code_df[['회사명', '종목코드']]
#리스트 형식으로 변경하면 네이버증권API 사용을 위한 준비가 끝납니다.
stock_list = code_df.values.tolist()
#multiprocessing을 위해 함수로 작성합니다.
def func(stock_set):
#회사명을 가져옵니다.
item_name = stock_set[0]
#종목코드를 가져옵니다.
item_code = stock_set[1]
#네이버증권API인 요약 정보 기능을 사용 합니다.
url = "https://api.finance.naver.com/service/itemSummary.nhn?itemcode=%s"%(item_code)
#urllib.request를 통해 링크의 결과를 가져옵니다.
raw_data = urllib.request.urlopen(url).read()
#추후, 데이터 가공을 위해 json 형식으로 변경 합니다.
json_data = json.loads(raw_data)
#PER과 PBR을 변수로 지정합니다.
per_value = json_data['per']
pbr_value = json_data['pbr']
#우선, PER 값이 있는 종목을 골라 냅니다.
if per_value :
#PER이 0보다 크고 2보다 작은 종목이면서 PBR이 0.7보다 작은 종목을 찾습니다.
if 0 < per_value < 2 and 0.7 > pbr_value :
print("[%s]의 per은 %s 입니다. (pbr %s)" %(item_name, per_value, pbr_value))
#func 함수를 stock_list 범위로 병렬 처리 합니다.
if __name__ == '__main__':
with Pool(6) as p:
p.map(func, stock_list)
만족스러운 결과가 나왔습니다.
반응형
'Python > 네이버증권API(Old)' 카테고리의 다른 글
[Python/파이썬] 네이버증권API 활용 - ETF ETN의 "종목코드, 종목명"가져오기 (0) | 2022.11.19 |
---|---|
[Python/파이썬] 네이버증권API 활용 - PER, PBR 기준으로 종목 검색(3/4) (0) | 2022.11.14 |
[Python/파이썬] 네이버증권API 활용 - 종목코드로 json 결과 확인(2/4) (0) | 2022.11.13 |
[Python/파이썬] 네이버증권API 활용 - 회사명, 종목코드 받아오기(1/4) (0) | 2022.11.12 |