파이썬으로 개발하는 기초 자동주식거래기
자동주식거래기, ASTP
ASTP(Auto Stock Trading Program)는 내부 알고리즘에 따라 주식 자동 매매를 테마로 만들어진 것으로 제 두 번째 마일스톤입니다. 1학년 2학기가 지나고 스스로 프로그램을 만들어보고 싶던 차에 지인의 자동주식거래기는 어떠냐는 말에 흥미가 돋아 만들게 되었습니다. 프로그램은 파이썬을 이용해 만들었고, 주식과 관련된 부분은 지인의 도움을 받으며 기초 전략만 간단히 따르는 형태로 만들었습니다.
프로그램 특징
한국투자증권의 OpenAPI를 사용했습니다. API를 이용하는 프로그램을 만들어본 것은 이번이 처음인데, 할 수 있는 것들이 생각보다 많아져서 놀랐네요. 매매전략은 다음의 두 가지를 따르며 나스닥을 기준으로 작동합니다.
- 알고리즘 요약
- 주식 매수: NDX 지수와 나스닥 상장 1, 2위 기업의 비율을 고려하여 주식을 매수합니다.
- 주식 매도: NDX 지수가 폭락하거나 원달러 환율이 과도하게 상승할 경우 보유주식을 전량 매도하고 매매활동을 20영업일간 중지합니다. NDX 지수 폭락 여부는 주식장 시작과 종료 시점에 두 번씩 엑셀에 입력된 NDX 지수의 최대값과 최솟값을 비교하여 판단합니다.
- 사용한 라이브러리
mojito
: 한국투자증권의 OpenAPI 통합 파이썬 레퍼 모듈입니다.yfinance
: 나스닥 시가총액 순위를 조달하기 위해 사용합니다.BeautifulSoup
: 주식 관련 모듈 모두에서 누락되어있는 NASDAQ-100 수치를 크롤링으로 조달받기 위해 사용합니다.
구조 및 예시 코드
flowchart TD
A[예수금이 충분한가]
B[달러 잔고가 있는가]
C[20일 영업일 내 나스닥이 3% 이하로 하락했는가]
D[달러 잔고 또는 ETF를 소유하는가]
E[나스닥 1위와 2위 기업의 시가총액이 10% 이상 차이나는가]
F[1, 2위 분산 매수]
G[1위 전량 매수]
H[전량매도 및 환전]
I[현재 보유중인 종목이 있는가]
J[20일 영업일 내 나스닥이 -3% 이하로 하락한 횟수가 3번 이상인가]
K[보유종목 전량 매도]
L[환율이 1450원 이상인가]
M[전액 환전]
N[ETF 매수]
O[활동 중지]
A -- 아니오 --> O
A -- 예 --> B
B -- 아니오 --> A
B -- 예 --> C
C -- 아니오 --> D
D -- 아니오 --> E
E -- 아니오 --> F
E -- 예 --> G
F --> C
G --> C
D -- 예 --> H
H --> E
C -- 예 --> I
I -- 아니오 --> J
I -- 예 --> K
K --> J
J -- 아니오 --> C
J -- 예 --> L
L -- 아니오 --> N
L -- 예 --> M
N --> C
M --> C
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
# NDX 크롤링
def get_ndx():
if response.status_code == 200:
html = response.text
soup = BeautifulSoup(html, 'html.parser')
ndx_class = soup.find(class_ = 'Fw(b) Fz(36px) Mb(-4px) D(ib)')
ndx = re.sub(r'[^0-9]', '', ndx_class.get_text())
else :
print(response.status_code)
return ndx
# NDX -3% 여부 확인
def ndx_collapsed():
df_ndf_data['ndx_index'] = df_ndf_data['ndx_index'].astype(float)
ndx_decrse_3per = False
ndx_max = df_ndf_data['ndx_index'].max()
ndx_min = df_ndf_data['ndx_index'].min()
if 100 * (ndx_max - ndx_min) / ndx_max > 3:
ndx_decrse_3per = True
print("\nNDX 수치의 변동이 심합니다.\n")
else:
print("\nNDX 수치는 안정적입니다.\n")
return ndx_decrse_3per
프로그램 동작 예시
프로그램 예시 동작과 프로그램 통해 애플 1주를 매수한 화면
UI 구성이 없는 단순 파이썬 프로그램이기 때문에 명령 프롬프트를 통해 문제없이 실행되며, 프로그램을 한 번 실행시키면 임의로 종료시킬 때까지 프로그램이 스스로 매수주문과 매도주문을 올립니다. 체결된 매도주문은 프롬프트 창 또는 한국투자증권 어플을 통해서도 아래의 캡처된 화면과 같이 매수 여부 및 보유중인 주식 상황을 확인할 수 있습니다.
주의사항 및 한계
- 미국 주식시장은 한국시간으로 PM 11:30 ~ AM 6:30까지 열리기 때문에 해외주식을 기반으로 하는 ASTP는 일반적인 프로그램과 다르게 코드 동작을 확인할 수 있는 시간에 제약이 있습니다.
- 한국투자증권이 제공하는 서비스를 이용하기 위해 프로그램 외적으로 사전작업이 두 가지 필요합니다.
- 한국투자증권 계좌를 개설하고 OpenAPI를 신청해야 합니다. 신청 페이지에서
key
와secret
을 발급받아 해당 값을 가상 계좌번호와 함께 프로젝트 내mock.key
에 저장하여 사용하기 위함입니다. - 주문 송수신이나 잔고조회 등을 처리하기 위해 한국투자증권이 제공하는 eFriend Expert 프로그램을 설치해야 합니다.
- 한국투자증권 계좌를 개설하고 OpenAPI를 신청해야 합니다. 신청 페이지에서
- 이외에 공동인증서 모듈이 64bit 환경을 미지원하는 이슈가 있기 때문에 불편하더라도 32bit 가상환경을 임의적으로 구축하고, 구축된 가상환경 위에서 코드를 실행해야 합니다.
마치며
깃허브에서 더 자세히 둘러보실 수 있습니다.
이번 마일스톤을 만들면서는 API나 라이브러리 등 외부 모듈을 사용해보는 것을 중점 경험으로 두었으며, 직접 사용해보니 만들어져있는 모듈을 적극적으로 활용해야 보다 많은 것을 할 수 있겠다는 것을 크게 알 수 있었습니다. 나스닥 지표나 각 기업의 시가총액 등의 데이터를 정렬, 표시하는 과정도 알게 되었네요.
237줄 정도 되는 간단한 코드로 마치지만, 나중에 프로그램을 확장하게 된다면 매수조건과 매도조건을 더 정교히 상세화하고 클래스화를 거쳐 코드를 간결히 정리하는 노력이 추가되면 좋을 것 같다는 생각이 들었습니다.