이번 멋쟁이사자처럼 중앙해커톤에서 진행한 프로젝트는
시각장애인들을 위한 모의투자 서비스이다.
따라서, 모의투자를 위한 국내/해외 주식 데이터가 필요했고, 한국투자증권에서 관련 api들을 제공한다는 것을 알게 되어 사용하였다.
API신청하기
한국투자증권 홈페이지에서 API신청을 하면,
이런 식으로, APP Key와 APP Secret 키가 발급된다.
처음엔 모의투자계좌만 개설했으나, 실전투자계좌를 보유해야만 제공해 주는 api들이 생각보다 많아서 실전투자계좌도 개설했다.
발급한 key들을 아래처럼처럼 각각 변수에 담아준다.
Git에 올릴코드기 때문에, 난 koreainvestment.key라는 파일을 만들어서 key들을 적어주고,
gitignore에 추가해 둠으로써 key들을 숨겨주었다.
##한국투자증권 key
f = open("./koreainvestment.key")
lines = f.readlines()
key = lines[0].strip()
secret = lines[1].strip()
acc_no = lines[2].strip()
f.close()
그리고 API호출에 사용될 주소도 담아준다. (나는 실전투자 계좌주소를 넣었지만, 모의계좌만 보유 중이라면 다른 주소를 넣어야 함)
URL_BASE = "https://openapi.koreainvestment.com:9443" #실전투자서비스
REST API는
- header : 권한/인증
- path : 위치
- query string : (GET 방식)
- body : request 요청 (POST 방식)
로 구성되어 있다.
보안인증키 발급
POST방식으로 보안인증키를 발급받을 것이기 때문에, header와 data를 dictionary형태로 만든다.
headers = {"content-type":"application/json"}
body = {"grant_type":"client_credentials",
"appkey":key,
"appsecret":secret}
PATH = "oauth2/tokenP" # 호출할 API의 위치 (토큰발급)
URL = f"{URL_BASE}/{PATH}"
print(URL)
>>> https://openapi.koreainvestment.com:9443/oauth2/token
위와 같이, 호출할 API(토큰발급)에 해당하는 주소와 URL_BASE를 합쳐 URL에 담아준다.
그리고, POST요청을 보내면 보안인증키(access_token)을 받을 수 있다.
res = requests.post(URL, headers=headers, data=json.dumps(body))
res.text
>>> '{"access_token":"ACCESS_TOKEN","token_type":"Bearer","expires_in":86400}'
ACCESS_TOKEN = res.json()["access_token"]
그리고, 토큰을 ACCESS_TOCKEN 변수에 저장했다.
주식 데이터 가져오기
간단한 주식현재가 시세를 가져와보자.
한국투자증권 API문서에 따르면, 국내주식현재가 시세 API의 주소는 "uapi/domestic-stock/v1/quotations/inquire-price"
이기 때문에, 다음과 같이 주소를 명시해준다.
PATH = "uapi/domestic-stock/v1/quotations/inquire-price"
URL = f"{URL_BASE}/{PATH}"
URL_BASE는 위에서 작성해 둔 실전투자계좌의 주소이다.
그리고, header에 tr_id를 입력한다.
각 API 별로, 다른 tr_id를 갖고 있기 때문에 유의해야 한다.
국내주식현재가 시세를 보는 API는 "FHKST01010100"라는 tr_id를 갖고 있기에, 다음과 같이 header에 작성해 준다.
headers = {"Content-Type":"application/json",
"authorization": f"Bearer {ACCESS_TOKEN}",
"appKey":key,
"appSecret":secret,
"tr_id":"FHKST01010100"}
그리고, 한국투자증권의 API문서를 보면, 다음과 같이 요구되는 파라미터가 존재한다.
따라서, 조건에 맞춰 params를 작성해 준다.
params = {
"fid_cond_mrkt_div_code":"J",
"fid_input_iscd":"005930"
}
"005930"은 삼성전자의 종목 코드이다.
이제 호출을 해보면,
res = requests.get(URL, headers=headers, params=params)
res.json()
이런 식으로, json형태의 응답이 나온다. (길어서 스샷으로 대체)
res.json()['output']['stck_prpr']
이런식으로, 현재가('stck_prpr'이라는 key를 가짐)만 호출할 수 있다.
mojito 모듈을 이용한 방식
구글링 도중, 위의 과정들을 간단하게 처리해 줄 수 있는 mojito라는 모듈을 만들어 뒀다는 걸 알게 되었다.
pip install mojito2
import mojito
key = "발급받은 API KEY"
secret = "발급받은 API SECRET"
acc_no = "모의/실전 계좌번호"
broker = mojito.KoreaInvestment(
api_key=key,
api_secret=secret,
acc_no=acc_no
)
이렇게 mojito모듈을 이용해,
broker변수가 KoreaInvestment라는 클래스의 객체를 바인딩하는 형태로 API들을 이용할 수 있다.
모듈을 이용하면 편리한 점이, 아까 위에서 적은 토큰을 발급/재발급하는 과정을 생략해도 된다.
KoreaInvestment 클래스의 객체를 생성하면 생성자에서 토큰을 자동으로 발급하고, token.dat이라는 이름의 파일로 저장해 주기 때문이다. (진작 이렇게 할걸..)
모듈을 이용한 API 이용
KoreaInvestment 클래스를 뜯어보면,
이렇게, 다양한 데이터를 가져올 수 있는 API들을 함수로 만들어 놓은 것을 확인할 수 있다.
따라서, 위의 함수를 이용하여 국내주식현재가를 가져오고 싶으면,
import mojito
import pprint
broker = mojito.KoreaInvestment(
api_key=key,
api_secret=secret,
acc_no=acc_no
)
resp = broker.fetch_price("005930")
그냥 이렇게만 해주면, resp에 정보들이 담긴다..
❗️하지만 모듈 안의 함수들은 모든 API들을 제공하는 건 아니고, 실전투자계좌를 소유했을 때만 제공해 주는 API들의 함수는 만들어 놓지 않은 것으로 보여 모든 경우에 사용할 수는 없다.
ex) 아래와 같은 모의투자 미지원 API들
(2편에서 계속)
'API' 카테고리의 다른 글
[API] 음성>텍스트변환 (NaverCloud CLOVA) (2) | 2023.08.22 |
---|---|
[API] 한국투자증권 api 가져오기(2) (0) | 2023.08.21 |