파이썬을 이용하여 삼성전자 일별 종가를 긁어오자

금융데이터 분석을 위한 첫번째 과정

금융데이터를 분석하기 위해서는 당연하게 금융데이터가 필요하다. 하지만 네이버나 다음 금융에서 데이터를 긁어오는 행위는 법적으로 문제가 생길 수도 있고, 이제 긁어오지 못하게 막아놓는 경우도 빈번하다. 그래서 개인적으로 분석할때는 http://marketdata.krx.co.kr 여기가 가장 깔끔하고 가장 RAW데이터를 받을수 있어 분석하기 딱이다. 앞으로 포스팅 하는 데이터는 모두 여기에서 불러온 데이터로 사용 할 것이다.

삼성전자의 일별 종가를 긁어와보자

제일먼저 http://marketdata.krx.co.kr 여기의 사이트를 들어가서 시장정보->종목정보->일자별 시세에 들어가보자 그럼 아래와 같은 화면이 뜰것이다.

그리고 이창에서 F12(크롬기준)를 눌러 network를 클릭! 그리고나서 위 사진의 CSV 버튼을 누르면 아래와 같이 뜰것이다.

여기에서 GenerateOTP를 눌러 쭉 아래로 내리면 Query String Parameter라고 뜨는데 여기서부터 설명 들어가겠다.

내가 분석한 바로는 KRX에서 데이터를 GET방식으로 요청하면 자동으로 긁어가는걸 방지하기 위해 임시키인 OTP를 만들어 그걸 다시 서버로 전송해서 데이터를 받는다.

이 OTP를 생성할때 사이트에서 Request하는 데이터를 Python코드로 보내준다면 OTP를 발급받아 데이터를 받을 수 있는것이다! GET방식으로 보내는 데이터를 보면 아래와 같다.

경험상 데이터를 받을때 필요한 데이터는 Request Header중에서 Referer, Query String Parameter중에서 name, filetype, url, isu_cd, fromdate, todate 이다.

이때 isu_cd는 종목 코드가 아닌 ISIN코드이다.

이를 코드로 구현하면 아래와 같다.

import requests
from io import BytesIO

gen_otp_url = "http://marketdata.krx.co.kr/contents/COM/GenerateOTP.jspx"+"?url=MKD/04/0402/04020100/mkd04020100t3_02"
#쿼리 URL세팅
gen_otp_data = {
    'name':'fileDown',
    'filetype':'csv',
    'isu_cd': 'KR7005930003',
    'fromdate': '20000101',
    'todate': '20190208',
} #헤더 세팅

temp = requests.get(gen_otp_url, params=gen_otp_data)
    
otp_code = temp.text # otp_code의 값을 get방식으로 받아 온다

이제 생성된 OTP값을 이용하여 데이터를 받아와보자 아까 csv버튼을 눌렀을떄 GenerateOTP말고 downloaf.jspx를 눌러보면 아래와 같이 정보가 나타날것이다.

이때는 POST방식으로 OTP키를 보내면 데이터를 받을수있다. 코드는 아래와 같다

import pandas as pd
down_url = 'http://file.krx.co.kr/download.jspx'
down_data = {
    'code': otp_code,
}

temp = requests.post(down_url, data=down_data, headers={
    'Referer': 'Referer: http://marketdata.krx.co.kr/mdi'
})

temp.encoding = "utf-8-sig"
samsung_data = pd.read_csv(BytesIO(r.content), header=0, thousands=',')

이때 header에 Referer를 넣어주는 이유는 krx서버에서 referer가 다르면 데이터를 OUT하지 않는다는 정책때문에 넣어준것이다. (다른 사이트에서는 User-agent를 요구하는 경우도 있다. 예) investing.com)

위의 코드를 실행하면 삼성전자의 2000년부터 2019년 8월 20일까지의 가격데이터를 DataFrame으로 얻을수있다.

다음글은 KOSPI, KOSDAQ의 전종목을 긁어오기 위해 종목코드를 ISIN코드로 변환해주는 걸 알아보도록 하겠다.

댓글남기기