투자 전략을 가설 수준에서 정의하고, 과거 데이터로 반복 검증하며, 결과를 웹 UI에서 비교/분석할 수 있는 전략 리서치 플랫폼.
TradeMonster는 단순한 백테스팅 스크립트가 아니라, 다양한 투자 방법론(추세추종, 눌림목 매매 등)을 체계적으로 연구하고 검증할 수 있는 시스템입니다.
- 데이터 수집 — OHLCV 데이터를 수집하고 TimescaleDB에 저장
- 전략 엔진 — 플러그인 구조로 전략을 정의하고 관리
- 백테스트 엔진 — 전략 + 기간 + 종목 + 파라미터를 조합하여 과거 데이터로 검증
- 성과 분석 — 수익률, CAGR, MDD, 샤프지수, 승률, 손익비 등 핵심 지표 계산
- 웹 UI — 전략 관리, 백테스트 실행, 결과 시각화, 전략 비교를 하나의 인터페이스에서
Frontend (React + Vite + TypeScript)
│ REST API
Backend (FastAPI + Python)
│
┌────┴────┐
│ Services │
├──────────┤
│ Data │ → yfinance → TimescaleDB
│ Strategy │ → Plugin Registry (BaseStrategy)
│ Backtest │ → Vectorized Engine (pandas)
│ Metrics │ → Performance Calculator
└──────────┘
│
TimescaleDB (Docker)
| Layer | Technology |
|---|---|
| Backend | Python 3.13, FastAPI, SQLAlchemy 2.0, pandas, numpy |
| Frontend | React 18, Vite, TypeScript, Tailwind CSS, Recharts, Lightweight Charts |
| Database | TimescaleDB (PostgreSQL) |
| Data Source | yfinance |
| Package Manager | uv (Python), npm (Node) |
TradeMonster/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI entry point
│ │ ├── config.py # Settings
│ │ ├── database.py # DB connection
│ │ ├── api/ # REST endpoints
│ │ ├── models/ # SQLAlchemy models
│ │ ├── schemas/ # Pydantic schemas
│ │ ├── services/ # Business logic
│ │ └── strategies/ # Strategy implementations
│ ├── tests/
│ └── pyproject.toml
├── frontend/
│ ├── src/
│ │ ├── routes/ # Page components
│ │ ├── components/ # Reusable UI
│ │ ├── lib/ # API client, utils
│ │ └── types/ # TypeScript types
│ └── package.json
├── sql/
│ └── init.sql # DB schema
└── docker-compose.yaml # TimescaleDB
- Python 3.13+
- Node.js 20+
- Docker & Docker Compose
- uv (Python package manager)
docker-compose up -dcd backend
uv sync
cp ../.env.example ../.env # Edit with your settings
uv run python -m app.mainAPI server runs at http://localhost:8000. Docs at http://localhost:8000/docs.
cd frontend
npm install
npm run devWeb UI runs at http://localhost:5173.
이동평균선 정배열/역배열을 기반으로 추세 방향을 판단하고, 추세가 확인되면 진입하여 추세가 깨질 때까지 보유하는 전략.
Parameters:
fast_period(기본: 20) — 단기 이동평균slow_period(기본: 50) — 장기 이동평균trend_period(기본: 200) — 추세 판단 이동평균atr_multiplier(기본: 2.0) — ATR 기반 손절 배수
상승 추세에서 단기 조정(눌림)이 발생할 때 매수하여, 추세 재개 시 수익을 실현하는 전략.
Parameters:
trend_period(기본: 50) — 추세 판단 이동평균pullback_period(기본: 10) — 눌림 판단 기간rsi_period(기본: 14) — RSI 기간rsi_oversold(기본: 30) — RSI 과매도 기준atr_multiplier(기본: 1.5) — ATR 기반 손절 배수
| Metric | Description |
|---|---|
| Total Return | 전체 기간 누적 수익률 |
| CAGR | 연복리 수익률 |
| Max Drawdown | 최대 낙폭 (고점 대비 최대 하락률) |
| Sharpe Ratio | 위험 대비 수익 (무위험이자율 조정) |
| Win Rate | 수익 거래 비율 |
| Profit Factor | 총 이익 / 총 손실 |
| Total Trades | 전체 거래 횟수 |
| Method | Path | Description |
|---|---|---|
| GET | /api/assets |
자산 목록 |
| POST | /api/assets |
자산 등록 |
| POST | /api/data/collect |
데이터 수집 실행 |
| GET | /api/strategies |
전략 목록 |
| GET | /api/strategies/{id} |
전략 상세 |
| POST | /api/backtests |
백테스트 실행 |
| GET | /api/backtests/{id} |
백테스트 결과 |
| GET | /api/backtests |
실행 이력 |
| POST | /api/results/compare |
결과 비교 |
backend/app/strategies/에 새 파일 생성BaseStrategy를 상속하여 구현- 서버 재시작 시 자동 등록
from app.strategies.base import BaseStrategy, StrategyParameter
class MyStrategy(BaseStrategy):
name = "My Strategy"
description = "전략 설명"
version = "1.0.0"
parameters = [
StrategyParameter(name="period", type="int", default=20, description="기간"),
]
def generate_signals(self, data, parameters):
# 매수/매도 시그널 생성 로직
...
return signalsMIT