Claude Code와 토스증권 API로 자동매매 시작하기 2편 (수수료의 함정)
Published:
Auto Trading
- Claude Code와 토스증권 API로 자동매매 시작하기 3편 (마무리)
- Claude Code와 토스증권 API로 자동매매 시작하기 2편 (수수료의 함정)
- Claude Code와 토스증권 API로 자동매매 시작하기 1편 (환경 구성)
1편에서 환경을 세우고 전략을 정한 뒤 백테스트를 돌렸다. 승률 67.8%, Profit Factor 1.37, 트레이드당 평균 +0.37%. 나쁘지 않아 보였다.
그런데 저 +0.37%라는 숫자를 한참 보다가 이상한 걸 깨달았다.
왕복 수수료가 0.2%다.
백테스트가 대답하지 못하는 질문
내가 쓰던 backtest.py는 트레이드 단위 통계를 낸다. 승률, 평균 수익률, Profit Factor. 이 방식에는 두 개의 조용한 가정이 깔려 있다.
- 자본이 무한하다. 같은 날 시그널이 20개 뜨면 20개를 다 산다. 실제로는 현금이 모자란다.
- 거래 비용이 0이다. 진입가와 청산가의 차이가 곧 수익이다.
두 가정 다 “약간 낙관적”인 수준이 아니었다. 답을 바꾸는 수준이었다.
특히 1번은 내가 답하고 싶었던 질문 자체를 막고 있었다. 나는 “200만원으로 이 전략을 굴릴 수 있나”를 알고 싶었는데, 자본 무한 가정 위에서는 그 질문이 성립하지 않는다.
그래서 portfolio_sim.py를 따로 만들었다. 백테스트를 대체하는 게 아니라 다른 질문에 답하는 도구다.
for day in pd.date_range(...):
# 1) 먼저 청산해서 현금을 회수하고
# 2) 그날 시그널을 손절폭 좁은 순으로 정렬한 다음
# 3) 현금이 닿는 데까지만, --max-orders 개수까지만 담는다
if cost * (1 + fee) > cash:
skipped_cash += 1
continue
핵심은 skipped_cash다. 못 산 신호를 세는 것. 트레이드 단위 백테스트에는 이 개념 자체가 없다.
수수료가 총수익의 40%를 먹고 있었다
시뮬레이터에 수수료를 넣고(토스 미국주식 편도 0.1%) 돌렸더니, 2.2년 동안 약 500번 체결됐다.
- 수수료 총액 = 자본의 16~19%
- 전략이 만들어낸 총 gross edge 대비 = 약 40%
- 시뮬레이션 총수익률: 약 22% → 약 4%
수익의 40%가 증권사로 갔다.
더 나쁜 건 이게 계좌 크기와 무관하게 같은 비율이라는 점이다. 포지션 사이징이 자산에 비례하니까 수수료도 자산에 비례한다. “돈이 좀 더 많으면 수수료 비중이 줄겠지”가 성립하지 않는다.
원인은 명확했다. 수수료는 트레이드당 고정 비율인데, 내 전략의 트레이드당 평균 수익은 +0.37%였다. 0.2%를 떼면 0.17%가 남는다. 승률 67.8%라는 좋아 보이던 숫자는, 사실 아주 작은 이익을 아주 자주 가져가는 구조였고, 그 구조가 수수료에 최악으로 취약했던 거다.
1편에서 “트레이드를 두 배로 늘리는 게 공짜가 아니다”라고 썼는데, 진짜 청구서는 여기서 왔다.
해결: 더 자주 사는 게 아니라 더 오래 들고 있기
수수료율은 내가 바꿀 수 없다. 바꿀 수 있는 건 같은 수수료를 얼마나 큰 움직임에 분산시키느냐다.
Connors 원본의 청산 규칙은 SMA5 회복이다. 이걸 SMA10 + 20거래일 상한으로 늘렸다.
| 청산 규칙 | 트레이드당 평균 | 평균 보유일 |
|---|---|---|
| SMA5 (원본) | +0.41% | 3.5일 |
| SMA10 + 20일 상한 | +0.57% | 5.9일 |
트레이드당 +0.16%p. 별것 아닌 것 같지만, 고정 0.2% 수수료 앞에서는 남는 몫이 0.21%에서 0.37%로 거의 두 배가 된다.
포트폴리오 시뮬레이션으로 확인 (독립 100종목 표본 3개, $2,000, 리스크 1%, 수수료 반영):
| 평균 총수익률 | 최대낙폭 | |
|---|---|---|
| SMA5 | 7.7% | −9.1% |
| SMA10 + 20일 | 22.9% | −9.7% |
낙폭은 거의 그대로인데 수익률이 3배가 됐다. 리스크를 더 진 게 아니라, 증권사에 덜 준 것이다.
못 산 신호를 어떻게 고를 것인가
시뮬레이터를 만들면서 딸려 나온 문제가 하나 더 있었다. 현금이 모자라서 그날 시그널 중 일부만 살 수 있을 때, 뭘 먼저 사야 하나?
원래 코드는 티커 알파벳순이었다. 그럴 의도는 없었고, 그냥 정렬을 안 해서 그렇게 됐다.
리스크 기반 사이징을 쓰면 어떤 신호를 고르든 잃는 금액은 계좌의 1%로 같다. 그래서 의미 있는 기준은 손절폭이다. 손절폭이 좁으면 같은 1% 리스크로 더 많은 자본을 투입할 수 있다.
실제 시그널 46건, $2,000 / 리스크 1% / 하루 최대 3건 기준으로 측정:
| 우선순위 | 실제 투입된 자본 |
|---|---|
| 저가 순 | $383 |
| 알파벳 순 (기존) | $676 |
| 손절폭 좁은 순 | $1,186 |
같은 신호, 같은 리스크, 같은 계좌인데 투입 자본이 1.75배 차이 났다. 정렬 한 줄이다.
여기서 배운 것
- 백테스트와 포트폴리오 시뮬레이션은 다른 도구다. 전자는 “이 규칙이 통계적으로 우위가 있나”, 후자는 “내 돈으로 이걸 굴릴 수 있나”. 둘 중 하나만 있으면 반쪽이다.
- 거래 비용은 전략 파라미터다. “얼마나 자주 매매하는가”가 수수료 구조와 맞물려서 수익률을 결정한다. 비용을 넣지 않은 백테스트는 매매 빈도를 무료라고 착각하게 만든다.
- 작은 계좌에서는 “무엇을 못 샀는가”가 “무엇을 샀는가”만큼 중요하다.
다음 편: 마무리 — 자본 규모는 수익률에 영향이 없었고, 표본 편차가 설정 차이보다 9배 컸다.
투자 조언이 아니다. 시뮬레이션은 배당·세금·환전을 반영하지 않았고, 현재 S&P 500 구성종목 기준이라 생존편향이 있다.

Comments