본문 바로가기
Hobby/Hobby_4 - Coding

[코딩 실전] 주식봇 도전 - 1.파이썬 및 기타 환경 구축

by 와우멍 2021. 1. 2.

안녕하세요 와우멍입니다.

오늘은 주식 자동매매 파이프라인을 만들기 위한 환경구축에 대한 내용을 포스팅하겠습니다.


 전체적인 내용은 유튜브 조코딩 님의 채널(www.youtube.com/channel/UCQNE2JmbasNYbjGAcuBiRRg)에 있는 영상을 보면서 수행한 과정과 겪은 시행착오를 함께 정리한 것입니다. 또, 조코딩님은 '파이썬 증권 데이터 분석' 책을 레퍼런스로 사용했다고 하셨습니다.

 


파이썬을 이용한 주식 자동매매 프로그램 도전!!

0. 대신증권 계좌개설

 - 증권사 API를 이용한 시스템트레이딩은 보통 키움증권 영웅문이나 대신증권 크레온을 사용하는 것 같음. 기존에는 키움증권 API를 이용한 파이프라인을 이용하고 있었는데, 이번 기회를 통해 대신증권 API를 사용해보니.. 퍼포먼스는 아직 안해봐서 모르겠지만 기본적인 예제나 Documentation은 대신증권이 훨씬 깔끔하게 잘 되어있는 느낌!! 

- 플레이스토어에서 '크레온 어플 다운로드' - '비대면계좌개설' 

(play.google.com/store/apps/details?id=com.daishin.creon&hl=ko&gl=US)


 

1. 크레온 HTS 설치 

http://creontrade.com에 접속해서, 계좌개설할 때 만든 아이디로 로그인

 

크레온

대신증권 온라인 주식 거래 서비스. 비대면계좌개설, 수수료 혜택, 주식시세, 종목추천, 투자정보 제공

www.creontrade.com:443

 1-1. 시스템트레이딩 설정: 홈페이지에서 '온라인지점' - '서비스신청관리' 에서 '시스템트레이딩' 탭에서 약관을 읽고 신청.

 1-2. HTS 설치: '고객라운지' - '트레이딩안내' - '다운로드센터' 탭에서 'CREON HTS' 다운로드 후 설치

- 설치 후 실행하면 아래의 화면이 나오는데, 상단에서 CREON이 아니라 우측의 CREON PLUS를 선택하고 로그인을 해줘야 함.

 - 실행 후 우측 하단의 트레이창서 CreonPlus Start 아이콘을 우클릭 후 주문 오브젝트 사용동의를 체크

1-3. 크레온 API 활용: 윈도우10에서만 가능, 다른 운영체제면 AWS같은 클라우드에서 윈도우 서버를 사용하거나 VM ware나 버츄얼박스등을 이용한 가상OS상에서 진행

 


 

2. 파이썬 환경 세팅

 - 파이썬은 32비트를 사용해야 함. (x86이라고 붙은 것이 32bit용 프로그램!!)

 - 작업표시줄의 검색에서 '시스템 환경 변수 편집'을 검색하여 '환경 변수'에 들어가 '시스템 변수' 중 'Path'를 선택하여 편집, 32bit python의 path가 제대로 추가되었는지 확인한다. 

 ** 기본적으로 python을 설치하면, 비트수 상관없이 'python'이 명령어가 됨.  보통 마지막에 설치한 버전 bit의 python이 실행되므로 아래의 예시와 같이 32bit python폴더에서의 python실행파일과 64bit python폴더에서의 실행파일 이름을 바꿔주는 것으로도 실행명령어를 구분할 수 있음.

 ** 하지만, 나중에 작업환경이 추가나 변경될 수도 있으니 이렇게 source자체를 건드는 것보다는 Anaconda등을 활용하여 virtual environment를 추가하여 관리하는 것이 더 안전할 듯.

(좌) 64bit python 설치 폴더/ (우) 32bit python 설치 폴더

 ** 파이썬을 관리자권한으로 실행할 수 있게 설정해야 함

  파이썬 실행파일의 '속성' - '호환성' - '관리자권한으로 이 프로그램 실행' 체크박스를 활성화

pip install pywinauto: 윈도우작업 자동화를 위한 라이브러리을 설치

 


 

**중간점검1. 종목 리스트 뽑기

크레온플러스자료실의 '종목정보 구하는 예제'를 실행해서 환경이 잘 구축되었는지 확인!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import win32com.client
 
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
    print("PLUS가 정상적으로 연결되지 않음. ")
    exit()
 
# 종목코드 리스트 구하기
objCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
codeList = objCpCodeMgr.GetStockListByMarket(1)  # 거래소
codeList2 = objCpCodeMgr.GetStockListByMarket(2)  # 코스닥
 
print("거래소 종목코드"len(codeList))
for i, code in enumerate(codeList):
    secondCode = objCpCodeMgr.GetStockSectionKind(code)
    name = objCpCodeMgr.CodeToName(code)
    stdPrice = objCpCodeMgr.GetStockStdPrice(code)
    print(i, code, secondCode, stdPrice, name)
 
print("코스닥 종목코드"len(codeList2))
for i, code in enumerate(codeList2):
    secondCode = objCpCodeMgr.GetStockSectionKind(code)
    name = objCpCodeMgr.CodeToName(code)
    stdPrice = objCpCodeMgr.GetStockStdPrice(code)
    print(i, code, secondCode, stdPrice, name)
 
print("거래소 + 코스닥 종목코드 "len(codeList) + len(codeList2))
cs

 *처음에 왼쪽과 같이 'PLUS가 정상적으로 연결되지 않음' 오류가 발생

 - 저는 Pycharm을 사용했는데, Pycharm을 사용하든 Powershell을 사용하든 관리자권한으로 실행해줘야 프로그램이 정상적으로 동작한다. 저 에러메세지는 보통 관리자권한으로 실행하지 않았을 때 발생.

(좌) 관리자권한으로 실행하지 않았을 때 발생한 에러 / (우) 정상 동작하여 종목 정보가 제대로 반환된 경우


 

3. Slack으로 주가를 조회하여 전송하는 봇 만들기

 - Slack: 주로 업무용 메신저로 많이 사용되는 프로그램

 - 주가정보를 크레온 api로 불러와서 봇을 만들어 slack로 전송하는 봇을 만들기.

 3-1. Slack 홈페이지(slack.com/)에 접속하여, 우측 상단의 'Slack 실행' 버튼을 눌러 '워크스페이스 생성'

 

3-2. Slack api 홈페이지에 가서 봇 생성하기

 - 'Start Building' 버튼을 누르고, 1단계에서 만든 워크스페이스를 연동  봇의 이름 지정

 - 'Auth&Permission' 탭에서 봇에게 채팅방 글 작성 권한을 부여 후 'Install to Workspace'를 누르면 끝

3-3. 다시 Slack 홈페이지 마이페이지에 가면, 우측 상단의 'i' 버튼 '더보기' - '앱추가'를 통해 방금 만든 봇의 채팅방을 추가할 수 있다.

3-4. 파이썬에서 이것을 사용하기 위해서, Slacker 패키지를 설치

 - 터미널에서 pip install slacker 를 통해 설치 (github.com/os/slacker여기서 내용 확인 가능)

3-5. 제대로 환경이 구축되었는지 확인을 위해, slacker 예제 코드를 통해 slack으로 메세지를 날려보자.

여기서 블록 부분에 들어갈 api 토큰은, 아까 slack api 페이지에서 생성한 토큰번호를 복사해서 입력해주면 된다.

* 이때 #general을 우리가 아까 설정한 채널이름 #autostock으로 수정해줘야 한다.

그럼 아래와 같이, 방금 보낸 메세지가 slack의 채팅창에 제대로 전송된 것을 확인할 수 있다.

 


 

** 중간점검2 - 종목 정보 조회 후 Slack로 메세지 전송

크레온플러스자료실의 '주식 현재가 조회' 예제를 실행 후 Slack 예제와 합쳐서 메세지를 보내보자.

 - 중간점검1과 중간점검2를 합치면, 각 종목별 정보를 전부 긁어올 수 있겠지!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import win32com.client
 
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
    print("PLUS가 정상적으로 연결되지 않음. ")
    exit()
 
# 현재가 객체 구하기
objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
objStockMst.SetInputValue(0'A005930')  # 종목 코드 - 삼성전자
objStockMst.BlockRequest() # 이게 삼성전자의 현재가 객체
 
# 현재가 통신 및 통신 에러 처리
rqStatus = objStockMst.GetDibStatus()
rqRet = objStockMst.GetDibMsg1()
print("통신상태", rqStatus, rqRet)
if rqStatus != 0:
    exit()
 
# 현재가 정보 조회
code = objStockMst.GetHeaderValue(0)  # 종목코드
name = objStockMst.GetHeaderValue(1)  # 종목명
time = objStockMst.GetHeaderValue(4)  # 시간
cprice = objStockMst.GetHeaderValue(11)  # 종가
diff = objStockMst.GetHeaderValue(12)  # 대비
open = objStockMst.GetHeaderValue(13)  # 시가
high = objStockMst.GetHeaderValue(14)  # 고가
low = objStockMst.GetHeaderValue(15)  # 저가
offer = objStockMst.GetHeaderValue(16)  # 매도호가
bid = objStockMst.GetHeaderValue(17)  # 매수호가
vol = objStockMst.GetHeaderValue(18)  # 거래량
vol_value = objStockMst.GetHeaderValue(19)  # 거래대금
 
# 예상 체결관련 정보
exFlag = objStockMst.GetHeaderValue(58)  # 예상체결가 구분 플래그
exPrice = objStockMst.GetHeaderValue(55)  # 예상체결가
exDiff = objStockMst.GetHeaderValue(56)  # 예상체결가 전일대비
exVol = objStockMst.GetHeaderValue(57)  # 예상체결수량
 
print("코드", code)
print("이름", name)
print("시간", time)
print("종가", cprice)
print("대비", diff)
print("시가"open)
print("고가", high)
print("저가", low)
print("매도호가", offer)  # 주식을 바로 매수할 수 있는 시장가격
print("매수호가", bid)
print("거래량", vol)
print("거래대금", vol_value)
 
if (exFlag == ord('0')):
    print("장 구분값: 동시호가와 장중 이외의 시간")
elif (exFlag == ord('1')):
    print("장 구분값: 동시호가 시간")
elif (exFlag == ord('2')):
    print("장 구분값: 장중 또는 장종료")
 
print("예상체결가 대비 수량")
print("예상체결가", exPrice)
print("예상체결가 대비", exDiff)
print("예상체결수량", exVol)
 
from slacker import Slacker
slack = Slacker('Slack API 입력')
slack.chat.post_message('#autostock''삼성전자 현재가: '+ str(offer))
cs

 

왼쪽의 그림과 같이, 입력받은 코드의 종목(여기서는 삼성전자, A005930)에 대한 여러 정보들이 반환된다.

23~40라인을 통해, GetHeaderValue에 종목의 여러 정보들이 들어있다는 것을 볼 수 있는데 이는 추후 Documentation을 확인해보고 모르는 용어는 추가로 공부해보기..

Python 터미널에서 결과가 출력이 되고, 67~69라인을 통해 매도호가(offer)가 slack으로 전송이 된 것을 확인할 수 있다,

 

 

 


 

여기까지는 무난하게 됐습니다..!!

똑똑한 사람들이 많이 해놔서 생각보다 금방 따라할 수 있었네요.

그럼 다음에는 실제 전략을 넣고 하는 예제까지 쭉 가봅시닷!!

댓글