diff options
Diffstat (limited to 'docs/superpowers/specs')
| -rw-r--r-- | docs/superpowers/specs/2026-04-01-crypto-trading-platform-design.md | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/docs/superpowers/specs/2026-04-01-crypto-trading-platform-design.md b/docs/superpowers/specs/2026-04-01-crypto-trading-platform-design.md new file mode 100644 index 0000000..aa32eb4 --- /dev/null +++ b/docs/superpowers/specs/2026-04-01-crypto-trading-platform-design.md @@ -0,0 +1,374 @@ +# Crypto Trading Platform — Design Spec + +## Overview + +Binance 현물 암호화폐 자동매매 플랫폼. 마이크로서비스 아키텍처 기반으로 데이터 수집, 전략 실행, 주문 처리, 포트폴리오 관리, 백테스팅을 독립 서비스로 운영한다. CLI로 제어하며, 전략은 플러그인 방식으로 확장 가능하다. + +- **시장:** 암호화폐 (Binance 현물) +- **언어:** Python +- **인터페이스:** CLI (Click) +- **아키텍처:** 마이크로서비스 (Docker Compose) + +--- + +## Architecture + +### 서비스 구성 + +``` +┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐ +│ Data │───▶│ Message Broker │◀──│ Strategy │ +│ Collector │ │ (Redis Streams) │ │ Engine │ +└─────────────┘ └──────────────────┘ └─────────────────┘ + │ ▲ │ + ▼ │ ▼ + ┌──────────────────┐ ┌─────────────────┐ + │ Backtester │ │ Order │ + │ │ │ Executor │ + └──────────────────┘ └─────────────────┘ + │ + ┌────────────────────────┘ + ▼ + ┌──────────────────┐ + │ Portfolio │ + │ Manager │ + └──────────────────┘ + + CLI ──────▶ 각 서비스에 명령 전달 +``` + +| 서비스 | 역할 | 상시 실행 | +|--------|------|-----------| +| **data-collector** | Binance WebSocket/REST로 시세 수집, DB 저장 | Yes | +| **strategy-engine** | 플러그인 전략 로드 및 시그널 생성 | 봇 실행 시 | +| **order-executor** | 시그널 받아 실제 주문 실행 + 리스크 관리 | 봇 실행 시 | +| **portfolio-manager** | 잔고, 손익, 포지션 추적 | Yes | +| **backtester** | 과거 데이터로 전략 검증 | 요청 시 | +| **shared** | 공통 모델, 이벤트 정의, 유틸리티 (라이브러리) | — | +| **cli** | 사용자 인터페이스, 각 서비스 제어 | — | + +### 통신 흐름 + +``` +[Binance WS] + │ + ▼ +data-collector ──publish──▶ Redis Stream: "candles.{symbol}" + │ + ┌───────────────┤ + ▼ ▼ + strategy-engine backtester (과거 데이터는 DB에서) + │ + ▼ + Redis Stream: "signals" + │ + ▼ + order-executor + │ + ┌───────┴───────┐ + ▼ ▼ + [Binance API] Redis Stream: "orders" + │ + ▼ + portfolio-manager +``` + +--- + +## Project Structure + +``` +trading/ +├── services/ +│ ├── data-collector/ +│ │ ├── src/ +│ │ │ ├── __init__.py +│ │ │ ├── main.py # 서비스 진입점 +│ │ │ ├── binance_ws.py # WebSocket 실시간 시세 +│ │ │ ├── binance_rest.py # REST 과거 데이터 수집 +│ │ │ ├── storage.py # DB 저장 로직 +│ │ │ └── config.py +│ │ ├── tests/ +│ │ ├── Dockerfile +│ │ └── pyproject.toml +│ │ +│ ├── strategy-engine/ +│ │ ├── src/ +│ │ │ ├── __init__.py +│ │ │ ├── main.py +│ │ │ ├── engine.py # 전략 로더 + 실행기 +│ │ │ ├── plugin_loader.py # 플러그인 동적 로드 +│ │ │ └── config.py +│ │ ├── strategies/ # 플러그인 전략 디렉토리 +│ │ │ ├── base.py # 전략 추상 클래스 +│ │ │ ├── rsi_strategy.py # 예시: RSI 전략 +│ │ │ └── grid_strategy.py # 예시: 그리드 전략 +│ │ ├── tests/ +│ │ ├── Dockerfile +│ │ └── pyproject.toml +│ │ +│ ├── order-executor/ +│ │ ├── src/ +│ │ │ ├── __init__.py +│ │ │ ├── main.py +│ │ │ ├── executor.py # 주문 실행 로직 +│ │ │ ├── risk_manager.py # 리스크 관리 (손절/익절) +│ │ │ └── config.py +│ │ ├── tests/ +│ │ ├── Dockerfile +│ │ └── pyproject.toml +│ │ +│ ├── portfolio-manager/ +│ │ ├── src/ +│ │ │ ├── __init__.py +│ │ │ ├── main.py +│ │ │ ├── portfolio.py # 잔고/포지션 추적 +│ │ │ ├── pnl.py # 손익 계산 +│ │ │ └── config.py +│ │ ├── tests/ +│ │ ├── Dockerfile +│ │ └── pyproject.toml +│ │ +│ └── backtester/ +│ ├── src/ +│ │ ├── __init__.py +│ │ ├── main.py +│ │ ├── engine.py # 백테스팅 엔진 +│ │ ├── simulator.py # 가상 주문 시뮬레이터 +│ │ ├── reporter.py # 결과 리포트 생성 +│ │ └── config.py +│ ├── tests/ +│ ├── Dockerfile +│ └── pyproject.toml +│ +├── shared/ +│ ├── src/shared/ +│ │ ├── __init__.py +│ │ ├── models.py # 공통 데이터 모델 +│ │ ├── events.py # 이벤트 타입 정의 +│ │ ├── broker.py # Redis Streams 클라이언트 +│ │ ├── db.py # DB 연결 (PostgreSQL) +│ │ └── config.py # 공통 설정 +│ ├── tests/ +│ └── pyproject.toml +│ +├── cli/ +│ ├── src/ +│ │ ├── __init__.py +│ │ ├── main.py # Click 기반 CLI 진입점 +│ │ ├── commands/ +│ │ │ ├── data.py # 데이터 수집 명령 +│ │ │ ├── trade.py # 매매 시작/중지 +│ │ │ ├── backtest.py # 백테스팅 실행 +│ │ │ ├── portfolio.py # 포트폴리오 조회 +│ │ │ └── strategy.py # 전략 관리 +│ │ └── config.py +│ ├── tests/ +│ └── pyproject.toml +│ +├── docker-compose.yml # 전체 서비스 오케스트레이션 +├── .env.example # 환경변수 템플릿 +├── Makefile # 공통 명령어 +└── README.md +``` + +--- + +## Tech Stack + +| 용도 | 라이브러리 | +|------|-----------| +| 거래소 API | **ccxt** | +| 메시지 브로커 | **Redis Streams** | +| DB | **PostgreSQL** + **asyncpg** | +| CLI | **Click** | +| 데이터 분석 | **pandas**, **numpy** | +| 기술 지표 | **pandas-ta** | +| 비동기 처리 | **asyncio** + **aiohttp** | +| 설정 관리 | **pydantic-settings** | +| 컨테이너 | **Docker** + **docker-compose** | +| 테스트 | **pytest** + **pytest-asyncio** | + +--- + +## Data Models + +### Core Models (shared/models.py) + +```python +class Candle: + symbol: str # "BTCUSDT" + timeframe: str # "1m", "5m", "1h" + open_time: datetime + open: Decimal + high: Decimal + low: Decimal + close: Decimal + volume: Decimal + +class Signal: + strategy: str # "rsi_strategy" + symbol: str + side: "BUY" | "SELL" + price: Decimal + quantity: Decimal + reason: str # 시그널 발생 근거 + +class Order: + id: str + signal_id: str # 추적용 + symbol: str + side: "BUY" | "SELL" + type: "MARKET" | "LIMIT" + price: Decimal + quantity: Decimal + status: "PENDING" | "FILLED" | "CANCELLED" | "FAILED" + created_at: datetime + filled_at: datetime | None + +class Position: + symbol: str + quantity: Decimal + avg_entry_price: Decimal + current_price: Decimal + unrealized_pnl: Decimal +``` + +### PostgreSQL Tables + +| 테이블 | 용도 | +|--------|------| +| `candles` | 시세 이력 (파티셔닝: symbol + timeframe) | +| `signals` | 전략 시그널 이력 | +| `orders` | 주문 이력 | +| `trades` | 체결 이력 | +| `positions` | 현재 포지션 | +| `portfolio_snapshots` | 일별 포트폴리오 스냅샷 | + +### Storage Strategy + +- **실시간 시세:** Redis 캐싱 + PostgreSQL 영구 저장 +- **주문/체결:** PostgreSQL 즉시 기록 +- **백테스팅 데이터:** PostgreSQL에서 bulk read (pandas DataFrame) + +--- + +## Strategy Plugin System + +### Base Interface + +```python +from abc import ABC, abstractmethod +from shared.models import Candle, Signal + +class BaseStrategy(ABC): + @abstractmethod + def on_candle(self, candle: Candle) -> Signal | None: + """캔들 데이터 수신 시 시그널 반환""" + pass + + @abstractmethod + def configure(self, params: dict) -> None: + """전략 파라미터 설정""" + pass +``` + +새 전략 추가 = `BaseStrategy` 상속 파일 하나 작성 후 `strategies/` 디렉토리에 배치. + +### 예시 전략 + +- **RSI Strategy:** RSI 과매도 시 매수, 과매수 시 매도 +- **Grid Strategy:** 가격 구간을 나눠 자동 매수/매도 주문 배치 + +--- + +## CLI Interface + +```bash +# 데이터 수집 +trading data collect --symbol BTCUSDT --timeframe 1m +trading data history --symbol BTCUSDT --from 2025-01-01 +trading data list + +# 자동매매 +trading trade start --strategy rsi --symbol BTCUSDT +trading trade stop --strategy rsi +trading trade status + +# 수동매매 +trading order buy --symbol BTCUSDT --quantity 0.01 +trading order sell --symbol BTCUSDT --price 70000 +trading order cancel --id abc123 + +# 백테스팅 +trading backtest run --strategy rsi --symbol BTCUSDT \ + --from 2025-01-01 --to 2025-12-31 +trading backtest report --id latest + +# 포트폴리오 +trading portfolio show +trading portfolio history --days 30 + +# 전략 관리 +trading strategy list +trading strategy info --name rsi + +# 서비스 관리 +trading service up +trading service down +trading service logs --name strategy-engine +``` + +--- + +## Risk Management + +### Risk Check Pipeline (order-executor) + +시그널 수신 시 다음 체크를 순서대로 통과해야 주문 실행: + +1. 최대 포지션 크기 초과 여부 +2. 일일 최대 손실 한도 도달 여부 +3. 동일 심볼 중복 주문 방지 +4. 주문 금액 < 가용 잔고 확인 +5. 가격 급변 감지 (슬리피지 보호) + +### Safety Mechanisms + +| 장치 | 설명 | +|------|------| +| **긴급 정지 (Kill Switch)** | `trading trade stop-all` — 모든 봇 중지, 미체결 주문 전량 취소 | +| **일일 손실 한도** | 설정 비율 초과 시 자동 매매 중단 | +| **최대 포지션 제한** | 총 자산 대비 단일 심볼 비율 제한 | +| **연결 끊김 대응** | Binance 연결 끊기면 신규 주문 중단, 재연결 시도 | +| **드라이런 모드** | 실제 주문 없이 시그널만 생성 — 전략 검증용 | + +--- + +## Configuration (.env) + +``` +BINANCE_API_KEY= +BINANCE_API_SECRET= +REDIS_URL=redis://localhost:6379 +DATABASE_URL=postgresql://user:pass@localhost:5432/trading +LOG_LEVEL=INFO +RISK_MAX_POSITION_SIZE=0.1 +RISK_STOP_LOSS_PCT=5 +RISK_DAILY_LOSS_LIMIT_PCT=10 +DRY_RUN=true +``` + +--- + +## Docker Compose Services + +```yaml +services: + redis: # 메시지 브로커 (항상 실행) + postgres: # 데이터 저장소 (항상 실행) + data-collector: # 시세 수집 (항상 실행) + strategy-engine: # 전략 엔진 (봇 실행 시) + order-executor: # 주문 실행 (봇 실행 시) + portfolio-manager: # 포트폴리오 (항상 실행) +``` |
