파이썬 주식 자동매매 6편: 관심 종목 여러 개를 동시에 감시하는 다중 종목 봇 만들기
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
지난 5편에서는 삼성전자 한 종목을 계속 지켜보다가 목표가에 오면 알아서 사는 봇을 만들었습니다. 그런데 실제로 써 보면 금방 아쉬운 점이 생깁니다. 관심 있는 종목은 보통 한두 개가 아니라 5개, 10개씩 되기 때문입니다. 종목마다 프로그램을 따로 켜는 건 번거롭고, 키움 API는 프로그램 여러 개가 동시에 접속하는 것도 불편합니다.
그래서 이번 6편에서는 관심 종목 여러 개를 한 프로그램에서 돌아가며 감시하고, 종목마다 다른 목표가에 도달하면 각각 매수하는 봇으로 업그레이드해 보겠습니다. 5편 코드를 거의 그대로 쓰기 때문에 어렵지 않습니다.
1. 핵심 아이디어: 종목 목록을 '사전(dict)'으로 관리하기
5편에서는 종목코드와 목표가를 변수 하나씩으로 적었습니다. 종목이 많아지면 변수를 계속 늘릴 수 없으니, 파이썬의 사전(dict)에 한꺼번에 담습니다. 종목코드를 열쇠로 두고, 그 안에 이름·목표가·수량을 넣는 방식입니다.
watchlist = {
"005930": {"name": "삼성전자", "target": 70000, "qty": 1},
"000660": {"name": "SK하이닉스", "target": 180000, "qty": 1},
"035420": {"name": "NAVER", "target": 190000, "qty": 1},
}위 종목과 가격은 코드 설명을 위한 예시일 뿐입니다. 실제로 쓸 때는 본인이 관심 있는 종목과 목표가로 바꿔 넣으면 됩니다. 종목을 추가하고 싶으면 한 줄만 더 쓰면 되니, 관리가 훨씬 편해집니다.
2. 돌아가며 감시하기: for 반복문 + 매수 완료 목록
여러 종목을 감시하는 방법은 단순합니다. 5편의 while 무한 루프 안에 for 반복문을 하나 넣어서, 목록에 있는 종목을 한 바퀴씩 돌며 현재가를 확인합니다.
5편에서는 중복 매수를 막으려고 is_bought라는 깃발 변수 하나를 썼습니다. 종목이 여러 개면 깃발도 여러 개가 필요하니, 이번에는 이미 산 종목코드를 모아 두는 집합(set)을 씁니다. 집합에 들어 있는 종목은 건너뛰고, 모든 종목을 다 사면 루프를 끝냅니다.
| 구분 | 5편 (단일 종목) | 6편 (다중 종목) |
|---|---|---|
| 감시 대상 | 변수 1개 | 사전(dict)에 여러 개 |
| 중복 매수 방지 | is_bought 깃발 1개 | bought 집합(set) |
| 반복 구조 | while 1개 | while 안에 for |
| 종료 조건 | 1종목 매수 완료 | 목록 전체 매수 완료 또는 장 마감 |
3. 꼭 넣어야 할 안전장치 2가지
① 조회 사이에 쉬는 시간 두기
키움 OpenAPI+는 짧은 시간에 조회 요청을 너무 많이 보내면 제한이 걸려 데이터를 받지 못합니다. 종목이 많을수록 요청 횟수가 늘어나니, 종목 하나를 조회할 때마다 잠깐 쉬고, 한 바퀴를 다 돌면 조금 더 길게 쉬도록 time.sleep()을 넣습니다. 정확한 조회 제한 기준은 키움증권 OpenAPI+ 공지사항에서 확인하는 것이 가장 안전합니다.
② 장 시간에만 돌리기
장이 끝난 뒤에도 봇이 계속 돌면 쓸데없는 조회만 쌓입니다. 현재 시각을 확인해서 정규장 시간(오전 9시~오후 3시 20분)이 지나면 스스로 멈추도록 조건을 넣습니다. 3시 20분 이후는 종가를 정하는 동시호가 시간이라 시장가 주문이 바로 체결되지 않으므로, 이 예제에서는 그 전까지만 감시합니다.
4. 다중 종목 자동매수 봇 전체 코드
from pykiwoom.kiwoom import *
from datetime import datetime
import time
# 1. 로그인 및 계좌 준비
kiwoom = Kiwoom()
kiwoom.CommConnect(block=True)
my_account = kiwoom.GetLoginInfo("ACCNO")[0] # 첫 번째 계좌
# 2. 감시할 종목 목록 (예시 - 본인 기준으로 바꿔서 사용)
watchlist = {
"005930": {"name": "삼성전자", "target": 70000, "qty": 1},
"000660": {"name": "SK하이닉스", "target": 180000, "qty": 1},
"035420": {"name": "NAVER", "target": 190000, "qty": 1},
}
bought = set() # 이미 매수한 종목코드를 모아 두는 곳
print(f"🤖 다중 종목 감시 시작! 대상 {len(watchlist)}개")
# 3. 전 종목 매수가 끝날 때까지 반복
while len(bought) < len(watchlist):
# 3-1. 장 시간이 지나면 종료
now = datetime.now().strftime("%H%M")
if now >= "1520":
print("⏰ 정규장 감시 시간이 끝나 봇을 종료합니다.")
break
# 3-2. 관심 종목을 한 바퀴 돌며 확인
for code, info in watchlist.items():
if code in bought:
continue # 이미 산 종목은 건너뛰기
df = kiwoom.block_request("opt10001",
종목코드=code,
output="주식기본정보",
next=0)
price = abs(int(df['현재가'][0]))
print(f"{info['name']} 현재가 {price:,}원 / 목표가 {info['target']:,}원")
# 3-3. 목표가 이하이면 시장가 매수
if price <= info['target']:
kiwoom.SendOrder("다중종목자동매수", "0101", my_account,
1, code, info['qty'], 0, "03", "")
bought.add(code)
print(f"🚨 {info['name']} 목표가 도달! {info['qty']}주 매수 주문 완료")
time.sleep(0.5) # 종목 사이 쉬는 시간
time.sleep(3) # 한 바퀴 돈 뒤 쉬는 시간
print(f"✅ 감시 종료. 매수한 종목: {[watchlist[c]['name'] for c in bought]}")코드 설명
- GetLoginInfo("ACCNO")[0]: pykiwoom에서는 계좌번호가 목록 형태로 돌아오기 때문에, 첫 번째 계좌를 [0]으로 꺼냅니다. 계좌가 여러 개라면 원하는 순서의 번호를 넣으세요.
- for code, info in watchlist.items(): 사전에 담긴 종목을 하나씩 꺼내며, code에는 종목코드, info에는 이름·목표가·수량이 들어옵니다.
- bought.add(code): 매수 주문을 넣은 종목을 집합에 기록해서 다음 바퀴부터는 건너뜁니다. 5편의 깃발 변수를 종목별로 늘린 것과 같은 역할입니다.
- SendOrder의 1, "03": 4편에서 설명한 것처럼 1은 신규매수, "03"은 시장가 주문입니다. 시장가라 가격 자리에는 0을 넣습니다.
5. 실행 전 체크리스트
- 반드시 모의투자 서버로 먼저 돌려 보세요. 1편에서 신청한 모의투자 계좌로 로그인하면 실제 돈이 나가지 않습니다.
- 목표가를 현재가보다 높게 잘못 적으면 실행하자마자 바로 매수됩니다. 숫자를 한 번 더 확인하세요.
- 수량(qty)은 처음엔 1주로 두고, 동작이 확인된 뒤에 늘리는 것이 안전합니다.
- 주문을 넣었다고 바로 체결되는 것은 아닙니다. 체결 여부는 영웅문이나 KOA Studio에서 따로 확인하세요.
연재를 마치며
여기까지가 파이썬 주식 자동매매 기초 연재입니다. 지금까지 만든 흐름을 정리하면 이렇습니다.
- 1편: 키움 OpenAPI+ 신청과 32비트 파이썬 개발 환경
- 2편: 자동 로그인과 계좌 정보 불러오기
- 3편: TR 요청으로 현재가 조회하기
- 4편: 매수·매도 주문(SendOrder) 넣기
- 5편: 목표가 도달 시 자동 매수하는 단일 종목 봇
- 6편(이 글): 여러 종목을 동시에 감시하는 다중 종목 봇
여기에 매수 알림을 휴대폰으로 받고 싶다면 파이썬으로 텔레그램 알림 봇 만들기 글의 코드를 매수 주문 바로 아래에 붙이면 됩니다. 봇이 일을 했을 때 바로 알 수 있어 훨씬 마음이 편해집니다.
한 줄 정리
관심 종목은 사전(dict)에 담고, for 반복문으로 돌아가며 확인하고, 산 종목은 집합(set)에 기록하면 단일 종목 봇이 다중 종목 봇이 됩니다. 조회 간격과 장 시간 체크, 두 가지 안전장치는 꼭 넣어 두세요.
※ 이 글은 프로그래밍 학습을 위한 정보 공유이며, 특정 종목의 매수·매도를 권유하지 않습니다. 자동매매 프로그램 사용과 투자 판단에 따른 책임은 사용자 본인에게 있습니다.
댓글
댓글 쓰기