LLM 트레이더 봇 (LLM TRADER BOT)
요약
LLM을 활용한 트레이딩 봇 개발 과정에서의 실패와 극복 사례를 다룹니다. 단순 수치 입력 방식에서 벗어나 Gemini 1.5 Flash의 시각적 추론 능력을 활용해 차트 패턴을 직접 분석하는 시스템을 구축했습니다.
핵심 포인트
- 단순 수치 기반 프롬프팅의 한계와 실패 경험
- Gemini 1.5 Flash를 활용한 차트 이미지 시각적 추론 도입
- 패턴 감지 알고리즘 대신 AI의 시각적 판독 능력 활용
- 직접 구축한 지표 엔진과 연구 논문 기반의 접근 방식
실패에 관한 이야기를 하나 해드리겠습니다.
2024년 말. 저는 8시간의 창고 교대 근무를 마치고 브로츠와프(Wrocław)에 있는 제 아파트에 앉아 있습니다. 허리가 아픕니다. 저는 2주 동안 트레이딩 봇(trading bot)을 작동시키기 위해 노력해 왔습니다. 매일 밤, 결과는 같았습니다. LLM은 듣기 좋은 분석을 생성합니다. 자신감 넘치고, 조리 있으며, 완전히 틀렸습니다.
"RSI는 28이며, 과매도 상태입니다. 매수(BUY)."
다음 날 아침: -4.2%.
문제는 LLM이 멍청해서가 아니었습니다. 제가 게을렀던 것이 문제였습니다. 저는 프롬프트(prompt)에 숫자들을 쏟아붓고 마법이 일어나기를 바라고 있었습니다. 이는 유튜브의 모든 "LLM 트레이딩 봇" 튜토리얼이 당신에게 하라고 말하는 바로 그 방식이었습니다.
저에게는 세 가지 선택지가 있었습니다. 포기하거나, 강의를 사거나, 아니면 아무도 하지 않는 일 — 즉, 실제 연구 논문(research papers)을 읽는 것이었습니다. 저는 세 번째 옵션을 선택했습니다. 77편의 논문을 읽은 후, 저는 진짜 문제를 이해하게 되었습니다. 그리고 그것을 해결하는 무언가를 만들었습니다.
1. 차트 비전 (Chart Vision) — LLM이 캔들스틱 이미지를 읽다
매 사이클마다, 봇은 5개의 오버레이 지표(SMA, RSI, Volume, CMF, OBV)가 포함된 4K PNG 캔들스틱 차트를 생성합니다. 이 이미지는 Google Gemini 3.6 Flash로 직접 전달됩니다. 바이트(bytes) 형태도 아니고, 데이터 URL(data URL) 형태도 아닙니다. 시각적 추론(visual inference)으로서 전달됩니다.
저는 헤드 앤 숄더(head and shoulders), 웨지(wedges), 추세선(trendlines)과 같은 패턴 감지 알고리즘을 코딩하는 데 2주를 보냈습니다. 그런 다음 AI의 시각적 판독 결과와 제 코드를 비교했습니다. AI가 더 뛰어났습니다. 훨씬 더요. 저는 패턴 감지 코드 900줄을 삭제했습니다. 그리고 다시는 돌아보지 않았습니다.
2. 50개 이상의 지표, 로컬에서 JIT 컴파일
pandas-ta도, TA-Lib도 사용하지 않았습니다. 저는 지표 엔진 전체를 처음부터 직접 구축했습니다. 실패에 관한 이야기를 하나 해드리겠습니다.
2024년 말. 저는 8시간의 창고 교대 근무를 마치고 브로츠와프(Wrocław)에 있는 제 아파트에 앉아 있습니다. 허리가 아픕니다. 저는 2주 동안 트레이딩 봇(trading bot)을 작동시키기 위해 노력해 왔습니다. 매일 밤, 결과는 같았습니다. LLM은 듣기 좋은 분석을 생성합니다. 자신감 넘치고, 조리 있으며, 완전히 틀렸습니다.
"RSI는 28이며, 과매도 상태입니다. 매수(BUY)."
다음 날 아침: -4.2%.
문제는 LLM이 멍청해서가 아니었습니다. 제가 게을렀던 것이 문제였습니다. 저는 프롬프트(prompt)에 숫자들을 쏟아붓고 마법이 일어나기를 바라고 있었습니다. 이는 유튜브의 모든 "LLM 트레이딩 봇" 튜토리얼이 당신에게 하라고 말하는 바로 그 방식이었습니다.
제게는 세 가지 선택지가 있었습니다. 포기하거나, 강의를 사거나, 아니면 아무도 하지 않는 방식인 실제 연구 논문(research papers)을 읽는 것이었습니다. 저는 세 번째 옵션을 선택했습니다. 77편의 논문을 읽고 난 후, 저는 진짜 문제가 무엇인지 이해하게 되었습니다. 그리고 그 문제를 해결하는 무언가를 만들어냈습니다.
1. 차트 비전 (Chart Vision) — LLM이 캔들스틱 이미지를 읽다
매 사이클마다, 봇은 5개의 오버레이 지표(SMA, RSI, Volume, CMF, OBV)가 포함된 4K PNG 캔들스틱 차트를 생성합니다. 이 이미지는 Google Gemini 1.5 Flash로 직접 전달됩니다. 바이트(bytes) 형태도, 데이터 URL 형태도 아닙니다. 시각적 추론(visual inference)으로서 전달됩니다.
저는 헤드 앤 숄더(head and shoulders), 웨지(wedges), 추세선(trendlines)과 같은 패턴 감지 알고리즘을 코딩하는 데 2주를 보냈습니다. 그러고 나서 AI의 시각적 판독 결과와 제가 작성한 코드를 비교했습니다. AI가 훨씬 더 뛰어났습니다. 압도적이었습니다. 저는 패턴 감지 코드 900줄을 삭제했습니다. 그리고 다시는 뒤돌아보지 않았습니다.
2. 50개 이상의 지표, 로컬에서 JIT 컴파일
pandas-ta도, TA-Lib도 사용하지 않았습니다. 저는 NumPy와 Numba를 사용하여 지표 엔진 전체를 처음부터 구축했습니다. 모든 EMA, SMA, MACD, ADX, Stochastic, Bollinger Band, TTM Squeeze, Ichimoku, 그리고 11가지 이동 평균(moving average) 변형 모델은 첫 호출 시 머신 코드(machine code)로 컴파일되며 그 결과를 캐시(cache)합니다.
@njit(cache=True)
def _ema_numba(prices, period):
alpha = 2.0 / (period + 1)
...
50개의 지표. 모두 커스텀이며, 모두 JIT 컴파일(JIT-compiled)되었습니다. 모두 CPU에서 마이크로초 단위로 실행됩니다. CUDA도, 클라우드도 필요 없습니다. 그저 제 책상 위에 있는 Ryzen 5700G 하나면 충분합니다.
3. 강세 vs 약세 토론 — 하나의 프롬프트, 두 가지 관점
TradingAgents는 강세(bull) 분석과 약세(bear) 분석을 위해 별도의 에이전트를 생성합니다. 똑똑한 방식이지만, 각각 API 호출 비용이 발생합니다. 제 봇은 LLM에 단 하나의 지침을 내립니다. 먼저 강세론을 (근거와 함께) 논증하고, 그다음 약세론을 (동일한 엄격함으로) 논증하라는 것입니다. 그러고 나서 결정합니다.
하나의 프롬프트로 두 가지 관점을 모두 다룹니다. 추가 토큰 소모는 제로입니다. 모델은 두 논거를 컨텍스트(context) 내에 동시에 유지하므로, 중간에 반대 논거를 "잊어버리는" 일이 발생할 수 없습니다.
4. EV 프레임워크 — Optiver가 LLM은 할 수 없다고 말한 것
Optiver는 LLM이 기대 가치(expected value)를 설명할 수는 있지만, 이를 실행할 수는 없다는 것을 발견했습니다. 저의 EV 프레임워크는 다음을 계산합니다:
- 현재 셋업(setup)과의 유사성으로 필터링된 거래 이력 기반의 승률 (Win rate)
- 평균 수익 크기 (Average win size) 대비 평균 손실 크기 (Average loss size)
- 기대 손익 (Expected P&L) = (승률 × 평균 수익) - ((1 - 승률) × 평균 손실)
- 계좌 자산 (Account equity) 기반의 켈리 비율 (Kelly fraction) 사이징
- 신호 수락 전 리스크 대비 보상 (Risk/reward) 검증
LLM은 추론(reasoning)을 제공합니다. EV 프레임워크는 수학적 계산을 제공합니다. 만약 LLM이 "강력 매수"라고 말하더라도 EV가 음수라면 — 관망 (HOLD).
5. 반증 검사 (Falsification Check) — 당신이 틀렸음을 증명하는 가격을 명시하라
어떠한 신호도 수락되기 전에, LLM은 반드시 다음 한 문장을 작성해야 합니다:
"만약 [특정 가격 수준 또는 지표 조건]이 발생한다면, 이 신호는 틀린 것으로 판명될 것이다."
만약 이를 명시하지 못한다면 — 거절됩니다. 명시된 조건이 트리거되면 — 포지션을 조기에 종료합니다. 조건이 모호하다면 — 거절되며, 다시 시도해야 합니다. 이 단 하나의 프롬프트 추가가 그 어떤 변화보다 신호의 품질을 더 많이 향상시켰습니다.
6. 벡터 메모리 (Vector Memory) — 봇은 자신의 실수를 기억한다
종료된 모든 거래는 15개 이상의 메타데이터 필드를 가진 벡터(vector)로 임베딩(embedded)됩니다: 심볼(symbol), 방향(direction), 진입 가격(entry price), 청산 가격(exit price), 손익률(P&L percentage), 최대 역행폭(max adverse excursion), 타임프레임(timeframe), 진입 시 ADX, 추세 강도(trend strength), RSI, 거래량 추세(volume trend), 감지된 패턴(pattern detected), 뉴스 감성 점수(news sentiment score), 서프라이즈 비율(surprise ratio), 그리고 종료 타임스탬프(closed timestamp).
매 새로운 분석 사이클마다, 봇은 ChromaDB(현재 BAAI/bge-base-en-v1.5 768D 임베딩 사용)에 다음과 같이 쿼리합니다: "현재 셋업과 가장 유사한 거래 5개를 찾아줘." 이 5개의 거래 결과와 함께 LLM 프롬프트에 주입됩니다. 시간 경과에 따른 감쇠(Time-decay)를 통해 최근 거래가 오래된 거래보다 3배 더 높은 가중치를 갖도록 보장합니다.
7. 코드베이스를 유지 관리하는 8개의 AI 에이전트
.ai/ 디렉토리에는 한 명의 관리자(Supervisor)와 7명의 작업자(workers)로 구성된 8개의 특화된 에이전트 프롬프트가 있습니다. 각 에이전트는 전담 범위(scope), 저널(journal), 그리고 페르소나(personality)를 가집니다. 이들은 실제 커밋(commit)을 생성해냈습니다:
- Supervisor — 작업 경로 지정(Routes work), 벡터 검색(vector search)을 통한 코드베이스 스캔
- Bolt — 성능: 비동기 루프(async loop) 내의 동기 파일 읽기 발견 (40ms 수정)
- Palette — UX: ARIA 레이블, 토스트 알림(toast notifications), 접이식 패널(collapsible panels)
- Sentinel — 보안: 속도 제한(rate limiting), CSP 헤더, API 키 격리(isolation)
- Refactor — 클린 코드: 27개의 isinstance 체인 제거, 의존성 주입(DI) 패턴 강제
- Concise — 코드 감소: 프롬프트 빌더(prompt builder) 전반에 걸쳐 380라인 절감
- Bugfixer — 회귀(Regressions):
main에 반영되기 전 3개의 버그 포착 - Smoke Tests — 사전 점검(Pre-flight): 모든 커밋 전 구문(syntax), 임포트(import) 스캔, ruff 린트(lint) 수행
에이전트 시스템 도입 이후 133개의 커밋이 발생했습니다. 모든 커밋은 테스트되었으며, 모두 문서화되었습니다.
8. 검증 파이프라인 (Validation Pipeline) — 가공되지 않은 LLM 출력물을 신뢰하지 마십시오
모든 AI 응답은 다음 과정을 거칩니다:
- TrendValidator — LLM이 보고한 추세(trend)를 실제 ADX 계산값과 교차 검증
- PatternQualityScorer — 자기 보고(self-reporting)가 아닌 실제 탐지 결과로부터 도출된 결정론적(deterministic) 점수
- Falsification Check — 실패 조건(failure condition)을 명시할 수 없는 신호는 거부
- 6 Risk Guards — 심볼 화이트리스트(symbol whitelist), 최대 포지션(max position), 쿨다운(cooldown), 최소 손익비(min R:R), SL/TP 유효성
9. 제로 비용 센티먼트 (Zero-Cost Sentiment) — API 키 불필요
Reddit JSON (무료, 인증 불필요), Nitter를 통한 X/Twitter (공개 피드), CoinDesk, CoinTelegraph, Decrypt, CryptoSlate의 RSS — Crawl4AI를 통해 데이터를 보강합니다. 모든 데이터는 ChromaDB 기반으로 구축된 RAG 엔진을 통해 처리됩니다. 월간 비용이 발생하지 않으며, API 속도 제한(rate limits)도 없습니다.
테스트 스위트 (The Test Suite)
1,324개의 테스트. 완전히 모킹(mocked)되었습니다 — 네트워크, ChromaDB, LLM API를 사용하지 않습니다. 어떤 머신에서도 약 60초 내에 실행됩니다. 자동화된 품질 게이트(quality gates)를 위해 Codacy CLI v2 + ruff를 사용합니다. 의미론적 탐색(semantic navigation)을 위해 AST 기반의 코드베이스 벡터 검색을 활용합니다.
커버리지 범위에는 LLM 출력 오염(corruption), 비동기 레이스 컨디션(async race conditions), 지수 백오프(exponential backoff)를 적용한 속도 제한, 벡터 DB 경계, 6가지 가드 유형 모두에 대한 마찰 보고(friction reporting), 폐쇄 루프 피드백 주입(closed-loop feedback injection), 네트워크 타임아웃 처리를 포함한 티커 재시도(ticker retry)가 포함됩니다.
Optiver가 LLM이 "행동한 후 새로운 정보를 통합하는 데 실패한다"라고 말할 때, 저의 테스트는 봇이 그렇지 않음을 검증합니다. arXiv 서베이에서 재현성 (reproducibility)이 병목 현상이라고 말할 때, 저의 테스트는 결정론적 (deterministic)입니다.
☕ 이 프로젝트는 100% 자비로 운영됩니다. 기업도, 투자자도 없습니다. 그저 서버와 API 키 비용을 지불하는 창고 노동자일 뿐입니다. 이 프로젝트가 아이디어를 제공했거나 시간을 절약해 주었다면 — Buy Me a Coffee를 통해 프로젝트 운영을 도와주세요. qrak.org에서 더 많은 무료 콘텐츠를 확인하실 수 있습니다 (AdSense 지원 — 모든 방문이 도움이 됩니다).
비용 (What It Costs)
- Google Gemini 3.6 Flash: 무료 티어 (free tier) (일일 1,500회 요청)
- 기술적 지표 (Technical indicators): CPU 전용 (Numba JIT, 마이크로초 단위)
- 뉴스 + 감성 분석 (News + Sentiment): 무료 (Reddit JSON, Nitter, RSS + Crawl4AI 강화)
- 벡터 데이터베이스 (Vector database): 로컬 ChromaDB, BAAI/bge-base-en-v1.5 768D 임베딩 (embeddings)
- 호스팅 (Hosting): 홈 서버 (Ryzen 5700G, 32 GB RAM)
- 대시보드 (Dashboard): Cloudflare Tunnel (무료 티어)
월간 비용: 0 zł. "거의 무료"가 아닙니다. 진짜 무료입니다.
빠른 시작 (Quick Start)
git clone https://github.com/qrak/LLM_trader.git
cd LLM_trader
python -m venv .venv
...
대시보드는 localhost:8000에서 확인 가능합니다. Windows 사용자는 scripts/experimental_branch.ps1을 사용하세요.
솔직한 한계 (Honest Limitations)
이 봇이 "인" 것:
- 연구 등급의 오픈 소스 (open-source) LLM 트레이딩 엔진
- 페이퍼 트레이딩 (Paper trading) 전용 (실제 실행은 별도의 CCXT 서비스를 통해 수행)
- 완전한 투명성 — 모든 프롬프트 (prompt), 응답 (response), 거래 로그 (trade log)를 검사할 수 있음
- 성찰 엔진 (reflection engine)을 통한 자기 개선
이 봇이 "아닌" 것:
- 일확천금을 노리는 수법
- 프로덕션 트레이딩 시스템 (production trading system) (아직은 아님)
- 광범위한 테스트 없이 실제 돈을 맡겨야 할 대상
링크 (Links)
- Source: github.com/qrak/LLM_trader
- Live Dashboard: semanticsignal.qrak.org
- Landing Page: qrak.org
- Buy Me a Coffee: buymeacoffee.com/qrak
- Email: contact@qrak.org
폴란드 브로츠와프(Wrocław)에서 제작되었습니다. 학위도, 부트캠프도 없었습니다. 오직 Python, asyncio, 그리고 창고 교대 근무 후의 수천 시간뿐이었습니다.
☕ 후원 (Support): buymeacoffee.com/qrak — 커피 한 잔마다 실제 API 호출이 이루어집니다.
📊 라이브 (Live): semanticsignal.qrak.org — 실시간 트레이딩을 확인하세요.
📚 더 보기 (More): qrak.org — 연구, 기사, 무료 리소스 (AdSense 지원)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기