반응형
변동성 돌파 자동매매 봇, 이렇게 만들었다
주식 자동매매 봇을 만들고, 실전에 투입하기까지의 과정을 기록한다.
왜 만들었나
기존에 autoTradingBot이라는 이름으로 키움증권 API 기반 자동매매 봇을 운영하고 있었다. 단일 파일(stock_bot.py) 구조에 매매 기록도 구글시트에만 남기는 방식이라, 전략 분석이나 파라미터 튜닝이 어려웠다. 이걸 리팩터링해서 매매 기록을 DB에 쌓고, 백테스트와 일일 리포트를 자동화하는 것이 목표였다.
전략 개요
두 가지 전략을 병렬로 운용한다.
전략 1: 변동성 돌파 (VB)
- 매매 시간: 09:05 ~ 14:50
- 대상: 구글시트 WATCHING 종목 (현재 약 30종목 모니터링)
- 매수 조건: 20일 고가 돌파 + 변동성 돌파(시가 + 동적K x 전일레인지) 동시 충족
- 추가 필터: 종목 20MA 위(BULL), 거래대금 30억+, 갭상승 3% 이내, 호가 스프레드 0.3% 이내
- 매도: ATR 기반 손절/목표가 + 동적 손절 상향(본전 -> 트레일링)
전략 2: 장초반 수급 단타 (bunt_pension)
- 매매 시간: 09:00 ~ 09:06 (장 시작 6분)
- 대상: 시장 전체 스캔 (시총 500억~1조)
- 매수 조건: 12개 지표 AND 조건 (시가대비 등락, MA 추세, 거래량 회전율, 거래대금 급증 등)
- 최대 3종목 보유
3팩터 예산 스케일링
시장 상황에 따라 매수 예산을 조절한다. 종목이 BULL(20MA 위)인 것이 전제이고:
| 소속시장 | 비소속시장 | 예산 |
|---|---|---|
| BULL | BULL | 100% |
| BULL | BEAR | 75% |
| BEAR | - | 40% |
시스템 구성
구글시트(관심종목) <- 봇 -> 키움 REST API (주문)
| |
TimescaleDB 키움 웹소켓 (실시간 시세)
(매매기록/리포트)
- 키움증권 REST API: 주문 실행 (시장가 매수/매도)
- 키움 웹소켓: 실시간 호가/체결 수신
- 구글시트: WATCHING 종목 관리, 포지션 현황
- TimescaleDB: 매매 기록(trades), 일일 요약(daily_summary) 저장
- pykrx: 일봉 OHLCV, 지표 계산 (ATR, 20MA 등)
동적 손절 관리
단순히 손절/목표가만 걸어두는 게 아니라, 수익이 나면 손절가를 올린다:
- 초기: 진입가 - ATR x 2.5 (당시 설정)
- +3% 도달: 손절가 -> 본전 (손실 0 잠금)
- +5% 도달: 트레일링 스탑 -- 고점 대비 -2%에서 매도
백테스트 검증
2024~2025년 2년치 데이터로 백테스트를 진행했다. WATCHING 종목 대상, 지수 필터 ON 기준:
| 항목 | 값 |
|---|---|
| 총 거래수 | 458건 |
| 승률 | 56.6% |
| Profit Factor | 1.78 |
| 총 수익률 | +65.82% |
| MDD | -5.62% |
| 샤프 비율 | 2.26 |
지수 필터 OFF 대비 BEAR 구간에서 220건의 불필요한 거래(승률 41.4%, 손실 -87만)를 차단하는 효과를 확인했다.
실전 운영 설정
| 항목 | 값 |
|---|---|
| VB 종목당 예산 | 150만원 |
| VB 최대 보유 | 5종목 |
| Pension 종목당 예산 | 50만원 |
| Pension 최대 보유 | 3종목 |
| 루프 주기 | 120초 |
| 모드 | --live (실전) |
4월 7일부터 실전 운영을 시작했다.
반응형
댓글