안녕하세요 와우멍입니다.
오늘은 주식 자동매매 파이프라인을 만들기 위한 환경구축에 대한 내용을 포스팅하겠습니다.
전체적인 내용은 유튜브 조코딩 님의 채널(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에 접속해서, 계좌개설할 때 만든 아이디로 로그인
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를 추가하여 관리하는 것이 더 안전할 듯.
** 파이썬을 관리자권한으로 실행할 수 있게 설정해야 함
파이썬 실행파일의 '속성' - '호환성' - '관리자권한으로 이 프로그램 실행' 체크박스를 활성화
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으로 전송이 된 것을 확인할 수 있다,
여기까지는 무난하게 됐습니다..!!
똑똑한 사람들이 많이 해놔서 생각보다 금방 따라할 수 있었네요.
그럼 다음에는 실제 전략을 넣고 하는 예제까지 쭉 가봅시닷!!
'Hobby > Hobby_4 - Coding' 카테고리의 다른 글
[코딩실전] 주식봇 도전 - 3. 크레온 및 코드 자동실행 (2) | 2021.01.31 |
---|---|
[코딩 실습] 네이버 크롤링을 통한 주식 종목별 검색량 확인하기 - 1 (2) | 2021.01.27 |
[코딩실전] 주식봇 도전 - 2. 변동성돌파 전략 예제 구현 (0) | 2021.01.25 |
[코딩공부] 필수알고리즘w파이썬 - 2. 스택(Stack)와 큐(Que) (0) | 2021.01.06 |
[패스트캠퍼스 후기 1] Python Programming 기초 - 1 (2) | 2020.11.03 |
댓글