
그중 2개가 천연가스 자동매매 봇입니다. 하나는 심플하게, 하나는 복잡하게 만들었는데 — 둘 다 지금은 수익 중이에요.
이 글은 그 두 봇을 만들면서 겪은 이야기입니다. 특히 처음 만든 킬존 봇(천연가스1)이 꽤 잘 돌고 있거든요.
왜 하필 천연가스였나
주식 자동매매를 처음 시작할 때 "어떤 종목으로 할까"를 한참 고민했어요. 단순히 변동성이 큰 게 좋다는 게 아니라, 구조적으로 유리한 쪽이 있지 않을까 싶었거든요.
그러다 천연가스 선물에서 콘탱고(Contango)라는 구조를 발견했어요. 콘탱고란 가까운 달 선물보다 먼 달 선물 가격이 더 비싼 상태예요. 이런 환경에서 인버스 ETF인 KOLD(천연가스 가격 하락에 베팅)는 시간이 지날수록 이론상 구조적 이득이 생겨요. 쉽게 말하면, "NG 가격이 제자리여도 KOLD는 조금씩 오른다"는 논리죠.
게다가 미국 에너지정보청(EIA)이 매주 목요일 재고 데이터를 공개해줘요. 데이터가 규칙적으로 나온다는 건, AI로 예측을 만들기 좋다는 뜻이기도 했어요. 그래서 시작했습니다.
* 사실 BOIL도 같이 세팅했는데, 구조상 KOLD 투자 비중이 월등히 높더라구요.
첫 번째 봇 — 킬존 전략 (천연가스1)
처음 만든 봇은 의외로 심플해요. 복잡한 AI 없이, 고전적인 기술 지표 몇 개로만 돌아갑니다. 핵심 아이디어는 '킬존(Kill Zone)' — 볼린저밴드 상단을 이탈하거나 MA5 대비 3% 이상 과열됐을 때만 진입하는 방식이에요.
| 지표 | 역할 |
|---|---|
| MA5 (5일 이동평균) | 기준선 — 현재 가격이 MA5 대비 ±3% 구간인지 판단 |
| 볼린저밴드 (20일/2σ) | 밴드 이탈 여부로 과열·과냉 판단 |
| RSI (14일) | 35 이하면 BOIL 진입 조건 확인 |
| MACD | 모멘텀 방향 보조 확인 |
진입하면 가용 자금의 50% 먼저 분할 매수, 이후 신호 유지되면 나머지 100% 추가 매수해요. 익절 기준은 +5% 도달 시 절반 익절 → 나머지는 트레일링스탑으로 수익을 보호하는 구조입니다. 스탑로스는 -5%로 설정해서 크게 물리지 않게 관리해요.
5/4~5/7: KOLD 매수 → +5% 목표가 이상 달성 2회 연속 익절 ✅
5/12~5/13: KOLD 매수 → +5% 목표가 이상 달성 2회 연속 익절 ✅
6/5: KOLD 매수 → +5% 절반 익절 ✅
6/9: 트레일링스탑 수익청산 ✅ (오늘도 수익)
물론 손절도 있어요. 5/19, 5/28, 5/29, 6/5에 -5% 스탑로스가 걸렸거든요. 그래도 전체적으로는 수익이 손실을 앞서고 있어요. 이 봇이 지금 제일 잘 돌아가고 있는 애입니다.
두 번째 봇 — AI 감독 시스템 (천연가스2, v9.14)
첫 봇이 잘 돌아가는 걸 보고 "더 정교하게 만들면 더 잘 되겠지"라는 생각이 들었어요. 그래서 두 번째 봇은 훨씬 복잡하게 만들었습니다.
| 역할 | 기술 |
|---|---|
| 실행기 (30초 루프) | Python 3.12 + FastAPI + APScheduler |
| 주문 실행 | 한국투자증권 KIS OpenAPI |
| 시장 데이터 | EIA API (주간 재고·LNG·HDD), yfinance, NOAA 기상 예보 |
| AI 감독자 (1시간 주기) | Claude API — 파라미터 자동 조정, 신뢰도 80% 이상 시 반영 |
| 알림 | 텔레그램 봇 (체결·손절·이상 신호) |
7개 기술 지표가 각자 투표를 하고, EIA 재고 데이터·계절성·NOAA 기상 예보·선물 콘탱고율까지 합산해서 매매 결정을 내리는 구조예요. 게다가 매 1시간마다 Claude AI가 현재 성과를 보고 파라미터를 자동으로 조정합니다. AI가 AI를 감독하는 셈이죠.
final_score = 기술지표 × 가중치 + EIA 펀더멘털 조정 + 계절성 편향 + NOAA 기상 편향 + 감성 점수그런데 이 복잡함이 오히려 발목을 잡았어요. v9.0부터 v9.14까지, 14번의 패치를 거쳐야 했거든요.
14번의 수술 — 버그와의 전쟁
코드는 처음 96KB에서 v9.14 기준 111KB, 약 2,200라인까지 불어났어요. 아래는 주요 버전별 변화입니다.
| 버전 | 주요 변화 |
|---|---|
| v9.0~9.2 | Windows → Mac 이전, 선물 M1/M2 데이터 저장 버그 수정 |
| v9.3 | 진입 조건 3표로 강화, 거래 비용 22% 절감 |
| v9.4~9.6 | 펀더멘털 단독 진입 추가, 동적 포지션 사이징 도입 |
| v9.7~9.9 | avg_loss 26% 발견 후 안전장치 강화, 매매 빈도 억제 |
| v9.10 | 치명적 버그 수정 — SL 저장만 되고 미작동 (avg_loss 15.76% 원인) |
| v9.11~9.13 | 추세역행 차단, 로그 영속화 도입 (RotatingFileHandler) |
| v9.14 | 진입가 기록 오류 수정, 유실된 미체결 주문 함수 복원 |
이 과정에서 특히 뼈아팠던 버그 두 가지만 짚어볼게요.
진입할 때 포지션에
sl_pct = 1%를 기록해놓고, 청산 로직에서는 글로벌 설정 8%를 그대로 쓰고 있었어요. 의도한 1% 손절이 완전히 무효화된 채로 돌아가고 있었던 거예요. 이 버그 하나가 건당 평균 손실 15.76%를 만들어냈습니다.즉시 체결을 유도하려고 2.5% 높은 가격으로 지정가 주문을 넣는데, 봇은 그 주문가를 진입가로 기록했어요. 결과: 진입 직후부터 PnL = -2.44%, 손절까지 여유 0.06%. "사자마자 손절"이 하루 4번 반복된 원인이었습니다.
이 두 버그를 잡고 나서야 비로소 안정적인 구동이 가능해졌어요. 지금은 수익 중입니다.
현재 상황 — 봇 3개, 천연가스 2개
지금 이 순간 제 맥 미니에선 봇 3개가 동시에 돌아가고 있어요. 그중 2개가 오늘 얘기한 천연가스 봇들입니다. 두 봇 모두 현재 수익 중이에요.
| 봇 | 전략 | 현재 상태 |
|---|---|---|
| 천연가스1 | 킬존 전략 (MA5/BB/RSI) | 수익 중 ✅ (오늘도 익절) |
| 천연가스2 | AI 감독 + 7지표 + EIA 데이터 | 수익 중 ✅ (v9.14 안정화) |
| 레몬봇(+유가) | 별도 전략 | 구동 중 |
재미있는 건 더 단순하게 만든 봇(천연가스1)이 더 잘 돌아가고 있다는 거예요. 복잡한 버전은 버그 수정에 수개월을 쏟아부어야 했는데, 킬존 봇은 처음 설계대로 꽤 안정적으로 익절을 뽑아내고 있거든요.
• 한국투자증권 KIS OpenAPI — 해외주식 주문 실행
• EIA Open Data API — 미국 천연가스 주간 재고 데이터
• Anthropic Claude API — AI 감독자 역할 (천연가스2)
• FastAPI + APScheduler + pm2 — 서버 구조 및 스케줄링
• 텔레그램 봇 — 체결·손절 실시간 알림
다음엔 KIS API 연동 방법이나 EIA 데이터 파싱 코드를 구체적으로 써볼게요. 자동매매 봇을 만들면서 어떤 코드가 어디서 돈을 먹었는지도요. 관련 글 참고:
단순하게 만든 게 먼저 수익이 났고, 복잡하게 만든 건 14번의 패치를 거치고 나서야 따라왔어요. "더 많은 데이터, 더 정교한 AI"가 항상 더 좋은 결과를 보장하지는 않는다는 걸 직접 체감했습니다.
그래도 지금은 둘 다 돌고 있고, 둘 다 수익 중이에요. 오늘도 봇이 알아서 익절하고 있는 동안 저는 이 글을 쓰고 있었습니다.
'Ai 취미생활 > 시행착오' 카테고리의 다른 글
| 애드고시 3번 떨어진 실패기 — 구글 애드센스 수익화, 쉽지 않네 (24) | 2026.07.08 |
|---|---|
| Claude Fable 5 vs Opus 실사용 비교 — 24번 실패한 버그의 결말 (2) | 2026.06.11 |
| 무료 로컬 AI(Ollama)로 24시간 미국 증시 시황 알림 봇 만들기 (2) | 2026.06.09 |
| 24만원으로 굴린 비트코인 자동매매 봇, 한 달간 13번 갈아엎은 기록 — 레모니 봇 개발기 (3) | 2026.06.08 |
| 클로드 코드로 티스토리 스킨 만들기 — 구글 애드센스 EEAT 정책까지 챙기는 법 (0) | 2026.05.31 |