신한투자증권 모의투자계좌 개설, Open API도 발급도 모두 받았다. 이제 데이터 수집, 데이터 분석, 자동매매 시스템을 구축하기 위한 Python 개발 환경을 구성해보자.

파이썬 개발 환경

  • VMware
  • Windows 10
  • CPU : 4core
  • Mem : 16G
  • Python : python3.10.11
  • Editor : Visual Studio code

Python3.10.11버전을 아래의 링크를 통해서 다운로드 받고, 개발 편의성을 위한 Editor로 VScode를 설치 했다. VScode에서 Python 가상환경을 구축하는 방법 또한 지난 포스팅 링크를 참고하면 된다.

https://www.python.org/downloads/windows/
https://byj1009.github.io/python/2022/11/23/python-venv.html

+++ 추가로 Rhel8.6 기준으로 Linux에서 Open API를 통한 데이터 수집도 테스트할 예정.

mojito2

[파이썬을 이용한 한국/미국 주식 자동매매 시스템] 위키독스의 필자 혹은 저자가 빌드한 Python 모듈 중 일부로 보여진다. mojito2 파이썬 라이브러리는 한국투자증권의 Open API만을 호출할 수 있는 것으로 보여지며, 간단하게 해당 라이브러리를 기능 테스트 용도로 활용한 후, 별도로 시세정보 및 주식 자동매매 프로그래밍을 개발해보자.

https://pypi.org/project/mojito2/

mojito2 사용예시

현재가 조회

import mojito
import pprint

key = "발급받은 API KEY"
secret = "발급받은 API SECRET"
acc_no = "12345678-01"

broker = mojito.KoreaInvestment(api_key=key, api_secret=secret, acc_no=acc_no)
resp = broker.fetch_price("005930")
pprint.pprint(resp)

일봉 데이터 조회

import mojito
import pprint

key = "발급받은 API KEY"
secret = "발급받은 API SECRET"
acc_no = "12345678-01"

broker = mojito.KoreaInvestment(api_key=key, api_secret=secret, acc_no=acc_no)
resp = broker.fetch_daily_price("005930")
pprint.pprint(resp)

잔고 조회

resp = broker.fetch_balance()
pprint.pprint(resp)

주문

resp = broker.create_market_buy_order("005930", 10) # 삼성전자, 10주, 시장가
pprint.pprint(resp)
{'rt_cd': '0',
 'msg_cd': 'APBK0013',
 'msg1': '주문 전송 완료 되었습니다.',
 'output': {'KRX_FWDG_ORD_ORGNO': '91252',
  'ODNO': '0000117057',
  'ORD_TMD': '121052'}}

주문 취소

resp = broker.cancel_order("91252", "0000117057", "00", 60000, 5, "Y") # KRX_FWDG_ORD_ORGNO, ODNO, 지정가 주문, 가격, 수량, 모두 
print(resp)

미국주식 주문

broker = KoreaInvestment(key, secret, acc_no=acc_no, exchange="NASD")
resp = broker.create_limit_buy_order("TQQQ", 35, 1)
print(resp)

웹소켓

import pprint
import mojito

with open("../../koreainvestment.key", encoding="utf-8") as f:
    lines = f.readlines()
key = lines[0].strip()
secret = lines[1].strip()


if __name__ == "__main__":
    broker_ws = mojito.KoreaInvestmentWS(key, secret, ["H0STCNT0", "H0STASP0"], ["005930", "000660"], user_id="idjhh82")
    broker_ws.start()
    while True:
        data_ = broker_ws.get()
        if data_[0] == '체결':
            print(data_[1])
        elif data_[0] == '호가':
            print(data_[1])
        elif data_[0] == '체잔':
            print(data_[1])

Reference