[한투증권 openapi] 3. 해외 주식 일별 가격 가져오기

한투증권의 openapi 를 사용해서 미국주식의 일별 가격을 가져올 수 있습니다. 

한투증권 KIS Developers 해외주식 기간별 시세 조회하기

참고 url :  https://apiportal.koreainvestment.com/apiservice/apiservice-domestic-stock-current#L_0e9fb2ba-bbac-4735-925a-a35e08c9a790

 

KIS Developers

REST 해외주식조건검색[v1_해외주식-015] 해외주식 조건검색 API입니다. 현재 조건검색 결과값은 최대 100개까지 조회 가능합니다. 다음 조회(100개 이후의 값) 기능에 대해서는 개선검토 중에 있습니

apiportal.koreainvestment.com

 

하지만 한투증권은 미국 종목의 symbol 까지는 제공하지 않습니다.

아래 알려드릴 소스코드는 미국 종목의 symbol를 가져와서 뉴욕장, 나스닥, 아멕스 의 주식들의 일별 가격을 가져오는 소스코드입니다.

import FinanceDataReader as fdr
import json
from datetime import date
import requests
import json
import sys
import time

targetDomain = "openapi.koreainvestment.com"
targetPort = 9443
getOverseaUrl= "/uapi/overseas-price/v1/quotations/dailyprice"

appkey = "본인의 한투증권 appkey"
appsecret = "본인의 한투증권 appsecret"
token = "본인이 발급받은 token"

'''
NYS : 뉴욕
NAS : 나스닥
AMS : 아멕스
'''


# excdFinance : symbol를 가져오기 위한 미국증권시장 코드
# excdHantoo : 한투증권의 미국증권시장 코드
# headers : 한투증권 api call를 위한 header 값
# query : 한투증권 api call를 위한 url query
# totalUrl : query를 제외한 전체 url
# yyyy_mm_dd : 조회하는 날짜. yyyy-mm-dd 형태
def printData(excdFinance, excdHantoo, headers, query, totalUrl, yyyy_mm_dd):
    df_nyse = fdr.StockListing(excdFinance)
    df_nyse_symbol_list = df_nyse.Symbol.tolist()	# FinanceDataReader 에서 미국주식의 symbol를 가져옵니다.
    df_nyse_name_list = df_nyse.Name.tolist()		# FinanceDataReader 에서 미국주식의 name를 가져옵니다.
    cnt = 0
    for df_nyse_symbol in df_nyse_symbol_list:
        print('symbol = %s'%df_nyse_symbol)
        if df_nyse_symbol.find(' ') > 0:			# symbol 중 ' ' 있는 것은 정보수집에서 제외
            continue
        if df_nyse_symbol.find(".") > 0:			# symbol 중 . 이 있는 것은 정보수집에서 제외
            continue
        query["EXCD"] = excdHantoo
        query["SYMB"] = df_nyse_symbol
        symbol = df_nyse_symbol.replace(" ","")		# 조회 오류를 없애기 위해 걸러진 symbol에서 다시 한번 replace 해줍니다.
        res = requests.get(totalUrl, headers=headers, params=query)		# 한투증권의 api call 합니다.
        if res.status_code >= 200 and res.status_code < 300:		# 저는 201 ok 가 떨어졌던것 같습니다.
            resJson = res.json()
            print("len = %d"%(len(resJson["output2"])))		# 한투증권 참고 url를 열어보시면 우리가 원하는 값은 response 중에 output2 안의 값입니다.
            if resJson["output2"][0]["clos"] == 0:		# 데이터가 없으면 넘어갑니다. 혹시 거래정지 종목일지도..
                continue
            for dictData in resJson["output2"]:
                dictData["date"] = yyyy_mm_dd
                dictData["stockcode"] = df_nyse_symbol
                dictData["stockname"] = df_nyse_name_list[cnt]
                print(dictData)
        cnt = cnt + 1
        time.sleep(0.1)

def getOverseaStock():
    today = date.today()
    yyyymmdd = '%04d%02d%02d'%(today.year, today.month , today.day)
    yyyy_mm_dd = '%04d-%02d-%02d'%(today.year, today.month , today.day)
    totalUrl = "https://" + targetDomain + ":" + str(targetPort) + getOverseaUrl
    query = dict()
    headers = {"content-type":"application/json; charset=utf-8"\
            ,"appkey":"%s"%(appkey)\
            ,"appsecret":"%s"%(appsecret)\
            ,"authorization":"Bearer %s"%(token)\
            ,"tr_id":"HHDFS76240000"\
            ,"custtype":"P"\		# 개인일때 P, 법인은 B
            ,"mac_address":"API를 발송하는 본인PC의 mac 주소"\
            }
    print("yyyymmdd=%s"%(yyyymmdd))
    query["AUTH"] = ""
    query["GUBN"] = "0"
    query["BYMD"] = yyyymmdd
    query["MODP"] = "0"

    printData('NYSE', 'NYS', headers, query, totalUrl, yyyy_mm_dd)
    printData('NASDAQ', 'NAS',headers, query, totalUrl, yyyy_mm_dd)
    printData('AMEX', 'AMS', headers, query, totalUrl, yyyy_mm_dd)


getOverseaStock()

 

* 원래 저는 로그도 넣고 elasticsearch에 데이터를 넣는데..

  그 소스중에 로그와 elasticsearch 부분을 제외하고 소스를 올립니다.(실수로 동작이 안하면 댓글로 알려주시면 수정하여 다시 올리겠습니다.)