-
주가 데이터 자동으로 가져오기 (gspread 이용)재테크 2021. 6. 22. 01:22
이 블로그는 스크립팅 기술을 이용하여 개미들 입장에서 주식 투자에 임하는 다양한 상황에서 격언처럼 내려오는 말들이나 각종 매매 방법을 간단한 코딩을 통하여 분석하고 인사이트를 공유하기 위해 만들어졌다. 하지만 지금까지는 주가 데이터를 자동으로 가져올만한 방법이 없어서 콘텐츠 제작에 많은 제한이 걸렸었다. 우리는 쉽게 실시간 주가 데이터를 네이버 금융이나 yahoo finance 사이트를 통하여 열람 할 수 있지만 이걸 정리해서 기록하는 일은 매우 어렵고 공식적으로 좋은 퀄리티의 데이터는 유료로 밖에 얻을 수 없는 걸로 안다. IP 차단을 열심히 피해 가면서 네이버 금융 사이트를 크롤링하는 방법도 있긴 하겠지만 이는 블로그에 공개적으로 올릴만한 당당한 방법은 아니다.
저번 삼성전자 관련 컨텐츠에서 데이터를 수동으로 가져오는 방법으로 google sheet를 사용했었다. 그러다가 문득 자동으로 google sheet에 내용을 채워 넣은 다음에 가져올 수 있는 python client가 있으면 이를 쉽게 할 수 있지 않을까? 싶어서 검색을 해보니 역시 대단한 사람들이 google sheet api를 활용하기 위한 python package인 gspread를 만들어두었다. gspread는 google api를 등록하여 인증만 하면 sheet에 접근하여 셀을 업데이트하거나 값을 받아오는 기능을 제공한다. gspread는 구글 인증을 받아야 쓸 수 있기 때문에 사용하기 전까지 조금 복잡한 과정이 필요하다.
이번 포스팅에서는 특정 티커에 yyyy년 mm월 dd일의 가격과 이 날 기준으로 30일 이후의 가격을 받아서 출력하는 간단한 예제를 공유하겠다.
import gspread import datetime def print_price_after_month(sh: gspread.Worksheet, tick: str, year: int, month: int, day: int, offset_days: int): # sheet 초기화 sh.clear() # 시작일과 끝일 계산 start_date = datetime.datetime(year, month, day) end_date = start_date + datetime.timedelta(days=offset_days) # googlefinance 함수를 이용하여 값을 채워 넣음 query = ( f'=googlefinance("KRX:{tick}", "price", "{year}. {month}. {day}", ' f'"{end_date.year}. {end_date.month}. {end_date.day}", "DAILY")' ) sh.update_cell(1, 1, query) values = sh.get_all_values() start_price = values[1][1] end_price = values[-1][1] print(f'티커: {tick}, 가격: {start_price}, 30일 후 가격: {end_price}') if __name__ == '__main__': # google console의 API 등록을 통하여 키 파일을 다운받아야 함 gc = gspread.service_account(filename='./service_account.json') sh = gc.open('gspread-test').sheet1 # LG 유플러스의 2021년의 4월 19일 종가와 30일 후의 종가 print_price_after_month(sh, '032640', 2021, 4, 19, 30) # 티커: 032640, 가격: 13300, 30일 후 가격: 15000
'재테크' 카테고리의 다른 글
MSCI 편입/편출 종목 매매는 효과적일까? (0) 2021.08.14 하나금융투자 Weekly Talk의 추천주 믿어도 될까? (0) 2021.06.27 삼성전자 주식 조금이라도 싸게 모을 수 있을까? (2) - RSI 보조지표의 활용 (0) 2021.03.01 삼성전자 주식 조금이라도 싸게 모을 수 있을까? (0) 2021.01.31 영구포트폴리오 직장인에게 최적화하기 (3) (0) 2021.01.24