1999년처럼 매매하지 마세요 — Python 3.13으로 구축한 자율형 시각 인지 기능 탑재 암호화폐 봇
요약
기존 LLM 트레이딩 봇의 한계를 극복하기 위해 시각적 차트 인식, 기대값(EV) 계산, 반증 검사 기능을 갖춘 자율형 암호화폐 트레이딩 봇 구축 과정을 다룹니다. 단순 프롬프트 입력을 넘어 연구 논문을 바탕으로 설계된 에이전트 구조를 소개합니다.
핵심 포인트
- 기존 LLM 트레이딩의 문제점인 환각과 높은 API 비용 해결
- 차트 비전 기능을 통한 패턴 인식 및 시각적 데이터 활용
- 기대값(EV) 계산 및 손실 방지를 위한 반증 검사 로직 도입
- 벡터 메모리를 활용한 거래 결과의 지속적 학습
실패에 관한 이야기를 하나 해드리겠습니다.
2024년 12월. 저는 8시간의 창고 교대 근무를 마치고 브로츠와프(Wrocław)에 있는 제 아파트에 앉아 있습니다. 허리가 아픕니다. 저는 2주 동안 트레이딩 봇(trading bot)을 작동시키려고 노력해 왔습니다. 매일 밤, 결과는 같았습니다. LLM(Large Language Model)은 듣기에는 아주 그럴싸한 분석을 생성합니다. 자신감 넘치고, 조리 있으며, 완전히 틀렸습니다.
"RSI가 28이므로 과매도 상태입니다. 매수(BUY)." 다음 날 아침: -4.2%.
문제는 LLM이 멍청해서가 아니었습니다. 제가 게을렀던 것이 문제였습니다. 저는 프롬프트(prompt)에 숫자들을 쏟아붓고 마법이 일어나길 바라고 있었습니다. 이는 유튜브의 모든 "LLM 트레이딩 봇" 튜토리얼이 당신에게 하라고 말하는 바로 그 방식입니다.
저에게는 세 가지 선택지가 있었습니다. 포기하거나, 강의를 사거나, 아니면 아무도 하지 않는 일 — 즉, 실제 연구 논문(research papers)을 읽는 것이었습니다.
저는 세 번째 옵션을 선택했습니다. 77편의 논문을 읽은 후, 저는 진짜 문제가 무엇인지 이해했습니다. 그리고 그것을 해결하는 무언가를 만들었습니다.
연구의 토끼굴 (The Research Rabbit Hole)
77편의 학술 논문과 산업 보고서가 LLM 트레이딩에 대해 저에게 가르쳐 준 내용은 다음과 같습니다:
TradingAgents (UCLA/MIT, GitHub 별 95k 개) — 훌륭한 프레임워크입니다. 멀티 에이전트 토론(Multi-agent debate), 전문 분석가 역할 분담 등을 갖추고 있습니다. 하지만 세 가지 결정적인 결함이 있습니다: 주식 전용(암호화폐 불가), 차트 시각 기능 전무(가공되지 않은 숫자만 사용), 그리고 모든 분석에 5회 이상의 API 호출 비용이 발생한다는 점입니다. 구조는 아름답지만 실행 비용이 너무 비쌉니다.
Optiver의 2026년 연구 — LLM은 인턴 트레이딩 시험을 통과합니다. 그들은 기댓값(EV, Expected Value)을 이해합니다. 마켓 메이킹(market making)을 설명할 수도 있습니다. 하지만 실제로 실행해야 할 때가 되면? 그들은 얼어붙습니다. 너무 보수적입니다. 수익을 놓치게 됩니다. 기댓값을 이해하는 것과 기댓값을 극대화하는 것 사이의 간극이 바로 진짜 트레이딩이 이루어지는 지점이며, LLM은 바로 그 지점에서 실패합니다.
Agentic Trading Survey (arXiv 2026) — 77개의 연구를 검토했습니다. 제대로 된 시간 일관적 데이터 분할(time-consistent data splits)을 갖춘 연구는 단 2개뿐이었습니다. 재현성 수준 R3에 도달한 연구는 전무했습니다. 대부분의 학술적 LLM 트레이딩 논문들은 체리 피킹(cherry-picked)된 백테스트(backtests)를 포함한, 구조적으로만 인상적인 파워포인트 슬라이드에 불과합니다. 그들의 코드를 직접 실행해 보십시오.
Bank of Finland의 Lopez-Lira — LLM 에이전트(LLM agents)는 매매를 할 수 있습니다. 하지만 당신이 명시적으로 신경 쓰도록 프로그래밍하지 않는 한, 그들은 돈을 잃는 것에 대해 전혀 개의치 않습니다. 그들은 확률적인 방식으로 미소 지으며, 손실을 초래하는 지침을 따라 곧바로 0으로 직행할 것입니다.
그래서 저는 질문했습니다. 만약 하나의 봇이 이 모든 문제를 해결한다면 어떨까? 패턴 인식을 위한 차트 비전(Chart vision). 실제 과거 데이터를 통한 기대값(EV) 계산. 환각(hallucination)된 신호를 거부하는 반증 검사(Falsification checks). 모든 거래 결과를 기억하는 벡터 메모리(Vector memory). 그리고 추가적인 API 호출 비용이 전혀 들지 않는 강세/약세(bull/bear) 토론까지.
그것이 제가 구축한 것입니다. 정확히 어떻게 만들었는지 소개합니다.
1. 차트 비전(Chart Vision) — LLM이 캔들스틱 이미지를 읽다
매 사이클마다, 봇은 5개의 오버레이 지표(SMA, RSI, Volume, CMF, OBV)가 포함된 4K PNG 캔들스틱 차트를 생성합니다. 이 이미지는 Google Gemini 1.5 Flash로 직접 전달됩니다. 바이트(bytes) 형태도, 데이터 URL 형태도 아닙니다. 시각적 추론(visual inference)으로서 전달됩니다.
왜일까요? 패턴 감지 알고리즘(헤드 앤 숄더, 웨지, 추세선, 지지/저항 등)을 코딩하는 데 2주를 보냈기 때문입니다. 그 후 AI의 시각적 판독 결과와 제 코드를 비교해 보았습니다. AI가 더 뛰어났습니다. 훨씬 더 많이 말이죠.
저는 패턴 감지 코드 900줄을 삭제했습니다. 그리고 다시는 돌아보지 않았습니다.
2. 50개 이상의 지표, 로컬에서 JIT 컴파일
pandas-ta도, TA-Lib도 사용하지 않았습니다. 저는 NumPy와 Numba를 사용하여 지표 엔진 전체를 처음부터 구축했습니다. 모든 EMA, SMA, MACD, ADX, Stochastic, Bollinger Band, TTM Squeeze, 일목균형표(Ichimoku) 구성 요소 및 11가지 이동 평균 변형 모델은 첫 호출 시 머신 코드(machine code)로 컴파일되며 그 결과를 캐싱(cache)합니다.
@njit(cache=True)
def _ema_numba(prices, period):
alpha = 2.0 / (period + 1)
...
50개의 지표. 모두 커스텀이며, 모두 JIT 컴파일되었고, 모두 CPU에서 마이크로초 단위로 실행됩니다. CUDA도, 클라우드도 필요 없습니다. 그저 제 책상 위에 있는 Ryzen 5700G뿐입니다.
3. 강세 vs 약세 토론 — 하나의 프롬프트, 두 개의 관점, 추가 비용 제로
TradingAgents는 강세(bull) 분석과 약세(bear) 분석을 위해 별도의 에이전트를 생성합니다. 똑똑한 방식이지만, 각각 API 호출 비용이 발생합니다. 제 봇은 LLM에 단 하나의 지침을 내립니다: 먼저 강세 논거를 제시하고(차트, 지표, 뉴스 근거 포함), 그다음 동일한 엄격함으로 약세 논거를 제시할 것. 그런 다음 결정할 것.
단 하나의 프롬프트. 두 가지 관점. 추가 토큰 비용 제로. 모델이 두 논거를 컨텍스트(context) 내에 동시에 유지해야 하므로 결과적으로 편향이 줄어듭니다. 즉, 중간에 반대 논거를 "잊어버릴" 수 없게 됩니다.
4. EV Framework — Optiver가 LLM은 할 수 없다고 말한 것
Optiver는 LLM이 기대값(Expected Value, EV)을 설명할 수는 있지만, 이를 실행할 수는 없다는 것을 발견했습니다. 저의 EV Framework는 다음을 계산합니다:
- 거래 이력에서 추출한 승률 (현재 셋업과의 유사성으로 필터링됨)
- 평균 수익 크기 vs 평균 손실 크기
- 기대 손익(Expected P&L) = (승률 × 평균 수익) — ((1 — 승률) × 평균 손실)
- 계좌 자산(equity) 기반의 켈리 공식(Kelly fraction) 비중 조절
- 신호 수락 전 리스크 대비 보상(Risk/reward) 검증
LLM은 추론(reasoning)을 제공하고, EV Framework는 수학적 계산을 제공합니다. 어느 쪽도 상대방을 맹목적으로 신뢰하지 않습니다. 만약 LLM이 "강력 매수"라고 말하더라도 EV 결과가 음수라면 — 홀딩(HOLD)합니다.
5. 반증 검사(Falsification Check) — 당신이 틀렸음을 증명하는 가격을 명시하라
어떠한 신호도 수락되기 전에, LLM은 반드시 다음의 한 문장을 작성해야 합니다: "만약 [특정 가격 수준 또는 지표 조건]이 발생한다면, 이 신호는 틀린 것으로 증명될 것이다."
만약 이를 명시하지 못한다면 — 신호는 거부됩니다. 만약 명시된 조건이 다음 사이클이 오기 전에 트리거된다면 — 포지션을 조기에 종료합니다. 만약 명시된 조건이 모호하다면 ("시장이 약세로 전환된다면" 등) — 거부되며, 구체성을 가지고 다시 시도해야 합니다.
이 단 하나의 프롬프트 추가는 그 어떤 변경 사항보다 신호의 품질을 더 많이 개선했습니다. 환각(Hallucination)된 신호는 반증 가능한 주장(falsifiable claims)을 생성할 수 없기 때문입니다.
6. ChromaDB 벡터 메모리 — 봇은 자신의 실수를 기억한다
종료된 모든 거래는 15개 이상의 메타데이터 필드를 가진 벡터(vector)로 임베딩(embedded)됩니다:
symbol, direction, entry price, exit price, P&L percentage, max adverse excursion, timeframe, ADX at entry, trend strength, RSI, volume trend, pattern detected, news sentiment score, surprise ratio, and closed timestamp.
매 새로운 분석 주기(analysis cycle)마다, 봇은 다음과 같이 질의합니다: "현재 셋업과 가장 유사한 거래 5개를 찾아줘." 이 5개의 거래는 그 결과값과 함께 LLM 프롬프트(prompt)에 주입됩니다. AI는 유사한 과거 조건으로부터 실제 결과를 확인하게 됩니다.
시간 경과에 따른 감쇠(Time-decay)는 최신 데이터의 중요성을 보장합니다. 지표가 동일해 보이더라도, 지난주의 거래는 두 달 전의 거래보다 3배 더 높은 가중치를 가집니다.
7. 자체 코드베이스를 유지하는 7개의 AI 에이전트 (Seven AI Agents that Maintain Their Own Codebase)
.ai 디렉터리에서 7개의 특화된 에이전트 프롬프트(agent prompts)를 찾을 수 있습니다. 각 에이전트는 전용 범위(scope), 저널(journal), 그리고 개성을 가지고 있습니다. 이들은 실제로 커밋(commit)을 생성했습니다.
- Bolt (성능): 비동기 루프(async loop) 내의 동기 파일 읽기 발견 — 40ms 지연 시간(latency) 수정
- Palette (UX): ARIA 레이블, 토스트 알림(toast notifications), 접이식 패널 추가
- Sentinel (보안): 속도 제한 미들웨어(Rate limiting middleware), CSP 헤더, API 키 격리
- Refactor (클린 코드): 27개의 isinstance 체인 제거, 14개 모듈에 걸쳐 DI 패턴(DI pattern) 강제 적용
- Concise (코드 축소): 프롬프트 빌더(prompt builder) 전반에 걸쳐 380라인 축소
- Bugfixer (회귀 테스트): 메인(main)에 반영되기 전 3개의 버그 포착 — 모든 저널(journals)을 읽음으로써 검증됨
- Smoke Tests (사전 점검): 모든 커밋 전 구문 체크(Syntax check), 임포트 스캔(import scan), ruff 린트(ruff lint) 수행
에이전트 시스템 도입 이후 133개의 커밋이 발생했습니다. 그 모든 커밋은 테스트되었고 문서화되었습니다.
8. 검증 파이프라인 (Validation Pipeline) — 가공되지 않은 LLM 출력값을 절대 신뢰하지 마세요
모든 AI 응답은 다음 과정을 거칩니다:
- TrendValidator: LLM이 보고한 추세 강도를 실제 ADX 계산값과 교차 검증합니다. 15포인트 이상의 차이가 발생하면 계산된 값이 우선합니다.
- PatternQualityScorer: LLM의 자기 보고가 아닌, 실제 패턴 탐지로부터 도출된 결정론적 (deterministic) 0-100 점수입니다.
- Falsification Check (반증 검사): 자신의 실패 조건(failure condition)을 명시하지 못하는 신호는 거부합니다.
- Risk Guards (리스크 가드): 심볼 화이트리스트 (symbol whitelist), 최대 포지션 규모 (max position size), 쿨다운 윈도우 (cooldown window), 최소 손익비 (minimum risk/reward), SL/TP 유효성, 잘못된 방향의 SL/TP 탐지
9. 제로 코스트 센티먼트 (Zero-Cost Sentiment) — API 키 없음, 유료 서비스 없음
Reddit JSON (무료, 인증 불필요), Nitter 인스턴스를 통한 X/Twitter (공개 피드), CoinDesk, CoinTelegraph, Decrypt, CryptoSlate의 RSS. 이 모든 데이터는 ChromaDB를 기반으로 구축된 RAG 엔진을 통해 처리됩니다. 월간 청구서도 없고, API 속도 제한 (rate limits)도 없습니다. 오직 큐레이션된 무료 인터넷 데이터만 사용합니다.
테스트 스위트 (The Test Suite) — 아무도 말하지 않는 부분
1,324개의 테스트. 완전히 모킹 (mocked)되었습니다 — 네트워크 호출, ChromaDB, LLM API를 사용하지 않습니다. 어떤 기기에서든 약 60초 내에 실행됩니다.
커버리지에는 LLM 출력값 손상, 비동기 레이스 컨디션 (async race conditions), 지수 백오프 (exponential backoff)를 적용한 속도 제한, 벡터 DB 경계, 6가지 가드 유형 전체에 대한 마찰 보고 (friction reporting), 폐쇄 루프 피드백 주입 (closed-loop feedback injection), 네트워크 타임아웃 처리를 포함한 티커 재시도 등이 포함됩니다.
Optiver가 LLM이 "행동한 후 새로운 정보를 통합하는 데 실패한다"고 말할 때, 제 테스트는 봇이 그렇게 하지 않음을 검증합니다. arXiv 서베이가 재현성 (reproducibility)이 병목 현상이라고 말할 때, 제 테스트는 결정론적 (deterministic)입니다.
운영 비용
- Google Gemini 1.5 Flash: 무료 티어 (일일 1,500회 요청)
- 기술적 지표 (Technical indicators): CPU (Numba JIT, 마이크로초 단위)
- 뉴스 및 센티먼트 (News and Sentiment): 무료 (Reddit JSON, Nitter, RSS)
- 벡터 데이터베이스 (Vector database): 로컬 ChromaDB (디스크 약 50 MB, RAM 약 200 MB)
- 호스팅: 홈 서버 (Ryzen 5700G, 32 GB RAM)
- 대시보드: Cloudflare Tunnel (무료 티어)
월간 비용: 정확히 0 zł. "거의 무료"가 아닙니다. 무료입니다.
빠른 시작 (Quick Start)
git clone https://github.com/qrak/LLM_trader.git
cd LLM_trader
python -m venv .venv
...
대시보드 주소: http://localhost:8000. Windows 사용자: scripts/experimental_branch.ps1을 실행하세요.
솔직한 한계점 (Honest Limitations)
이 봇의 정체성: 연구용 수준의 오픈 소스 LLM (Large Language Model) 트레이딩 엔진입니다. 모의 투자 (Paper trading) 전용입니다. 모든 프롬프트 (Prompt), 응답 (Response), 거래 로그 (Trade log)를 검사할 수 있어 완전히 투명합니다. 성찰 엔진 (Reflection engine)을 통해 스스로 개선됩니다.
이 봇이 아닌 것: 일확천금을 노리는 수단이 아니며, (아직은) 실제 운영용 트레이딩 시스템 (Production trading system)도 아닙니다. 또한, 광범위한 테스트 없이 실제 자산을 맡겨야 할 대상도 아닙니다.
링크 (Links)
소스 코드: github.com/qrak/LLM_trader
라이브 대시보드: semanticsignal.qrak.org
랜딩 페이지: qrak.org
후원하기 (Buy Me a Coffee): buymeacoffee.com/qrak
이메일: contact@qrak.org
폴란드 브로츠와프(Wroclaw)에서 제작되었습니다. 학위도 없고, 부트캠프(Bootcamp) 출신도 아닙니다. 그저 Python, asyncio, 그리고 창고 교대 근무가 끝난 뒤 쏟아부은 수천 시간의 결과물입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기