Claude Code와 토스증권 API로 자동매매 시작하기 3편 (마무리)

4 minute read

Published:

Auto Trading
  1. Claude Code와 토스증권 API로 자동매매 시작하기 3편 (마무리)
  2. Claude Code와 토스증권 API로 자동매매 시작하기 2편 (수수료의 함정)
  3. Claude Code와 토스증권 API로 자동매매 시작하기 1편 (환경 구성)

2편에서 수수료 문제를 잡고 나니, 이제 남은 건 파라미터 튜닝처럼 보였다. 하루에 몇 종목까지 담을지, 한 종목에 자본을 몇 %까지 몰지.

튜닝을 하러 갔다가, 백테스트 숫자를 어디까지 믿어도 되는지를 배우고 왔다.

먼저: 자본 규모는 거의 영향이 없었다

작은 계좌로 시작할 거라 이게 제일 궁금했다. $2,000 / $8,000 / $20,000 세 구간으로 같은 시그널 세트를 돌렸다.

예상은 “작은 계좌가 불리하다”였다. 이유도 명확해 보였다 — 손절폭이 넓은 종목은 1% 리스크로 1주도 못 사서 통째로 놓치고, 현금이 모자라서 신호를 건너뛴다.

실제로는 총수익률이 구간별로 거의 차이가 없었다.

이유는 2편에서 이미 나왔다. 포지션 사이징이 자산에 비례하니까, 자본이 10배면 포지션도 10배고 수수료도 10배다. 수익률(%)로 보면 상쇄된다.

자본이 실제로 영향을 주는 지점은 수익률이 아니라 체결률이었다. 작은 계좌는 놓치는 신호가 많고, 그래서 자본 곡선이 더 거칠어진다. 기댓값이 아니라 분산의 문제다.

작은 계좌의 진짜 문제는 “수익률이 낮은 것”이 아니라 “운의 비중이 큰 것”이라는 결론.

여담으로, 실제 소액 계좌(수백 달러)로 dry-run을 돌렸을 때 20개 시그널에 대해 계좌 잔고의 10배가 넘는 주문이 만들어진 적이 있다. 모든 시그널이 각자 전체 자산 기준으로 독립적으로 사이징되니까 그렇게 된다. 매수 가능 금액을 한 번 조회해서 주문마다 차감해나가는 처리를 넣어서 막았다. 이런 건 백테스트에서 절대 안 보인다.

하루 최대 매수 종목 수: 3 vs 5

한 종목당 리스크가 1%니까, 하루 5건이면 그날 새로 지는 리스크가 5%다. 무제한으로 두면 하루 20건 신호에 리스크가 20% 쌓인다. 상한이 필요한 건 분명했다. 숫자만 정하면 됐다.

독립적인 100종목 표본 5개, 자본 3구간으로 돌렸다.

  • 3건은 모든 자본 구간에서 최하위였다. 놓친 신호의 비용은 실재한다.
  • 5건을 넘으면 곡선이 평평해진다. 6번째 신호는 값어치가 없다.

그래서 5로 올렸다. 여기까지는 깔끔한 결론이다.

그런데 표본을 바꾸면 19%도 되고 55%도 됐다

같은 설정, 같은 자본, 같은 기간. 바꾼 건 어떤 100종목을 뽑았느냐 뿐이다.

 폭
표본을 바꿨을 때 총수익률 범위 (한 설정 기준)19% ~ 55% → 36%p
설정(3건 vs 5건)을 바꿨을 때 차이약 4%p

9배다.

내가 튜닝하겠다고 붙잡고 있던 신호는, 노이즈의 9분의 1 크기였다.

2편의 수수료 실험도 다시 보면 같다. SMA5 → SMA10으로 평균 7.7% → 22.9%였는데, 그 22.9%를 구성한 개별 표본은 7.9%부터 37.6%까지 흩어져 있었다. 방향은 믿을 만하지만 수준은 못 믿는다.

그래서 커밋 메시지에 이렇게 적었다.

Sample-to-sample spread (19-55% for one config) still dwarfs the gap between settings (~4pp), so this is a mild preference, not a tuned optimum.

(표본 간 편차가 설정 간 차이를 압도한다. 이건 튜닝된 최적값이 아니라 약한 선호다.)

무엇을 믿고 무엇을 안 믿을 것인가

이 프로젝트를 하면서 백테스트 숫자를 세 등급으로 나누게 됐다.

믿는 것 — 부호와 방향 “수수료를 넣으면 수익이 준다”, “3건은 5건보다 나쁘다”. 여러 독립 표본에서 일관되게 같은 방향이면 신호로 취급한다.

조건부로 믿는 것 — 구조적 결론 “수수료는 트레이드당 고정이라 회전율이 높을수록 불리하다”. 이건 백테스트가 발견해준 게 아니라, 백테스트가 가리킨 곳을 들여다보니 산수로 설명되는 것이었다. 데이터가 아니라 메커니즘이 근거다.

안 믿는 것 — 수준과 소수점 “이 전략의 연 수익률은 22.9%”. 표본 하나 바꾸면 7.9%가 되는 숫자다. 이걸 근거로 파라미터를 소수점까지 맞추면 그건 최적화가 아니라 그 표본을 외우는 것이다.

실무적으로 하나 얻은 습관: 파라미터를 바꾸기 전에, 아무것도 안 바꾸고 표본만 바꿔서 몇 번 돌려본다. 그 편차보다 작은 개선은 개선이 아니다.

그래서 지금은

  • 스캔은 GCE VM에서 cron으로 매일 돈다. 미국장 마감 후 스캔해서 그날 종가로 시그널을 확정하고, 다음 장이 열린 뒤에 주문을 넣는다. (마감 후 주문하면 API가 거부한다 — 이건 그냥 맞아보고 알았다.)
  • 배포는 push → GitHub Actions가 Docker 이미지 빌드 → Docker Hub → VM이 cron 때 docker pull. 로컬에서 빌드하지 않는다.
  • 실거래는 아직 cron에 붙이지 않았다. 시그널을 찾는 것과 돈을 움직이는 것은 분리된 결정이어야 한다고 봐서, 주문 도구는 사람이 직접 실행하는 수동 도구로 남겨뒀다. 지금은 자본 3구간으로 모의매매를 돌리면서 시뮬레이션 결과와 실제가 얼마나 벌어지는지 보는 중이다.

3편에서 배운 걸 그대로 적용하면, 그 모의매매 결과도 한 번의 결과는 아무것도 증명하지 않는다. 방향이 여러 번 같게 나오는지를 봐야 한다.

전체 코드

github.com/benyco-dev/project-auto-trading-scanner

출발점이 된 유튜브 강의 시리즈는 여기. 방향을 잡아준 덕에 시작할 수 있었고, 거기서부터 내 목표에 맞게 하나씩 바꿔온 기록이 이 3부작이다.

  • 1편: 환경 구성 — Claude Code + 토스증권 API + GCP로 환경을 세우고, 전략을 내 방식대로 바꾸기까지
  • 2편: 수수료의 함정 — 백테스트는 22%였는데 수수료를 넣으니 4%가 됐다

투자 조언이 아니다. 모든 수치는 참고용 시뮬레이션 통계이며 실거래 결과를 보장하지 않는다.

Comments