결론부터

AI(Claude Code)와 대화하며 7주 만에 자동매매 시스템을 만들었고 , 지금은 라즈베리파이 한 대가 24시간 혼자 매매합니다.

전략은 단순하게 정리했습니다. KODEX 200 하나만, 떨어질 때 세 단계로 나눠 사고, 팔지 않습니다. 현금은 매달 자동이체로 쌓입니다.

수익률(10/30 종가 기준)은 전체 −2.0%입니다. 그중 봇이 산 4주는 +4.3% , 봇을 만들기 전에 직접 사 둔 4주는 −7.6%입니다.

AI는 코드를 빨리 짜 주는 도구를 넘어, 같이 일하는 동료에 가까웠습니다. 문제를 같이 찾고 테스트·배포·운영 점검까지 맡겼습니다. 사람은 결정과 승인을 맡습니다.

막상 만들어 보니 매매 전략보다 안전장치 코드가 더 많았습니다 (중복 주문 방지, 장 시간 배포 금지, 데몬 하나만 실행).

기간

커밋

PR

자동 테스트

데몬 코드

운영 비용

7주

132개

53개

35개

약 1,800줄

라즈베리파이 전기료

무엇을 만들었나

처음에는 이동평균이 정배열인 종목을 찾아 주는 스크리너를 만들었습니다. 바로 다음 날부터 토스증권 Open API로 주문까지 직접 넣는 자동매매를 시작했습니다. 지금은 서로 연결되지 않은 프로그램 두 개가 각자 돌아갑니다.

그림 1. 전체 구조

정배열 스크리너 : 평일마다 GitHub Actions에서 실행됩니다. 이동평균 정배열에 외국인·기관 수급과 실적 개선 조건을 더해 종목을 고르고, 텔레그램으로 표를 보내 줍니다. 매매는 하지 않습니다.

KODEX 200 자동매매 데몬 : 정규장 동안 1분마다 현재가로 매수 여부를 판단하고, 주문·체결·보유 상태를 SQLite에 기록합니다. 매도 기능은 일부러 넣지 않았습니다.

가볍게 만들었습니다 : 데몬은 파이썬 표준 라이브러리만 씁니다. 외부 패키지가 없어 라즈베리파이에서도 이미지가 작고 설치할 것이 없습니다.

7주의 흐름

그림 2. 날짜별 커밋 수 — 전략을 바꿀 때마다 작업이 몰렸습니다

1~2주차 (9/12 ~ 9/20) 스크리너와 단타 실험 : 스크리너를 GitHub Actions 예약 실행으로 돌리고, 결과를 텔레그램으로 받게 했습니다. 자동매매는 정규장에만 도는 데몬으로 바꾸고 트레일링 스탑, 본전 이동, 타임스탑 같은 손절·익절 규칙을 붙여 봤습니다.

3주차 (9/24 ~ 9/30) RSI(2) 눌림목 : 매매 규칙을 RSI(2) 눌림목 전략으로 바꾸고 10종목에 10%씩 나눠 넣었습니다. API 호출 한도 초과에 대응하는 코드와 시나리오 테스트도 이때 들어갔습니다.

10/16 ~ 10/18 KODEX 200으로 전환 : 개별 종목 전략을 모두 걷어내고 KODEX 200 분할 매수와 장기 보유로 정리했습니다. 처음엔 고정 금액으로 사다가 현금 비율로 바꿨고, 상승장·하락장을 나누는 이동평균도 60일에서 120일로 늘렸습니다. AI가 지킬 작업 규칙(CLAUDE.md)도 이때 만들었습니다.

10/19 첫 실전 매수 , 10/29 ~ 10/31 운영 안정화 : 고점 기준을 보완하고, 실행 방식을 pm2에서 podman으로 옮기고, 로그 90일 보관과 PC 빌드 배포를 넣었습니다.

그래프를 다시 보면, 10월 중순부터는 전략을 바꾸는 커밋보다 운영을 다듬는 커밋 이 많아졌습니다.

매매 전략

상황 (전 거래일 종가 기준)

매수

상승장: 종가가 120일 이동평균 위

매수 가능 현금 전부

하락장 1단계: 5일 고점 대비 −5%

현금의 1/3

하락장 2단계: 10일 고점 대비 −10%

남은 현금의 1/2

하락장 3단계: 20일 고점 대비 −20%

남은 현금 전부

현금을 3등분해서 쓰는 구조입니다. 중간에 입금이 없다면 1단계에 1/3, 2단계에 남은 2/3의 절반(1/3), 3단계에 나머지 1/3을 씁니다. 하락이 깊어질수록 같은 금액으로 더 싸게 삽니다.

단계마다 하락 사이클에 한 번만 삽니다. 모든 조건이 풀린 날의 종가에서 사이클이 다시 시작됩니다.

판단은 장중 현재가로 1분마다 합니다. 주문은 시장가로 내고, 실제 체결가가 더 비쌀 수 있어서 현재가에 1% 여유를 두고 수량을 정합니다.

상승장에서는 기다리지 않습니다. 매달 들어온 현금을 바로 삽니다. 팔지 않으니 수익은 오래 들고 가는 데서 나옵니다.

10월 급락에서 실제로 일어난 일

그림 3. 10월 급락 구간의 매수 시점과 다음 단계 가격

첫 매수: 안전장치가 먼저 일했습니다

KODEX 200은 10/2 111,900원에서 10/15 86,901원까지 2주 만에 22% 빠졌습니다. 10/19 장이 열리자마자 봇은 20일 고점 대비 −21.6%를 확인하고 3단계(현금 전부) 주문을 냈습니다. 첫 주문은 “매수 가능 금액 부족”으로 거부됐습니다. 시장가 주문은 증거금을 넉넉히 잡기 때문입니다. 봇은 규칙대로 수량을 85%로 줄여 다시 냈고, 3주가 85,935원에 체결됐습니다.

운영하면서 찾은 문제: 3단계가 2단계보다 비싸다

단계마다 고점을 재는 기간(5일·10일·20일)이 다른 게 문제였습니다. 10/29 기준으로 계산해 보면 20일 고점은 급락 전인 10/2의 111,900원이라 3단계 가격이 89,520원 입니다. 반면 10일 고점은 10/28의 95,515원이라 2단계 가격은 85,964원 입니다. 더 깊은 하락에 쓰려고 아껴 둔 3단계 현금을 얕은 하락에서 먼저 써 버리게 되는 구조였습니다.

AI에게 “코드는 고치지 말고 방안만”이라고 먼저 부탁했고, 방안 세 가지를 비교한 뒤 하나를 골랐습니다. 고친 내용은 하락 구간이 끝나고 반등한 날(10/28) 이후의 고점부터 다시 재는 것 입니다. 이제 2단계는 85,964원, 3단계는 76,412원으로 순서가 맞습니다. 단계 가격을 억지로 정렬하는 방안도 있었지만, 단계마다 기간을 따로 보는 원래 설계와 맞지 않아 뺐습니다. 10/30 09:09의 1단계 매수(1주, 90,505원)가 새 기준으로 나간 첫 주문입니다.

사고 나지 않게: 안전장치

실제 돈이 오가는 계좌라서, 전략보다 “같은 주문이 두 번 나가지 않는 것” 이 더 중요했습니다.

그림 4. 주문 상태 흐름과 그 밖의 규칙

DB에 먼저 적습니다. 주문을 보내기 전에 토스증권의 멱등성 키(clientOrderId)를 DB에 기록합니다. 응답을 못 받으면 같은 키로만 다시 확인하므로, 타임아웃이 나든 서버가 재시작되든 주문이 두 번 들어가지 않습니다.

모르면 멈춥니다. 10분이 지나도 확인이 안 되는 주문은 UNKNOWN으로 두고 새 매수를 멈춘 뒤 텔레그램으로 알립니다. 사람이 앱에서 확인하고 DB를 고쳐야 다시 삽니다.

데몬은 하나만 돌립니다. 토스 토큰은 클라이언트당 하나만 유효해서, 데몬이 둘이면 서로의 토큰을 무효로 만들고 중복 매수까지 생길 수 있습니다.

재시작해도 이어서 합니다. 사이클과 단계 상태를 메모리에 두지 않고 DB에서 다시 구합니다.

테스트 35개 가 가짜 토스 클라이언트와 임시 DB로 이 규칙들을 확인합니다. 배포할 때마다 먼저 돌아갑니다.

운영: 라즈베리파이 한 대

podman + systemd : 컨테이너를 systemd 서비스로 등록했습니다. 재부팅하면 로그인 없이 자동으로 뜨고, 죽으면 10초 뒤에 다시 살아납니다.

상태는 컨테이너 밖에 둡니다 : DB, 로그, 비밀값(API 키)은 서버 폴더에 있습니다. 이미지를 바꿔도 주문·포지션 기록이 그대로 이어집니다.

배포는 명령 한 줄 : PC(WSL)에서 ./deploy/deploy.sh 를 실행하면 테스트 → arm64 빌드 → 전송 → 서버 시험 실행 → 재시작 → 로그 확인까지 한 번에 끝납니다. 장 시간에는 스스로 거부하고, 직전 버전을 남겨 두어 바로 되돌릴 수 있습니다.

기록과 알림 : 로그는 날짜별 파일로 90일 보관합니다. 텔레그램으로는 그날 첫 판단 결과와 주문·체결을 받습니다. 주말에 입금해도 5분 안에 매수 가능 금액이 로그에 찍힙니다.

AI와 일한 방식

그림 5. 사람은 정하고, AI는 만들고 확인합니다

대부분의 작업은 그림 5의 순서로 진행했습니다. 제가 문제를 꺼내면 AI가 서버 로그와 DB로 원인을 확인하고 방안을 비교합니다. 제가 고르면 AI가 코드·테스트·문서를 같은 커밋으로 고치고, PR 머지와 장외 시간 배포, 로그 확인까지 합니다.

실계좌를 맡기면서 지킨 원칙

규칙은 문서로 둡니다. CLAUDE.md에 “장 시간 배포 금지”, “데몬은 하나만”, “계좌 파일 커밋 금지”를 적어 두니, 매번 말하지 않아도 지켰습니다.

큰 변경은 방안부터 받습니다. “아직 코드는 고치지 마”라고 하면 비교표부터 받습니다. 고르는 건 제가 합니다.

확인은 추측 대신 로그로 합니다. “지금 상태가 어때?”라고 물으면 AI가 서버에 접속해 로그와 DB를 읽고 답합니다.

비밀값은 채팅에 붙여 넣지 않습니다. API 키는 서버 파일에만 두고, 옮길 때도 값을 화면에 출력하지 않게 했습니다.

되돌리기 어려운 일은 사람이 승인합니다. 머지, 운영 배포, 계좌 조회는 승인한 뒤에만 진행됩니다.

AI가 막힌 순간도 있었습니다. 주말에 추가 입금액을 확인하려고 AI가 운영 계좌를 직접 조회하려다 권한 규칙에 막혔습니다. 그때 제가 “데몬이 토큰을 받을 때 매수 가능 금액을 로그로 남기면 되지 않아?”라고 제안했고, AI가 그 기능을 만들어 배포했습니다. AI가 모든 걸 하는 게 아니라, 막히면 사람이 방향을 바꿔 줍니다.

현재 진행 상황 (2026.10.31)

구분

수량

평균 단가

10/30 종가 대비

봇 이전 직접 매수

4주

98,249원

−7.6%

봇 3단계 (10/19)

3주

85,935원

+5.7%

봇 1단계 (10/30)

1주

90,505원

+0.3%

합계

8주

92,663원

−2.0%

봇이 산 4주만 보면 평균 87,078원, +4.3%입니다. 급락 한가운데에서 규칙대로 산 결과입니다. 아직 기간이 짧아서 의미를 크게 두지는 않습니다.

지금은 하락장, 1단계까지 산 상태입니다. 10/30 종가 90,800원이 120일 이동평균(112,898원)보다 한참 아래에 있습니다.

다음 매수 가격 은 2단계 85,964원(10/30 종가 대비 −5.3%), 3단계 76,412원(−15.8%)입니다. 금요일 미국장이 크게 빠졌으니, 월요일에 5.3% 넘게 하락하면 2단계 매수가 자동으로 나갑니다. 예측은 하지 않고 규칙대로 기다립니다.

앞으로 할 일 은 실제 재부팅 테스트, 맥으로 개발 환경 이전, 그리고 매달 쌓이는 현금이 규칙대로 쓰이는지 지켜보는 것입니다.

요즘은 스크리너에 걸리는 종목이 없을 때가 오히려 주식이 싸진 때 같다…