Claude Code와 토스증권 API로 자동매매 시작하기 2편 (수수료의 함정)

3 minute read

Published:

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

1편에서 환경을 세우고 전략을 정한 뒤 백테스트를 돌렸다. 승률 67.8%, Profit Factor 1.37, 트레이드당 평균 +0.37%. 나쁘지 않아 보였다.

그런데 저 +0.37%라는 숫자를 한참 보다가 이상한 걸 깨달았다.

왕복 수수료가 0.2%다.

백테스트가 대답하지 못하는 질문

내가 쓰던 backtest.py는 트레이드 단위 통계를 낸다. 승률, 평균 수익률, Profit Factor. 이 방식에는 두 개의 조용한 가정이 깔려 있다.

  1. 자본이 무한하다. 같은 날 시그널이 20개 뜨면 20개를 다 산다. 실제로는 현금이 모자란다.
  2. 거래 비용이 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%, 수수료 반영):

 평균 총수익률최대낙폭
SMA57.7%−9.1%
SMA10 + 20일22.9%−9.7%

낙폭은 거의 그대로인데 수익률이 3배가 됐다. 리스크를 더 진 게 아니라, 증권사에 덜 준 것이다.

못 산 신호를 어떻게 고를 것인가

시뮬레이터를 만들면서 딸려 나온 문제가 하나 더 있었다. 현금이 모자라서 그날 시그널 중 일부만 살 수 있을 때, 뭘 먼저 사야 하나?

원래 코드는 티커 알파벳순이었다. 그럴 의도는 없었고, 그냥 정렬을 안 해서 그렇게 됐다.

리스크 기반 사이징을 쓰면 어떤 신호를 고르든 잃는 금액은 계좌의 1%로 같다. 그래서 의미 있는 기준은 손절폭이다. 손절폭이 좁으면 같은 1% 리스크로 더 많은 자본을 투입할 수 있다.

실제 시그널 46건, $2,000 / 리스크 1% / 하루 최대 3건 기준으로 측정:

우선순위실제 투입된 자본
저가 순$383
알파벳 순 (기존)$676
손절폭 좁은 순$1,186

같은 신호, 같은 리스크, 같은 계좌인데 투입 자본이 1.75배 차이 났다. 정렬 한 줄이다.

여기서 배운 것

  1. 백테스트와 포트폴리오 시뮬레이션은 다른 도구다. 전자는 “이 규칙이 통계적으로 우위가 있나”, 후자는 “내 돈으로 이걸 굴릴 수 있나”. 둘 중 하나만 있으면 반쪽이다.
  2. 거래 비용은 전략 파라미터다. “얼마나 자주 매매하는가”가 수수료 구조와 맞물려서 수익률을 결정한다. 비용을 넣지 않은 백테스트는 매매 빈도를 무료라고 착각하게 만든다.
  3. 작은 계좌에서는 “무엇을 못 샀는가”가 “무엇을 샀는가”만큼 중요하다.

다음 편: 마무리 — 자본 규모는 수익률에 영향이 없었고, 표본 편차가 설정 차이보다 9배 컸다.

투자 조언이 아니다. 시뮬레이션은 배당·세금·환전을 반영하지 않았고, 현재 S&P 500 구성종목 기준이라 생존편향이 있다.

Comments