ChatOps supervised trading 구현 계획
For Hermes: 실제 코딩은 나중에 한다. 지금 문서는 구현 순서, 파일 경로, 검증 기준만 고정하는 계획 문서다.
Goal: Telegram 중심의 감독형 자동매매 시스템을 작은 코어부터 구축하고, 검증된 부품을 순차 이식해 실거래 전까지 안전하게 확장한다.
Architecture: 상위는 Event Router + Proposal Card + Approval Gate, 하위는 Risk Policy + Execution Adapter 구조로 나눈다. 처음에는 paper trading으로만 닫힌 루프를 만든 뒤, Upbit adapter와 Freqtrade adapter를 차례대로 붙인다.
Tech Stack: Python 3.11+, FastAPI, Telegram Bot API, pytest, pyupbit(초기 Upbit adapter), Freqtrade(후속), llm-wiki.
범위와 비범위
이번 계획에 포함
- 새 repo 골격 정의
- 1차 이식 순서 고정
- 모듈 경계와 책임 정의
- 단계별 검증 기준 정의
이번 계획에 포함하지 않음
- 실제 코드 작성
- 실제 repo 생성
- 실거래 연결
- 모델 선택/프롬프트 미세조정
- 뉴스/감성/토론형 멀티에이전트 확장
최종 목표 구조
signal/event
-> context snapshot
-> proposal generation
-> risk policy
-> approval gate
-> execution adapter
-> result notification
-> journal/vault핵심 원칙:
- AI는 설명과 제안 담당
- 결정론적 정책이 먼저 차단
- 사람 승인이 마지막 방아쇠
- 실행기는 adapter로 격리
Repo 목표 구조
chatops-supervised-trading/
├── README.md
├── pyproject.toml
├── .env.example
├── src/chatops_trading/
│ ├── main.py
│ ├── config.py
│ ├── state.py
│ ├── event_router/
│ │ ├── api.py
│ │ ├── schemas.py
│ │ └── dedupe.py
│ ├── context/
│ │ ├── builder.py
│ │ ├── market_snapshot.py
│ │ └── portfolio_snapshot.py
│ ├── proposal/
│ │ ├── rule_engine.py
│ │ ├── ai_summary.py
│ │ └── card_renderer.py
│ ├── risk/
│ │ └── policy.py
│ ├── approval/
│ │ ├── policy.py
│ │ ├── telegram_gate.py
│ │ └── timeout.py
│ ├── execution/
│ │ ├── base.py
│ │ ├── router.py
│ │ ├── paper_executor.py
│ │ ├── upbit_executor.py
│ │ └── freqtrade_adapter.py
│ ├── portfolio/
│ │ └── paper_portfolio.py
│ ├── notifications/
│ │ ├── telegram.py
│ │ └── discord.py
│ ├── runtime/
│ │ ├── loop.py
│ │ ├── scheduler.py
│ │ └── commands.py
│ └── journal/
│ ├── tracker.py
│ ├── trade_log.py
│ └── vault_writer.py
└── tests/
├── risk/
├── approval/
├── execution/
├── portfolio/
├── event_router/
└── runtime/구현 단계 계획
Phase 0 — 저장소 뼈대 준비
Task 0.1: 새 repo 초기 구조 생성
Objective: 새 프로젝트의 기본 디렉토리 구조와 빈 모듈을 만든다.
Files:
- Create:
README.md - Create:
pyproject.toml - Create:
.env.example - Create:
src/chatops_trading/** - Create:
tests/**
Done when:
- import 경로가 모두 결정됨
- 빈 패키지 구조가 생김
- 테스트 디렉토리도 함께 준비됨
Task 0.2: 공통 설정/상태 계약 고정
Objective: 환경변수와 런타임 상태의 canonical schema를 먼저 고정한다.
Files:
- Create:
src/chatops_trading/config.py - Create:
src/chatops_trading/state.py - Create:
tests/test_config_smoke.py - Create:
tests/test_state_contract.py
Done when:
- symbol, trading_mode, approval_status, risk result, proposal payload의 기본 필드가 문서화됨
- 이후 모듈들이 같은 state 계약을 공유할 수 있음
Phase 1 — 리스크/승인 정책 이식
Task 1.1: Risk policy 이식
Objective: 기존 btc-trading-agents의 리스크 게이트를 순수 정책 모듈로 옮긴다.
Files:
- Create:
src/chatops_trading/risk/policy.py - Create:
tests/risk/test_policy.py - Reference:
btc-trading-agents/src/btc_analyzer/nodes/risk_gate.py - Reference:
btc-trading-agents/tests/test_risk_gate.py
Scope:
- 연속 손실 차단
- 일일 손실 한도
- 포지션 사이즈 cap
- HOLD / LIQUIDATE / ALLOW 판정
Done when:
- risk policy가 외부 의존성 없이 동작
- 기존 경계값 테스트가 대부분 유지됨
Task 1.2: Approval policy 이식
Objective: 기존 HITL 판단 로직을 LangGraph 의존 없이 정책 함수로 분리한다.
Files:
- Create:
src/chatops_trading/approval/policy.py - Create:
tests/approval/test_policy.py - Reference:
btc-trading-agents/src/btc_analyzer/nodes/human_approval.py - Reference:
btc-trading-agents/tests/test_human_approval.py
Scope:
- live 모드면 무조건 승인 필요
- confidence 낮으면 승인 필요
- 포지션 사이즈 크면 승인 필요
- None-safe 처리
Done when:
- 승인 필요 여부만 판단하는 순수 함수가 분리됨
- transport(Telegram/Discord/LangGraph interrupt)와 정책이 완전히 분리됨
Phase 2 — Paper trading 코어 이식
Task 2.1: Paper portfolio 이식
Objective: paper trading용 포지션/손익/일일 손익 추적기를 이식한다.
Files:
- Create:
src/chatops_trading/portfolio/paper_portfolio.py - Create:
tests/portfolio/test_paper_portfolio.py - Reference:
btc-trading-agents/src/btc_analyzer/paper_trading/portfolio.py - Reference:
btc-trading-agents/tests/test_paper_trading.py
Scope:
- buy / sell
- fee 반영
- realized / unrealized pnl
- consecutive losses
- daily pnl reset
Done when:
- 포트폴리오 계산이 테스트로 고정됨
- risk policy와 바로 연결 가능해짐
Task 2.2: Paper executor 이식
Objective: 정책 결과를 받아 BUY/SELL/HOLD/LIQUIDATE를 수행하는 paper execution 루프를 만든다.
Files:
- Create:
src/chatops_trading/execution/paper_executor.py - Create:
tests/execution/test_paper_executor.py - Reference:
btc-trading-agents/src/btc_analyzer/paper_trading/executor.py
Scope:
- ALLOW / BLOCKED / LIQUIDATE 처리
- portfolio snapshot 반환
- hold/no price/no position 처리
Done when:
- proposal payload 하나로 paper execution 결과를 낼 수 있음
- Telegram 연결 전에도 로컬에서 완결된 시뮬레이션 가능
Phase 3 — 운영면 최소 루프 구축
Task 3.1: Proposal card 렌더러 작성
Objective: 사람이 읽고 승인할 수 있는 제안 카드 포맷을 고정한다.
Files:
- Create:
src/chatops_trading/proposal/card_renderer.py - Create:
tests/proposal/test_card_renderer.py
Card fields:
- symbol
- trigger
- rule summary
- confidence
- position size
- stop loss / take profit
- reason
- risk status
- timeout policy
Done when:
- proposal dict → Telegram 전송용 텍스트 포맷이 안정적으로 렌더링됨
Task 3.2: Telegram gate 구현
Objective: 승인 대기 / 승인 / 거부 / timeout auto-reject 흐름을 구현할 인터페이스를 정의한다.
Files:
- Create:
src/chatops_trading/approval/telegram_gate.py - Create:
src/chatops_trading/approval/timeout.py - Create:
src/chatops_trading/notifications/telegram.py - Create:
tests/approval/test_telegram_gate.py
Scope:
- pending proposal 저장
- approve / reject command 처리
- timeout 후 자동 거부
Done when:
- transport가 붙지 않아도 gate state machine이 테스트 가능함
Task 3.3: 수동 명령 집합 정의
Objective: 운영 명령의 최소 셋을 먼저 고정한다.
Files:
- Create:
src/chatops_trading/runtime/commands.py - Create:
tests/runtime/test_commands.py
Commands:
/scan/status/approve <id>/reject <id>/pause/resume/report daily
Done when:
- 명령 라우팅 계약이 고정되고 이후 Telegram adapter가 얇아짐
Phase 4 — Event ingress 구축
Task 4.1: Event Router API 만들기
Objective: TradingView webhook과 수동 이벤트 입력을 받을 최소 API를 만든다.
Files:
- Create:
src/chatops_trading/event_router/api.py - Create:
src/chatops_trading/event_router/schemas.py - Create:
src/chatops_trading/event_router/dedupe.py - Create:
tests/event_router/test_api.py
Endpoints:
POST /webhooks/tradingviewPOST /events/manualGET /health
Done when:
- 이벤트가 표준 proposal input으로 변환됨
- 중복 webhook 방지 로직이 존재함
Task 4.2: Context builder 만들기
Objective: 이벤트를 실행 가능한 proposal input으로 바꿀 컨텍스트 빌더를 만든다.
Files:
- Create:
src/chatops_trading/context/market_snapshot.py - Create:
src/chatops_trading/context/portfolio_snapshot.py - Create:
src/chatops_trading/context/builder.py - Create:
tests/context/test_builder.py
Done when:
- signal + current portfolio + risk state → proposal input 생성 가능
Phase 5 — 실거래 adapter 추가
Task 5.1: Upbit executor 이식
Objective: 기존 업비트 실거래 실행기를 새 구조의 adapter로 옮긴다.
Files:
- Create:
src/chatops_trading/execution/upbit_executor.py - Create:
tests/execution/test_upbit_executor.py - Reference:
btc-trading-agents/src/btc_analyzer/real_trading/executor.py - Reference:
btc-trading-agents/tests/test_real_trading.py
Done when:
- dry_run / auth / buy / sell / liquidate 경로가 독립 adapter로 동작
- 이름과 책임이
UpbitExecutor로 명확해짐
Task 5.2: Execution base/router 작성
Objective: paper/upbit/freqtrade를 공통 인터페이스로 통일한다.
Files:
- Create:
src/chatops_trading/execution/base.py - Create:
src/chatops_trading/execution/router.py - Create:
tests/execution/test_router.py
Done when:
- 상위 서비스는 adapter 종류를 몰라도 execute 가능
Phase 6 — Freqtrade 연동
Task 6.1: Freqtrade adapter 초안
Objective: 상위 ChatOps 계층이 Freqtrade를 안전하게 호출할 최소 adapter를 만든다.
Files:
- Create:
src/chatops_trading/execution/freqtrade_adapter.py - Create:
src/chatops_trading/integrations/freqtrade.py - Create:
tests/execution/test_freqtrade_adapter.py
Initial scope:
- 상태 조회
- 신규 실행 요청
- 포지션/주문 결과 조회
- 실패 시 재시도/오류 포맷 정규화
Done when:
- ChatOps 상위 레이어가 “직접 주문” 대신 “엔진 요청”으로 실행 가능
Phase 7 — 관측/기록 계층
Task 7.1: Journal / tracker 이식
Objective: 실행 결과와 제안 근거를 추적 가능한 아티팩트로 남긴다.
Files:
- Create:
src/chatops_trading/journal/tracker.py - Create:
src/chatops_trading/journal/trade_log.py - Create:
src/chatops_trading/journal/vault_writer.py - Create:
tests/journal/test_tracker.py - Reference:
btc-trading-agents/src/btc_analyzer/observability/tracker.py
Done when:
- proposal / approval / execution / result가 하나의 추적 단위로 남음
- llm-wiki 저장도 가능해짐
검증 기준
MVP 완료 기준
아래가 되면 “실전 전 MVP”로 본다.
- webhook 없이도 수동 proposal 생성 가능
- risk policy가 proposal을 판정 가능
- approval policy가 승인 필요 여부 판단 가능
- Telegram gate state machine이 pending/approve/reject/timeout 처리 가능
- paper executor가 결과를 반환 가능
- journal에 결과를 남길 수 있음
실거래 전 완료 기준
- Upbit adapter dry_run 통과
- approval 없이는 live 실행 불가
- timeout auto reject 동작
- 동일 proposal 중복 실행 방지
- 일일 손실/연속 손실 차단 검증
당장 시작할 1차 작업 묶음
Workset A
config.pystate.pyrisk/policy.pyapproval/policy.py
Workset B
portfolio/paper_portfolio.pyexecution/paper_executor.py
Workset C
proposal/card_renderer.pyapproval/telegram_gate.pynotifications/telegram.py
이 세 묶음이 끝나면 실제 체감 가능한 작은 시스템이 된다.
이번 계획에서 의도적으로 미루는 것
- LangGraph 도입
- Bull/Bear 토론 구조
- 뉴스/Reddit/Telegram 감성 파이프라인
- 다중 거래소 동시 지원
- KIS adapter
- 웹 대시보드
즉, 지금은 설명 가능한 운영 루프를 만드는 것이 목표다.
결론
실제 코딩은 나중에 하되, 구현 순서는 아래로 고정한다.
- 정책 먼저 — risk / approval
- 시뮬레이션 다음 — paper portfolio / paper executor
- 운영면 연결 — Telegram gate / card renderer / commands
- 이벤트 연결 — webhook / context builder
- 실행 확장 — Upbit adapter / Freqtrade adapter
- 저널 정리 — tracker / vault writer
이 순서가 가장 작은 리스크로 ChatOps 감독형 자동매매 시스템에 도달하는 길이다.
Related Notes
- 2026-04-22-open-source-automated-trading-stack-map
- 2026-04-24-btc-trading-agents-reuse-map
- 2026-04-24-chatops-trading-repo-skeleton-and-migration-order
- 2026-04-22-open-source-automated-trading-stack-map
- 2026-04-22-open-source-automated-trading-stack-map
- moc-ai-agents-trading
- harness