AI/Dev
백테스트를 믿지 않기로 했다 — NAS 에서 도는 모의투자 자동매매 만들기
2026년 11월 12일
요약
- 지난 글에서 무작위를 이긴 규칙 하나(KP-Swing v2 Set 3)를 찾았다.
- 백테스트는 과거에 맞춘 결과일 수 있어서, 규칙을 고정한 채 앞으로의 시장에서 확인하기로 했다.
- 장부 1,000만 원의 NH 모의투자 계좌로 매일 장 마감 후 자동 주문한다. 집 NAS 의 Docker 에서 돌고, 결과는 Slack 으로 받는다.
전진 검증이란
백테스트는 이미 아는 과거로 규칙을 평가한다. 전진 검증은 규칙을 고정해 두고 그 뒤에 오는 날들로 평가한다. 규칙을 고칠 수 없게 장부를 만들 때 규칙 설정 전체를 저장해 두고, 설정이 바뀌면 프로그램이 처리를 거부하게 했다. 규칙을 바꾸고 싶으면 새 이름의 장부로 처음부터 다시 시작해야 한다.
하루 일과
| 시각 | 작업 | 내용 |
|---|---|---|
| 08:40 | 아침 손절 주문 | 증권사 잔고와 장부 대조 → 보유 종목마다 스톱지정가 손절 주문 |
| 15:35 | 장마감 처리 | 오늘 일봉 수집 → 매도·매수 계획 계산 → 주문 저널에 기록 |
| 15:40 | (장마감 처리 안에서) | 장후 시간외 종가 주문 — 매도 먼저, 그다음 매수 |
| 16:05 | 체결 확정 | 계획을 다시 계산해 저널과 같은지 확인 → 체결 반영 → 장부 확정 → 잔고 대조 |
| 16:30 | 블로그 매매 일지 | 이 블로그에 그날 일지 게시 (금요일은 주간 결산도) |
| 20:00 | DB 백업 | 최근 14일 보관 |
신호는 종가로 계산하고 체결도 종가(시간외 종가매매)로 받는다. 백테스트와 같은 가격 기준이다.
사고를 막는 장치
자동매매에서 무서운 건 수익이 아니라 사고다. 처음부터 넣은 것들:
- 주문 전에 저널부터 쓴다. 프로그램이 중간에 죽었다 다시 떠도 같은 주문을 두 번 내지 않는다.
- 증권사 잔고가 기준이다. 장부와 잔고가 다르거나, 15:35 계획과 16:05 재계산이 다르면 주문을 멈추고 알린다. 사람이 확인한 뒤에만 다시 시작한다.
- 휴대폰으로 직접 판 경우도 잔고 대조에서 걸린다. 명령 하나로 장부에 "수동 매도"로 반영한다.
- 장 마감 전 데이터로는 장부를 처리하지 않는다. 장중의 미완성 일봉으로 계산하는 실수를 막는다.
- 백테스트, 내부 장부, 모의투자가 같은 하루 처리 코드를 쓴다. 규칙 구현이 경로마다 달라지지 않는다.
매수 금액은 어떻게 정하나
고정 금액이 아니라 변동성으로 정한다. 손절에 걸려도 계좌의 약 1% 만 잃도록 맞춘다.
code
주식 수 = 평가액 × 1% ÷ (1.8 × ATR14)
평가액 1,000만 원 기준 (ATR% = 하루 평균 변동폭 ÷ 주가):
| ATR% | 1건 매수 금액 |
|---|---|
| 2% | 약 278만 원 |
| 3% | 약 185만 원 |
| 4% | 약 139만 원 |
변동성이 작은 종목일수록 많이 산다. 최대 10종목이지만 보통 3~6종목이면 현금을 거의 다 쓴다.
운영 환경
- 데이터와 주문: NH투자증권 나무 PLUG Open API (시세는 실서버, 주문은 모의투자 서버)
- 실행: 집 NAS 의 Docker 컨테이너 (Portainer). GitHub 에 push 하면 테스트를 거쳐 장 시간이 아닐 때 자동 재배포
- 알림: Slack — 매일 계획, 체결, 장부, 오류
- 기록: SQLite (일봉, 장부, 주문 저널, 작업 기록)
처음 겪은 문제도 있었다. 모의투자 서버에는 호출 건수 제한이 있어 첫날 체결 조회가 막혔다. 호출 사이에 1초 간격을 두고, 막히면 기다렸다 다시 시도하도록 고쳤다.
앞으로
- 매 거래일 체결 확정 후 매매 일지를 올린다 (그날 신호 종목, 매수·매도, 장부 평가액, KODEX 200 대비).
- 매주 금요일에는 주간 결산을 올린다.
- 판단 기준: 몇 달 뒤 같은 기간의 KODEX 200 보유와 무작위 선택보다 나은가. 아니면 지난 글의 결론대로 지수 ETF 로 돌아간다.
※ 이 글은 개인 공부 기록이며 투자 권유가 아닙니다. 모의투자 결과이며 실제 계좌 성과가 아닙니다.