AI가 내 돈을 굴린다 — 밀리 트레이딩봇 구축기
시작은 이런 질문이었다
“AI가 주식을 판단하면 어떨까?”
단순한 호기심이었다. 근데 하다 보니 어느 순간 8개 서비스가 유기적으로 연결되어 실제로 페이퍼 트레이딩을 돌리고 있었다.
이 글은 그 구축 과정과, AI에게 투자 판단을 맡기면 어떻게 되는지에 대한 기록이다.
전체 아키텍처
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NewsAPI (뉴스 30개)
│
▼
Alpaca API ──── 계좌/포지션/SPY가격
│
▼
n8n (Docker, 15분 스케줄)
│
▼
Claude (Anthropic) ← OpenClaw 통해 판단 위임
│
├── BUY → Alpaca 주문 (bracket order + stop-loss)
└── HOLD → 패스
│
▼
Telegram 보고
│
▼
Cloudflare → blog.rootshift.dev 결과 업데이트
총 연계 서비스: n8n, Docker, Alpaca, NewsAPI, Anthropic(Claude), Telegram, Cloudflare, OpenClaw
각 레이어 역할
1. n8n (Docker) — 자동화 엔진
윈도우 데스크탑에서 Docker로 실행 중인 n8n이 전체 오케스트레이션을 담당한다.
1
2
3
4
5
6
7
8
docker run -d \
--name n8n \
--restart always \
-p 5678:5678 \
-e N8N_HOST="n8n.example.com" \
-e N8N_PROTOCOL=https \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
15분마다 스케줄이 트리거되면 아래 순서로 실행된다:
1
계좌 조회 → 포지션 조회 → SPY 현재가 → 뉴스 수집 → Claude 판단 → 주문/보고
스케줄은 미국 장 시간(KST 22:00~05:00, 월~금)에만 동작하도록 제한했다:
1
*/15 22,23,0,1,2,3,4 * * 1-5
2. Alpaca — 브로커 API
페이퍼 트레이딩 계좌로 실제 시장 환경에서 가상 매매를 한다. REST API로 주문/포지션/계좌 정보를 주고받는다.
손절 자동화를 위해 bracket order를 사용한다. 매수와 동시에 stop-loss가 설정된다:
1
2
3
4
5
6
7
8
9
10
11
{
"symbol": "AAPL",
"qty": "3",
"side": "buy",
"type": "market",
"time_in_force": "day",
"order_class": "bracket",
"stop_loss": {
"stop_price": "190.00"
}
}
진입가 대비 -5% 에 stop-loss가 걸린다. 손절은 자동이다.
3. NewsAPI — 정보 수집
미국 주식 시장 관련 뉴스 30개를 실시간으로 수집한다.
1
2
q=stock+market+OR+S&P500+OR+nasdaq+OR+trading
language=en&sortBy=publishedAt&pageSize=30
4. Claude (Anthropic) — 판단 주체
여기가 핵심이다. Claude한테 단순히 뉴스 감성 분석을 시키는 게 아니라, 전체 컨텍스트를 넘기고 종합 판단을 맡긴다.
Claude에게 넘기는 정보:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
=== 계좌 현황 ===
총 자산: $100,236
현금: $88,807
총 손익: +$236 (+0.24%)
일일 손실 한도 도달: 아니오
=== 현재 포지션 ===
MU 26주(long) | 매입$437.50 현재$435.01 | 손익$-64.85(-0.57%)
=== 시장 지표 ===
SPY 현재가: $652.13
=== 최근 뉴스 (30개) ===
- 중동 긴장 고조로 유가 급등...
- 나스닥 1% 하락...
(30개)
=== 투자 규칙 ===
- 1회 최대 투자: 총 자산의 5%
- 손절선: -5% (bracket order)
- 일일 손실 한도: -20%
- 숏 포지션 금지
- confidence 70% 미만이면 HOLD
Claude가 반환하는 형식:
1
2
3
4
5
6
7
8
{
"signal": "HOLD",
"ticker": "MU",
"confidence": 42,
"reason": "중동 긴장 고조로 유가 $119 급등, 인플레이션 재점화 우려. 나스닥 1% 하락 등 기술주 하방 압력 강함.",
"market_sentiment": "부정",
"risk_note": "지정학적 불확실성 해소 전 추가 매수 부적절"
}
5. OpenClaw — AI 레이어 통합
Claude를 단순 API 호출로 쓰는 게 아니라, OpenClaw를 통해 더 풍부한 컨텍스트와 판단 능력을 활용한다. 워크플로우 디버깅, 로직 수정, 포지션 분석까지 실시간으로 개입할 수 있다.
오늘도 숏 포지션이 잘못 잡혔을 때 즉시 청산하고, 워크플로우를 전면 개편했다. 모두 텔레그램으로 지시하고 맥북에서 실행됐다.
6. Telegram — 인터페이스
15분마다 판단 결과가 텔레그램으로 온다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
🤖 밀리 트레이딩 판단
📊 시장: 부정
⏸ 신호: HOLD
🎯 신뢰도: 42%
📝 판단 근거:
중동 긴장 고조로 유가 $119 급등...
━━━━━━━━━━━━━━━
💼 계좌 현황
총 자산: $100,116
총 손익: +$116 (+0.12%)
📈 보유 포지션
MU 26주 | 매입$437.50 현재$435.01 | 손익$-64.85
투자 규칙 설계
감정 없는 AI도 규칙이 없으면 위험하다. 아래 파라미터를 명시적으로 시스템 프롬프트에 넣었다.
| 규칙 | 값 |
|---|---|
| 원금 | $1,000 (페이퍼는 $100,000) |
| 1회 최대 투자 | 총 자산의 5% |
| 손절선 | 진입가 -5% (자동) |
| 일일 손실 한도 | -20% 도달 시 거래 중단 |
| 숏 포지션 | 금지 |
| 최소 신뢰도 | 70% 미만이면 HOLD |
초반에 숏 포지션이 잡혀버리는 문제가 있었다. SELL 신호를 받았을 때 보유 포지션 없이 숏을 쳐버린 것. 규칙에 “숏 금지”를 명시하고 로직도 수정해서 해결했다.
실제 첫 판단 결과
2026-03-20 23:19 (KST)
1
2
3
시장: 부정
신호: HOLD (confidence 42%)
근거: 중동 긴장 고조, 유가 급등, 나스닥 하락
42%는 기준치 70%에 한참 못 미쳐서 HOLD. 당연한 판단이다.
앞으로
이 섹션은 매일 미국 장 마감(KST 05:00~06:00) 후 업데이트 예정이다.
📊 트레이딩 결과 로그
2026년 3월
| 날짜 | 시작 자산 | 종료 자산 | 손익 | 거래 종목 | 비고 |
|---|---|---|---|---|---|
| 03-20 | $100,000 | $100,116 | +$116 (+0.12%) | MU 26주 | 페이퍼 시작 |
페이퍼 트레이딩입니다. 실제 투자 권유가 아닙니다. AI 판단에는 오류가 있을 수 있으며, 모든 투자 결정의 책임은 본인에게 있습니다.