공정 엔지니어의 AI 엔지니어로의 성장 기록

비전공자의 바이브 코딩/일상 & 기초

클로드코드(Claude Code)로 코인 자동매매 프로그램 만들기 : 후속) AI 에이전트 기반 트레이딩 전환기

ai-process-engineer 2026. 7. 3. 20:19
클로드코드로 코인 자동매매 만들기 #5 — Claude subprocess로 AI 에이전트 트레이딩 구현

클로드코드(Claude Code)로 코인 자동매매 만들기
— #5. AI 에이전트 기반 트레이딩 전환기

알고리즘으로 코인을 매매하다 보면 어느 순간 벽이 온다. RSI가 70을 넘어도 계속 오르고, 변동성 돌파 신호가 나와도 시장 분위기는 반대로 흐른다. 파라미터를 손으로 조정하는 것도 한계가 있다. 그래서 AI가 직접 시장을 분석하고 판단하게 만들기로 했다.

문제는 비용이었다. Claude API를 직접 쓰면 호출마다 토큰 요금이 청구된다. 코인 5개를 30분마다 분석하면 하루 48회, 1회당 수만 토큰이다. 월 비용이 작지 않다. 그런데 나는 이미 Claude Max 플랜을 가장 비싼 걸로 구독하고 있었고, Claude Code 쓰다 보면 토큰이 남는 날도 많다. 추가로 돈을 낼 이유가 없었다.

그래서 찾은 방법이 Claude CLI를 Python subprocess로 호출하는 것이다. 터미널에서 claude 명령어를 치는 것과 완전히 동일하다. API 키도 필요 없고, 별도 과금도 없다. 이미 구독 중인 플랜 안에서 처리된다. AI 에이전트를 구성하는 방법으로 API·SDK가 거의 유일한 선택지처럼 소개되지만, Claude Code 구독자라면 이 방법이 가장 현실적이다.

아래에 왜 subprocess인지, 어떻게 구성했는지, 실제 운영 결과까지 정리했다.

01 알고리즘 트레이딩의 한계

기존 시스템은 VB(변동성 돌파), RSI, Grid 세 가지 알고리즘이 각자 규칙대로 매매를 판단했다. 이 구조의 문제는 명확하다.

  • 시장 국면 변화에 무감각 횡보장, 상승장, 급락장 모두 동일한 파라미터로 대응한다. 시장이 변해도 규칙은 그대로다.
  • 수동 파라미터 튜닝 RSI 임계값, 그리드 범위, 매수 금액을 직접 수정해야 한다. 결국 사람이 붙어 있어야 한다.
  • 코인 간 상관관계 미고려 BTC가 급등할 때 알트코인 매수, ETH가 횡보할 때 그리드 조정 같은 판단을 알고리즘은 할 수 없다.
  • 예외 상황 대응 불가 거래소 이슈, 급격한 변동성 확대, 이상 포지션 등 예상 밖 상황에서 알고리즘은 그냥 규칙대로 실행한다.
핵심 — 알고리즘은 "언제나 이렇게 한다"는 규칙이다. AI 에이전트는 "지금 상황을 보고 판단한다"는 사고다. 시장은 후자에 가깝다.

02 AI 에이전트를 만드는 방법 3가지 — 그리고 내가 선택한 것

AI 에이전트를 구성하는 방법은 크게 세 가지다. 각각 구조가 다르고, 비용과 복잡도도 다르다.

① Anthropic API 직접 호출

Python에서 anthropic 라이브러리로 /v1/messages를 호출한다. 가장 유연하고 fine-grained한 제어가 가능하다. 단점은 호출마다 input/output 토큰 비용이 청구된다는 것. 30분 주기 × 하루 48회 × 코인 5개 분석이면 월 비용이 작지 않다.

② Claude SDK (claude-code-sdk 등)

SDK가 API 호출을 래핑해준다. 편의성은 높지만 결국 API 호출이라 토큰 비용 구조는 동일하다. 멀티에이전트 오케스트레이션에는 유리하지만, 비용 문제는 그대로다.

③ Claude CLI subprocess — 내가 선택한 방법

터미널에서 치는 claude "분석해줘" 명령어를 Python에서 그대로 실행한다. Claude Code(Max) 플랜 구독 안에서 처리되므로 API 추가 과금이 없다. 에이전트가 코드·파일·DB에 직접 접근하려면 어차피 Claude Code 환경이 필요한데, 그 CLI를 subprocess로 호출하면 별도 인프라 없이 바로 에이전트를 만들 수 있다.

Max 플랜에는 사용량 제한이 있어서 무제한은 아니다. 하지만 30분 주기로 1회 분석하는 정도는 여유 있게 소화된다. Claude Code를 이미 구독 중이라면 추가 비용 없이 에이전트를 운영하는 가장 현실적인 방법이다.

핵심 — API 키 발급도, 별도 SDK 설치도 필요 없다. claude CLI가 설치된 환경이면 Python subprocess 두 줄로 AI 에이전트가 동작한다. 구독 중인 플랜의 토큰을 그대로 사용한다.

실제로 Claude가 에이전트로 동작할 때의 흐름을 정리하면 이렇다.

Python 스케줄러
subprocess.run("claude …")
Claude가 파일/DB/API 직접 탐색
JSON 응답 반환
매매 실행

Claude가 분석하는 동안 멀티턴으로 코드를 읽고, 거래소 API를 직접 호출하고, DB를 조회한다. 사람이 데이터를 요약해서 넘겨주는 방식이 아니라 에이전트가 스스로 탐색한다. 이 탐색 비용도 구독 안에서 처리된다.

03 시스템 구조 — AI가 전권을 갖는다

기존 알고리즘 코드는 건드리지 않는다. AI가 기존 코드를 도구로 사용하는 구조다. 30분마다 Claude CLI가 subprocess로 깨어나 코드, DB, 거래소 API를 직접 읽고 분석한 뒤 매매 목표를 설정한다. 분석이 끝나면 target_store를 통째로 교체하고, 별도로 돌고 있는 10초 주기 executor가 가격을 감시하며 매매를 실행한다.

구분담당설명
전략 분석Claude AI코드/DB/API 직접 탐색, 매매 목표 설정
안전 검증decision_validator최소 가드레일 4개 (환각 목표가, 일일 손실 한도 등)
목표 관리target_storeAI가 설정한 목표가/손절가 in-memory 보관
가격 감시target_executor10초 주기로 현재가 확인, 조건 충족 시 실행
주문 실행OrderExecutor기존 코드 그대로 사용

AI가 변경할 수 없는 것은 딱 두 가지다. 일일 최대 손실 한도(총 예산의 5%)와 API 키. 나머지 매매 판단, 파라미터 조정, 코인 추가/제거, 예산 배분은 모두 AI에게 위임한다.

04 핵심 구현 — subprocess로 Claude CLI 호출하기

많은 사람들이 AI 에이전트를 만들려면 API 키 발급, SDK 설치, 토큰 비용 계산이 필수라고 생각한다. Claude Code 구독자라면 그럴 필요 없다. 이미 터미널에서 쓰는 claude 명령어를 Python 안에서 그대로 실행하면 된다.

원리는 단순하다. subprocess.run()은 Python에서 터미널 명령어를 실행하는 표준 라이브러리다. claude "분석해줘"를 터미널에 치는 것과 subprocess.run(["claude", "분석해줘"])는 동일하다. 차이는 사람 대신 Python이 명령을 내린다는 것뿐이다. Claude Code 인증은 이미 로컬에 저장되어 있으니 추가 설정도 없다.

실제 코드는 생각보다 단순하다. --output-format json 옵션으로 응답을 구조화된 JSON으로 받고, 그 안에서 분석 결과를 파싱한다.

Python — claude_runner.py
import subprocess, json, re

def run_claude_analysis(prompt: str) -> dict | None:
    result = subprocess.run(
        [
            "claude",
            "--dangerously-skip-permissions",  # 파일/DB/API 자유 접근
            "--output-format", "json",
            "--model", "opus",               # 분석 품질 우선
            "--max-turns", "30",              # 멀티턴 탐색 허용
        ],
        input=prompt,
        capture_output=True,
        text=True,
        encoding="utf-8",               # Windows cp949 인코딩 이슈 방지
        timeout=600,                        # 멀티턴 탐색에 최대 10분
        cwd=PROJECT_ROOT,
    )

    if result.returncode != 0:
        log.error(f"Claude 비정상 종료: {result.stderr}")
        return None

    outer = json.loads(result.stdout)
    return extract_json_from_response(outer["result"])


def extract_json_from_response(text: str) -> dict | None:
    # 1차: ```json 코드블록 추출
    m = re.search(r'```json\s*\n(.*?)\n\s*```', text, re.DOTALL)
    if m:
        return json.loads(m.group(1))
    # 2차: { } 최외곽 JSON 객체 추출
    m = re.search(r'\{.*\}', text, re.DOTALL)
    if m:
        return json.loads(m.group(0))
    return None

Claude가 분석을 마치면 JSON 형식으로 각 코인의 action(buy/sell/hold), take_profit, stop_loss, confidence, reasoning을 반환한다. 이걸 파싱해서 target_store에 저장하면 10초 주기 executor가 가격을 감시하며 조건 충족 시 매매를 실행한다.

비용 구조 — subprocess.run(["claude", ...])는 터미널에서 claude를 치는 것과 완전히 동일하다. Claude Code 플랜의 사용량으로 집계되며, Anthropic API 요금은 별도로 발생하지 않는다. 로컬에 저장된 Claude Code 인증 정보를 그대로 사용하기 때문에 API 키 발급도 필요 없다.
옵션 설명 — --dangerously-skip-permissions는 Claude가 파일 읽기, 코드 실행, 외부 API 호출 시 매번 허가를 묻지 않도록 한다. subprocess 환경에서 사람이 승인 버튼을 누를 수 없으므로 필수다. 이름이 무섭게 생겼지만 역할은 단순하다. --output-format json은 응답을 구조화된 JSON으로 받아서 파싱을 쉽게 만든다.

05 실제 AI 분석 결과 — 저 사진이 증거다

위 스크린샷이 실제 AI 에이전트가 분석한 결과다. 30분마다 Claude Opus가 깨어나 BTC, ETH, WLD, SOL, XRP 등을 분석하고 전략을 설정한다.

  • AI Market Summary 시장 전체를 한 문단으로 요약한다. BTC 안정 회복세, ETH·SOL 강세, WLD 과매수 해소 반등 등 상황을 종합 판단한다.
  • Risk Alerts 현재 가용 현금 부족, WLD 손실 리스크, ETH·XRP 과매수 경계 등 주의사항을 명시한다. 알고리즘에는 없던 기능이다.
  • 코인별 목표가 + 이유 WLD HOLD (take profit 700, stop loss 565), BTC HOLD (96M 목표, 91M 손절) 등 근거와 함께 전략을 제시한다.
  • Grid 설정 제안 각 코인의 현재가 위치를 판단해 그리드 ON/OFF를 추천한다. 범위 밖에 있으면 비활성 상태를 유지하라고 한다.

첫 실제 분석은 약 280초가 걸렸다. Claude가 멀티턴으로 코드를 읽고, 거래소 API를 직접 호출하고, DB를 조회하는 과정이다. 오래 걸리지만 30분에 한 번이니 문제없다.

06 구현하면서 만난 버그들

설계대로 돌아가는 코드는 없다. 실제 운영하면서 수정한 버그 목록이다. 비슷한 구조를 만들 계획이라면 참고가 될 것이다.

#버그원인수정
B1한글 인코딩 오류Windows subprocess 기본값 cp949encoding="utf-8" 추가
B2AI 응답에 JSON 없음프롬프트 지시 부족프롬프트에 "JSON만 출력" 강조 + 예시 추가
B3예산 총액 덮어쓰기평가금액으로 total 재계산참고값만 기록, 사용자 설정 보호
B5모드 전환 시 스케줄러 2개 실행stop 비동기 미대기task cancel + await + 1초 안전 대기
B6그리드 중복 매수 5건스케줄러 2개 → config 동시 접근asyncio.Lock() 글로벌 락
B9WLD 분석 누락프롬프트에 코인 4개 하드코딩config 기반 동적 코인 목록 주입
B10max_turns 도달로 JSON 미출력탐색에 15턴 소진max_turns 30으로 확대 + 오류 감지

가장 뼈아팠던 건 B6이다. 모드 전환 버그로 스케줄러가 2개 동시에 돌면서 그리드 매수가 같은 레벨에 5건이나 중복 실행됐다. 거래소 체결 이력을 뒤져 수동으로 복구했다. asyncio.Lock() 하나가 이걸 막는다.

07 PRD 원안 대비 실제로 달라진 것들

PRD를 먼저 쓰고 구현하면 항상 설계와 실제 사이에 차이가 생긴다. 바뀐 결정들을 기록해둔다.

항목PRD 원안실구현
분석 주기1시간30분 — 더 빠른 대응 필요
max_turns제한 없음30턴 — 무한 루프 방지
subprocess timeout120초600초 — 실제로 300초+ 소요
가드레일G1~G13 (13개)G1~G4만 — AI 전권 원칙 유지
코인 목록프롬프트 하드코딩config 동적 로드 — 포지션 있는 코인 자동 포함

08 지금 상태와 앞으로

시스템은 돌고 있다. 30분마다 AI가 시장을 보고 판단을 내린다. 사람이 파라미터를 만질 필요가 없다.

솔직히 말하면 지금 운용 자금이 적다. 가용 현금 1,804원이라는 AI의 처절한 리스크 경고가 이를 잘 보여준다. 큰 돈을 굴릴 수 없으니 성과 측정도 의미가 없다. 여유 자금이 생기면 본격적으로 돌릴 예정이다. 그때 부자가 될 것이다 (아마도).

  1. 1주일 운영 후 AI vs 알고리즘 성과 비교 — 같은 기간 알고리즘 모드와 AI 모드를 비교한다
  2. 시스템 프롬프트 튜닝 — 실제 매매 결과 피드백을 프롬프트에 반영한다
  3. 컨텍스트 최적화 — Max 플랜 rate limit을 존중하면서 분석 품질을 유지한다
핵심 — Claude Code 구독이 있다면 추가 비용 없이 AI 에이전트 트레이딩을 돌릴 수 있다. 알고리즘 한계가 느껴진다면 subprocess 한 줄로 전환해볼 만하다.
Summary

알고리즘 자동매매의 유연성 한계를 해결하기 위해 Claude CLI를 Python subprocess로 호출하는 AI 에이전트 트레이딩 시스템을 구현했다. Max 플랜 구독 내에서 API 추가 과금 없이 30분마다 AI가 시장 전체를 분석하고 코인별 목표가·손절가·전략을 설정한다. 구현 과정에서 인코딩, 동시성, max_turns 등 10개의 버그를 수정했고, 65개 테스트를 통과시켰다. 가용 자금이 부족해 아직 대규모 운영은 못 하고 있지만, 시스템은 지금도 30분마다 묵묵히 돌고 있다.