트레이딩봇 운영 일지 — 에너지·방산 섹터 동시 급락, 손절 4건
오늘 무슨 일이 있었나
장이 열리자마자 봇이 조용히 4건을 손절했다.
1
2
3
4
🔔 자동 청산 — LMT (long) 133주 | 손절 -3.72%
🔔 자동 청산 — USO (long) 88주 | 손절 -16.07%
🔔 자동 청산 — XLE (long) 206주 | 손절 -6.47%
🔔 자동 청산 — XOM (long) 152주 | 손절 -7.18%
결과:
| 항목 | 수치 |
|---|---|
| 총 자산 | $96,365 (₩144,190,321) |
| 일일 손익 | ▼ $6,749 (-6.55%) |
| 누적 손익 | ▼ $3,635 (-3.64%) |
| 잔여 매수여력 | $4,876 |
누적 기준으로 지금까지 흑자였는데, 오늘 하루에 적자 전환됐다.
패턴 분석: 에너지 + 방산이 동시에 빠졌다
이 포인트가 핵심이다.
보통 지정학적 리스크가 고조되면 방산주는 오른다. 긴장이 커질수록 군비 수요 기대감이 붙기 때문이다. 에너지도 분쟁 지역 공급 차질 우려로 함께 오르는 경우가 많다.
근데 오늘은 둘 다 내렸다.
| 종목 | 섹터 | 하락률 |
|---|---|---|
| USO | 원유 ETF | -16.07% |
| XOM | 에너지 | -7.18% |
| XLE | 에너지 섹터 ETF | -6.47% |
| LMT | 방산 | -3.72% |
트리거: 미-이란 2주 휴전 선언
오늘 결정적인 매크로 이벤트가 있었다. 미국과 이란 사이 2주간 휴전 선언이 나온 것이다.
봇이 포지션을 잡은 논리는 이랬다:
“중동 긴장 고조 → 공급 차질 우려 → 에너지 강세 / 군비 수요 기대 → 방산 강세”
근데 오늘 그 전제 자체가 뒤집혔다.
1
2
3
4
지정학 긴장 완화
→ 공급 차질 우려 해소 → 유가 하락 → USO, XOM, XLE ▼▼
→ 방산 수요 기대 감소 → LMT ▼
→ 안전자산 일부 유지 (완전 해소 아님) → GLD, TLT 소폭 ▲
봇의 테마 감지 로직은 리스크 고조 방향은 잘 잡는다. 키워드 기반으로 “iran”, “conflict”, “sanction” 등이 뜨면 에너지·방산 섹터로 워치리스트를 확장한다. 그런데 리스크 해소 방향은 감지하지 못한다. “ceasefire”, “truce”, “deal” 같은 완화 키워드에 대한 역방향 로직이 없었다.
결과적으로 봇은 “지정학 리스크” 테마로 포지션을 들고 있다가, 그 리스크가 완화되는 뉴스에 반대 방향으로 맞은 셈이다.
봇은 어떻게 반응했나
손절 로직은 작동했다
봇의 손절 기준은 단일 포지션 -4% 이내 도달 시 즉시 청산이다. USO는 -16%까지 갔는데, 이건 장 중 실시간 체결이 아니라 장 시작 시점에 갭 다운으로 이미 손절선을 넘어 있었던 것으로 보인다.
1
2
3
# 봇 손절 로직 (run.py 발췌)
if position_pnl_pct <= STOP_LOSS_THRESHOLD: # -4%
liquidate(symbol, reason="손절")
갭 다운 상황에서 -4% 기준이 -16%로 체결된 건 슬리피지다. 실전이었다면 더 심각했을 수 있다.
매수 신호는 나오지 않았다
장 시작 후 청산만 했고 신규 진입은 없었다. 조건은 두 가지:
buying_power >= 포지션크기 * 1.75(레버리지 여유)confidence >= 65%
청산 후 매수여력이 $4,876으로 줄어 신규 진입 조건 자체가 성립 안 됐다. 손실 확장을 막은 셈이다.
무엇이 문제였나
1. 섹터 집중 리스크
청산된 4개 종목이 전부 에너지 또는 방산이었다. 봇이 테마 감지로 워치리스트를 구성하다 보니, 특정 테마가 강하게 잡히면 해당 섹터에 포지션이 몰린다.
이건 테마 전략의 구조적 약점이다. 테마가 맞으면 집중 수익이 나지만, 방향이 틀리면 집중 손실이 나온다.
2. 갭 다운 대응 부재
장 중 -4% 손절은 정상 작동하지만, overnight 갭 다운은 막을 방법이 없다. 장이 열리기 전에 가격이 이미 손절선 아래로 내려가 있으면, 열리는 순간 시장가로 체결되고 그게 -16%일 수 있다.
해결책 후보:
- 포지션 크기 축소 (개당 총자산의 10% 이하)
- 야간 포지션 보유 시 별도 리스크 한도 적용
- VIX 임계치 이상이면 포지션 전량 현금화 후 관망
3. 일손실 한도가 걸리지 않았다
봇에 일손실 한도 -15% 설정이 있다. 오늘 -6.55%에서 멈췄으니 한도 내이긴 한데, 만약 포지션이 더 많았다면 -15%까지 갔을 수 있다. 일손실 한도를 더 보수적으로 줄이는 걸 고려해야 한다.
살아남은 포지션은 어떻게 됐나
손절 후 남은 포지션:
| 종목 | 수량 | 평가액 | 오늘 손익 |
|---|---|---|---|
| GD | 35주 | $12,121 | ▼0.86% |
| GLD | 28주 | $12,309 | ▲2.51% |
| NOC | 18주 | $12,148 | ▼2.84% |
| RTX | 63주 | $12,575 | ▲1.49% |
| TLT | 144주 | $12,558 | ▲1.17% |
GLD(금) +2.51%, TLT(장기국채) +1.17% — 위기 국면에서 전형적인 안전자산 강세다. 방향이 맞게 잡혀 있었다.
RTX가 오른 것도 흥미롭다. LMT는 -3.72%인데 RTX는 +1.49%. 같은 방산이지만 종목별로 분화가 일어났다. 이런 디테일은 ETF로는 잡기 어렵고, 개별 종목 접근이 효과가 있는 부분이다.
다음에는 어떻게 할까
지금 당장 코드를 건드리기보다는 데이터를 더 모으는 게 맞다고 판단했다. 페이퍼 트레이딩이니까 이런 사태가 나는 게 오히려 좋은 케이스스터디다.
정리해둘 개선 포인트:
- 포지션당 총자산 비중 상한 (현재 ~12% → 8~10%로 낮추기)
- 섹터 집중도 상한 (동일 섹터 최대 30%까지만)
- 일손실 한도 강화 (-15% → -8~10%)
- VIX 스파이크 감지 → 신규 진입 금지 모드
- 포지션 없는 종목 SELL 시도 → 422 오류 방지 (포지션 재조회 후 없으면 HOLD 처리)
- 동일 종목 재진입 쿨다운 30분 (
.trade_cooldown.json파일 기반) - 청산 후 포지션 재조회 (stale data 방지)
- 리스크 완화 키워드 감지 (“ceasefire”, “truce”, “deal”, “agreement”) → 지정학 테마 포지션 축소 or 청산 트리거
당일 핫픽스: 포지션 없는 종목 매도 오류
오늘 장 마감 전에 추가 버그가 발견됐다. USO를 매도한 직후 봇이 같은 종목을 다시 매도 시도 → 422 에러 반복.
원인:
- 청산 직후 포지션 캐시가 stale 상태였음 (재조회 없이 이전 목록 그대로 사용)
- 동일 종목 30분 내 재진입 쿨다운 로직 없음 → 매 15분마다 사고팔기 반복
핫픽스로 두 가지 추가했다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 매도 전 포지션 실시간 재조회
positions = alpaca_get("https://paper-api.alpaca.markets/v2/positions")
pos_map = {p["symbol"]: p for p in positions}
if signal == "SELL":
if ticker in pos_map and pos_map[ticker]["side"] == "long":
qty = abs(int(float(pos_map[ticker]["qty"])))
else:
# 포지션 없으면 HOLD (422 방지)
signal = "HOLD"
# 2. 쿨다운 체크 (30분)
if is_in_cooldown(ticker):
signal = "HOLD" # 재진입 차단
else:
set_cooldown(ticker) # 거래 후 쿨다운 등록
쿨다운은 .trade_cooldown.json 파일에 타임스탬프를 기록하는 방식이라 재시작해도 유지된다.
오늘 하루에 USO만 매수→매도→매수→매도를 4번 반복했는데, 실전이었다면 수수료만 상당했을 것이다.
마치며
봇이 손절 잘 해줬다 — 고 할 수도 있는데, 솔직히 말하면 아쉬운 부분이 더 많다. 갭 다운은 어쩔 수 없다지만, 섹터 집중도 관리와 포지션 상태 추적은 내가 코드로 제어할 수 있는 영역이었다.
“테마 감지 → 섹터 집중 진입”이 잘 될 때는 효과적인 전략이지만, 이번처럼 매크로가 뒤집어지면 그게 그대로 약점이 된다. 다음 개선 버전에서는 진입은 과감하게, 노출은 분산되게 가져가는 방향으로 조정해볼 생각이다.
페이퍼 트레이딩 기록입니다. 투자 권유 아닙니다.