콘텐츠로 건너뛰기
Home » 한국투자증권 Open API 예제 코드 | Open API로 시스템 트레이딩 만들기

한국투자증권 Open API 예제 코드 | Open API로 시스템 트레이딩 만들기

한국투자증권 Open API를 신청했다면 파이썬으로 시스템 트레이딩을 개발해보자

얼마전에 “한국투자증권 Open API” 를 신청하는 방법에 대해 소개를 해드린 적이 있습니다. 한국투자증권 Open API는 아직까지 국내 유일하게 “REST API” 로 제공이 되는 주식 API 입니다.

한국투자증권 Open API

국내에는 한국투자증권의 Open API 말고도 키움, 이베스트, 대신증권 등에서 Open API를 제공하지만 이들 증권사들의 API는 Windows 환경에서만 API를 사용할 수가 있습니다. 따라서 OS에 제한적이었으나 한국투자증권의 API는 Windows 외에도 리눅스, 맥에서도 API를 호출하여 사용하는게 가능합니다.

이런 장점은 리눅스를 주로 사용하는 제게 있어서는 꽤나 매력적인 API 라고 볼 수 있습니다. 올해 출시가 되어서 아직은 기능적인 측면에서는 다소 아쉬운 점이 있지만 주식 트레이딩의 기본적인 기능을 사용할 수가 있기 때문에 “시스템 트레이딩 머신” 을 개발하는데에는 충분합니다.

위 링크글은 한국투자증권의 Open API를 사용하기 위한 한국투자증권의 계좌개설과 모의투자 신청방법, API 신청 방법을 정리한 글입니다. 한국투자증권의 Open API를 사용하여 “시스템 트레이딩”을 개발하고 싶다면 일단 위의 절차를 통해 계좌 개설 및 Open API를 신청하시길 바랍니다.

파이썬 + 한국투자증권 Open API로 시스템 트레이딩 개발

시스템 트레이딩에 대하여 간략하게 정의하면 사람이 주식 호가창을 일일이 보면서 주식 매매를 하는 것이 아닌 “컴퓨터” 가 자동으로 자신이 짠 알고리즘이나 전략에 따라 자동으로 주식을 매수/매도 등을 처리하는 것을 의미합니다.

보통 사람들이 주식을 매매할 때 수익을 내는 방법은 “싸게 사서 비싸게 파는” 아주 기본적인 원리로 주식을 매매하게 됩니다. 하지만 주식 시장은 평일 오전 9시부터 오후 3시 30분까지 일과 중에 열리게 되며 이 시간에 일반 직장인들이 매매를 하려면 수시로 호가 창을 들여다봐야 하는 불편함이 존재합니다.

그래서 일과중에는 주식 매매를 하기가 꽤 불편하다고 볼 수 있습니다. 직장에 상황에 따라 적절한 매수/매도 시기를 놓칠 수가 있기 때문에 금전적으로 큰 손해를 입거나 기회를 놓칠 수도 있기 때문입니다.

그런데 자동으로 컴퓨터가 내가 짠 전략에 따라 “알아서” 매매를 해주면 어떨까요? 그렇게 되면 일과중에 굳이 주식 호가창을 보지 않고도 매매를 할수 있게 될 것입니다. 바로 이점이 “시스템 트레이딩” 의 장점이라고 볼 수 있습니다.

최근에는 각 증권사에서 이런 수요를 위해 “Open API” 를 제공하고 있으며 Open API를 제어하는 도구로는 “파이썬(Python)” 이라는 언어로 시스템 트레이딩을 개발하고 있습니다. 얼마전까지 저는 “키움증권” 의 Open API와 파이썬 조합으로 시스템 트레이딩 머신을 개발하고 있었습니다.

하지만 키움증권의 Open API는 아쉽게도 OS가 Windows 환경에서만 트레이딩이 가능합니다. 따라서 Windows 기반의 노트북이나 PC에서만 Open API를 호출하여 사용할 수 밖에 없었습니다.

Windows 환경에서 시스템 트레이딩 툴을 개발하는 것은 제 입장에서는 꽤나 불편했습니다. 그 이유는 다음과 같습니다.

  • 집의 PC 에서 개발하여 시스템 트레이딩을 구동하고 싶은데 Windows 의 경우에는 원격 접속이 꽤 불편하다.
  • Open API 를 사용하려면 키움증권의 경우에 Open API 프로그램을 설치해야 하고 “공인인증서” 등의 인증을 거쳐야 API를 호출하여 사용할 수 있다.
  • 주식 시장이 시작하기 전에는 미리 인증 처리가 되어야 하고 주식 시장이 끝나면 인증이 해제된다. 즉 인증 처리가 되지 않으면 주가 정보를 가져오는게 불편하다.
  • 원격으로 접속하는게 약간 불편하기 때문에 직장인이면 회사 PC 에서 개발 환경을 구축해야 하는데, 이 또한 꽤 번거롭고 눈치 보이는 일이다.

Windows 기반의 OCX, COM, DLL 라이브러리로 개발을 해야 하기 때문에 위에서 언급한 단점들이 부각되는거 같습니다. 물론 Windows 에서도 위에서 언급한 단점은 있지만 파이썬을 이용하여 시스템 트레이딩을 하는 것은 큰 문제는 없습니다. 단지 제게는 불편했던 것이었지요.

그런데 올해 출시된 한국투자증권의 Open API는 “REST API” 형식이기 때문에 API를 호출만 해주면 OS에 상관없이 개발이 가능해집니다. 그럼 한국투자증권의 Open API는 어떤 장점이 있을까요?

  • Windows 뿐만 아니라 리눅스, Mac 에서도 시스템 트레이딩 개발이 가능해집니다.
  • 특히 리눅스에서는 SSH 등으로 원격 접속을 하여 개발할 수 있기 때문에 매우 편리합니다.
  • 자기 계좌 인증은 “Key” 를 통해 인증이 가능하기 때문에 Key 값만 넣어주면 주식 조회, 매수, 매도 등의 처리가 얼마든지 가능합니다. 대신에 Key 노출에 유의해야 합니다.
  • 시스템 트레이딩 머신을 집에서 구축해도 되고 요즘 많이들 사용하는 저렴한 비용의 클라우드 서버를 사용하여 구축하는게 가능합니다.

현재 저는 집에서 “리눅스 PC” 에 파이썬 코드를 개발하여 시스템 트레이딩을 개발하는 중입니다. 리눅스 PC 라고 해서 크게 다르지 않습니다. 단지 남아도는 일반 PC 에 리눅스를 설치하여 사용하면 괜찮은 “시스템 트레이딩 머신” 이 됩니다.

PC 구입이 부담스러우면 “라즈베리파이” 같은 저렴한 오픈 하드웨어를 구입하여 시스템 트레이딩 머신을 개발해도 됩니다. 라즈베리파이 같은 경우에는 전기세도 많이 나가지 않고 성능도 시스템 트레이딩을 돌리기에는 괜찮은 수준이라고 볼 수 있습니다.

라즈베리파이
라즈베리파이

아직 한국투자 Open API는 릴리즈 된지 얼마 되지 않고 기능적으로는 기본적인 것만 제공되지만 제 입장에서는 리눅스에서 “시스템 트레이딩”을 개발하는게 꽤나 흥미롭고 장점이 많은걸로 생각됩니다.

저와 같은 생각을 하시는 분들은 한국투자증권 Open API + 리눅스 + 파이썬 조합으로 시스템 트레이딩을 구축하면 될거 같습니다.

한국투자증권 Open API 파이썬 예제 코드

Open API 신청이 완료되고 리눅스 PC가 준비되었다면 이제 시스템 트레이딩을 자신만의 전략으로 개발할 일만 남은거 같습니다.

일단 자신의 리눅스 머신에 “파이썬” 이 설치가 되어 있는지 확인합니다. 저는 “우분투 18.04” 에 파이썬 3.8 버전을 설치하여 사용중입니다. 우분투의 경우에는 파이썬 2와 3 버전이 기본적으로 설치가 되어 있지만 3.8 버전이 설치되어 있는지는 확인해 봐야 합니다.

만약 설치가 되어 있지 않다면 파이썬 3.8 버전을 설치하여 사용하는 것을 추천합니다. 파이썬은 3.8 버전 이상을 사용하는 것을 권장하고 있습니다. 파이썬 설치 관련하여 별도의 설명은 생략하도록 하겠습니다.

한국투자증권 API는 “REST API” 형식으로 되어 있습니다. 따라서 API 를 통해 주식 정보, 매매 등을 하려면 REST API 포맷으로 호출을 해야 합니다. 그런데 친절하게도 파이썬으로 한국투자증권 API 를 손쉽게 사용하기 위해 “모듈”을 개발하여 배포해 놓고 있습니다.

구글에서 검색하면 몇가지 파이썬 모듈들이 있을텐데요. 저는 “조대표” 님의 한국투자증권 API 파이썬 모듈인 “모히토” 모듈을 사용하고 있습니다. 좀더 자세한 내용은 위의 조대표님의 위키독스 문서를 읽어보시면 됩니다.

그럼 한국투자증권의 기본 API 호출 파이썬 예제 코드를 나열해 보겠습니다.

# -*- coding: utf-8 -*-
import mojito
import pprint
import pandas as pd
import sys
from time import sleep
import FinanceDataReader as fdr
import datetime
import os


# 실전계좌
key = "key"
secret = "secret키"
ACC_NO = "계좌번호"



# mojito 모듈 사용하여 KIS API 클래스 실행
broker = mojito.KoreaInvestment(
    api_key = key,
    api_secret = secret,
    acc_no = ACC_NO,
    mock = True #만약 모의투자면 이 항목 True로 설정
)


class trBot:
    def __init__(self):
        print("TRBOT 시작")

        # 총 평가 금액
        self.total_evlu_money = 0
        # 예수금
        self.dnca_total_money = 0

        # 매수 종목 정보
        self.buy_stock_code = ""  # 매수한 종목 코드
        self.buy_stock_name = ""  # 매수한 종목명
        self.buy_stock_q = 0      # 매수한 종목 수량
        self.buy_stock_amt = 0    # 매수한 종목 매입금액
        self.buy_stock_eamt = 0   # 매수한 종목 평가금액

        # 모니터링 종목 정보
        self.mon_stock_value = 0    # 체크하는 종목 가격
        
    def calTime(self):
        # 날짜 계산
        self.current = datetime.datetime.now()
        self.now_year = self.current.strftime("%Y")
        self.now_date = datetime.date.today().isoformat()

    def getAccBalance(self):
        #계좌 잔고 조회
        r = broker.fetch_balance()
        pprint.pprint(r)

        print("===============================================")

        try:
            output1 = r.get('output1')
            self.buy_stock_code = output1[0]['pdno']
            self.buy_stock_name = output1[0]['prdt_name']
            self.buy_stock_q = int(output1[0]['hldg_qty'])
            self.buy_stock_amt = int(output1[0]['pchs_amt'])
            self.buy_stock_eamt = int(output1[0]['evlu_amt'])
            self.buy_stock_erng_rt = float(output1[0]['evlu_erng_rt'])
            self.buy_stock_pchs_avg_pric = float(output1[0]['pchs_avg_pric'])

            print("매수종목코드 : %s" % self.buy_stock_code)
            print("매수종목명 : %s" % self.buy_stock_name)
            print("매수종목수량 : %d" % self.buy_stock_q)
            print("종목매입금액 : %d" % self.buy_stock_amt)
            print("종목평가금액 : %d" % self.buy_stock_eamt)
            print("종목수익률 : %f 퍼센트" % self.buy_stock_erng_rt)
            print("매수평단가: %f" % self.buy_stock_pchs_avg_pric)


        except:
            log.debug("매수한 주식이 없습니다.")

        print("===============================================")

        try:
            output2 = r.get('output2')
            self.total_evlu_money = int(output2[0]['tot_evlu_amt'])
            self.dnca_total_money = int(output2[0]['dnca_tot_amt'])

            print("총평가금액 : %d" % self.total_evlu_money)
            print("예수금 : %d" % self.dnca_total_money)

        except:
            log.debug("잔고 조회 오류")

        print("===============================================")


    def getNowValue(self, code):
        #종목 현재가 정보 조회
        try:
            r = broker.fetch_price(code)
            #pprint.pprint(r)
            v = []

            v.insert(0,r['output']['stck_oprc'])   #시가
            v.insert(1,r['output']['stck_hgpr'])   #고가
            v.insert(2,r['output']['stck_lwpr'])   #저가
            v.insert(3,r['output']['stck_prpr'])   #종가

        #print(v)
        except:
            print("아직 장외 시간입니다.")


        return v


    def buyOrderMarket(self, code, q):
        # 시장가 종목 매수
        try:
            r = broker.create_market_buy_order(
                symbol = code,
                quantity = q
            )
            pprint.pprint(r)

            print("[매수주문] 종목:%s, 수량:%d, 주문정보:%s " % (code, q, r))

            return True
        except:
            log.debug("매수 주문에 실패했습니다.")
            
            return False

    def sellOrderMarket(self, code, q):
        # 시장가 종목 매도
        try:
            r = broker.create_market_sell_order(
                symbol = code,
                quantity = q
            )
            pprint.pprint(r)

            print("[매도주문] 종목:%s, 수량:%d, 주문정보:%s " % (code, q, r))

            return True
        except:
            print("매도 주문에 실패했습니다.")
            return False


    def getOhlcv(self, code):
        # 일봉 데이터 조회
        r = broker.fetch_ohlcv(
            symbol = code,
            timeframe = 'D',
            adj_price = True
        )
        #pprint.pprint(r)

        # 오늘부터 30일선의 일봉 데이터를 df 로 저장
        df = pd.DataFrame(r['output2'])
        dt = pd.to_datetime(df['stck_bsop_date'], format="%Y%m%d")
        df.set_index(dt, inplace=True)
        df = df[['stck_oprc', 'stck_hgpr', 'stck_lwpr', 'stck_clpr']]
        df.columns = ['open', 'high', 'low', 'close']    #시가, 고가, 저가, 종가
        df.index.name = "date"
        
        return df
    

def mainLoop():
    c = trBot()

def main():
    mainLoop()


if __name__ == "__main__":
    main()

trBot 이라는 파이썬 클래스에는 내 계좌의 잔고 조회, 종목 현재가 조회, 일봉 데이터 조회, 시장가 매수, 시장가 매도 등의 함수가 구현되어 있습니다. 각 기능의 함수는 “모히또” 모듈을 호출하여 만들었습니다.

기본 기능이 동작하는지 확인하려면 위의 key, secret, ACC_NO 에 발급받은 key 값과 계좌번호를 입력해 주면 됩니다. 저같은 경우는 위의 함수들로 매수/매도/조회 등의 기능이 잘 동작하는 것을 확인하였습니다. 여기에 본인이 추가적으로 필요한 기능을 붙이고 전략을 구현하면 자신만의 시스템 트레이딩 머신을 개발하는게 가능해질꺼 같습니다.

모히또 모듈 관련해서는 “조대표” 님의 위키독스 문서를 읽어보거나 네이버의 “파이스탁” 까페에 문의를 해도 됩니다. 그리고 한국투자증권 API 관련해서는 “KIS Developers” 에 방문하여 문의를 하면 됩니다.

이제 수익을 내기 위한 전략 및 알고리즘을 개발하는 일만 남았네요.

한국투자증권 Open API 활용 팁

Open API로 시장가 주문시 주의할점은 아래와 같습니다.

기타 읽을 거리

“한국투자증권 Open API 예제 코드 | Open API로 시스템 트레이딩 만들기”의 2개의 댓글

  1. 안녕하세요

    자동매매를 하고싶고 개발에 관심이 많아서 질문좀드립니다

    리눅스쪽은 전혀 알지를 못해서요

    가장 궁금한것은 gui는 없이 개발을 하시는건지

    어떤 툴을 사용하시는지

    gui가 없다면 데이터값은 어떻게 보시는지

    파이썬으로 개발시 스레드관련한 문제는 없는지요

    시간나시면 답변 부탁드립니다 아주아주 잘보고있습니다

    1. 안녕하세요 반갑습니다.
      질문하신 것에 대해 간단히 답변드려 봅니다.

      1) GUI 없이 개발합니다. 저 같은 경우에는 GUI 까지 개발하는데에는 너무 시간이 많이 걸리기 때문에
      제가 생각한 알고리즘으로 only 파이썬 코드로 매매하게끔 개발했습니다.

      2) Windows 상에서는 파이썬 + VS Code 로 코드를 짜는게 편리합니다.
      코드는 리눅스에서 돌고 있는데 이때 VS Code 의 SSH 접속 기능을 사용하면
      Windows 에서도 쉽게 개발할 수 있습니다.

      3) 데이터는 한국투자증권의 API 에서 얻어오는 것과 Open 된 API를 사용하고 있습니다.
      데이터 처리는 굳이 GUI 관련 함수가 필요가 없습니다. GUI가 필요하다면
      파이썬 코드나 개발을 잘 모르는 일반인들에서 제공할때나 필요하겠네요.

      4) 저도 파이썬 쓰레드 함수를 사용하고 있는데 현재까지 별 문제가 없었습니다.
      저는 대량의 차트 데이트를 필요로 하지 않아서 큰 이슈는 없는거 같네요.
      만약 많은 차트 데이터를 사용하여 매매를 한다면 충분히 테스트를 해보셔야 할거 같네요.

답글 남기기

이메일 주소는 공개되지 않습니다.