다중 AI 애널리스트 기반 퀀트 트레이딩 시뮬레이션 시스템. yfinance로 SPY ETF 30년+ 데이터를 수집하고, 3명의 규칙 기반 애널리스트가 독립 분석 후 앙상블로 매매 판단을 내리며, 백테스트로 성과를 검증합니다.
┌─────────────────────────────────────────────────────────────┐
│ Vue.js Frontend (:3000) │
│ ┌─────────┬──────────┬──────────┬──────────┬─────────────┐ │
│ │ Step 1 │ Step 2 │ Step 3 │ Step 4 │ Step 5 │ │
│ │데이터수집│분석설정 │시뮬레이션│백테스트 │ 리포트 │ │
│ └─────────┴──────────┴──────────┴──────────┴─────────────┘ │
│ TradingView Charts │ Dashboard │ History │
└─────────────────────┬───────────────────────────────────────┘
│ /api/* (Proxy)
┌─────────────────────▼───────────────────────────────────────┐
│ Flask Backend (:5001) │
│ ┌──────────┬────────────┬───────────┬──────────────┐ │
│ │ data API │analysis API│backtest AP│ history API │ │
│ └────┬─────┴─────┬──────┴─────┬─────┴──────┬───────┘ │
│ │ │ │ │ │
│ ┌────▼─────┬─────▼──────┬─────▼──────┬─────▼─────┐ │
│ │ data │ analysis │ backtest │ history │ │
│ │ service │ service │ service │ service │ │
│ └────┬─────┴─────┬──────┴─────┬──────┴───────────┘ │
└───────┼───────────┼────────────┼────────────────────────────┘
│ │ │
┌───────▼───────────▼────────────▼────────────────────────────┐
│ Core Engine (Python) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │data_collector│ │data_processor│ │ ensemble.py │ │
│ │ (yfinance) │ │ (ta 지표) │ │ (가중 결합) │ │
│ └──────────────┘ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────────────┬──────────────┬─────────────┤ │
│ │MacroAnalyst │TechAnalyst │SentAnalyst │ │
│ │(추세/이평선) │(RSI/MACD/BB) │(거래량/모멘텀)│ │
│ │ 35% │ 40% │ 25% │ │
│ └──────────────┴──────────────┴─────────────┘ │
│ │
│ ┌──────────────┐ │
│ │ backtester │ → 수익률, 샤프비율, MDD, 승률 │
│ └──────────────┘ │
└──────────────────────────────────────────────────────────────┘
QuantMiroFish/
│
├── main.py # CLI 실행 진입점 (UI 없이 콘솔에서 테스트)
├── config.py # 전체 설정 상수
├── data_collector.py # yfinance 데이터 수집 + CSV 캐싱
├── data_processor.py # 기술적 지표 19개 계산 (ta 라이브러리)
├── ensemble.py # 애널리스트 신호 가중 앙상블
├── backtester.py # 포트폴리오 시뮬레이션 + 성과 지표
├── requirements.txt # 코어 엔진 의존성
│
├── analysts/ # AI 애널리스트 모듈
│ ├── base_analyst.py # 추상 베이스 클래스 + AnalystSignal 타입
│ ├── macro_analyst.py # 거시경제: SMA 크로스, 이격도, ATR 변동성
│ ├── technical_analyst.py # 기술적: RSI 과매수/과매도, MACD 크로스, 볼린저밴드
│ └── sentiment_analyst.py # 시장심리: 거래량 비율, OBV 추세, ROC, 스토캐스틱
│
├── backend/ # Flask 백엔드 (Web UI용)
│ ├── run.py # 서버 진입점
│ ├── requirements.txt
│ └── app/
│ ├── __init__.py # App factory
│ ├── config.py # Flask 설정
│ ├── api/ # REST API (4개 Blueprint)
│ │ ├── data.py # /api/data/* - 데이터 수집
│ │ ├── analysis.py # /api/analysis/* - 앙상블 분석
│ │ ├── backtest.py # /api/backtest/* - 백테스트
│ │ └── history.py # /api/history/* - 히스토리 CRUD
│ ├── models/
│ │ ├── task.py # TaskManager (비동기 작업 추적)
│ │ └── session.py # 세션별 DataFrame 인메모리 관리
│ ├── services/ # 코어 엔진 래핑 서비스
│ │ ├── data_service.py
│ │ ├── analysis_service.py
│ │ ├── backtest_service.py
│ │ └── history_service.py
│ └── utils/
│ ├── serializers.py # DataFrame → JSON 변환
│ └── logger.py
│
├── frontend/ # Vue.js 프론트엔드
│ ├── package.json
│ ├── vite.config.js # /api/* → localhost:5001 프록시
│ └── src/
│ ├── App.vue
│ ├── main.js
│ ├── router/index.js
│ ├── api/ # Axios API 클라이언트
│ │ ├── index.js # 공통 인스턴스 + 폴링 헬퍼
│ │ ├── data.js
│ │ ├── analysis.js
│ │ ├── backtest.js
│ │ └── history.js
│ ├── views/
│ │ ├── Home.vue # 랜딩 + 히스토리 목록
│ │ └── MainView.vue # 5단계 워크플로우 컨테이너
│ └── components/
│ ├── StepIndicator.vue
│ ├── Step1DataCollection.vue
│ ├── Step2AnalysisConfig.vue
│ ├── Step3SimulationRun.vue
│ ├── Step4BacktestResults.vue
│ ├── Step5AnalysisReport.vue
│ ├── charts/ # TradingView lightweight-charts
│ │ ├── PriceChart.vue # 캔들스틱 + SMA
│ │ ├── PortfolioChart.vue # 전략 vs 벤치마크
│ │ ├── DrawdownChart.vue
│ │ └── SignalChart.vue # 애널리스트별 신호
│ ├── dashboard/
│ │ ├── MetricsGrid.vue # 8개 KPI 카드
│ │ ├── TradeTable.vue # 거래내역 페이지네이션
│ │ └── SignalDistribution.vue
│ └── common/
│ ├── LoadingSpinner.vue
│ └── ProgressBar.vue
│
└── .gitignore
| 구분 | 기술 |
|---|---|
| 데이터 | yfinance (무료, API 키 불필요) |
| 지표 계산 | ta (순수 Python, TA-Lib 대체) |
| 백엔드 | Flask + Flask-CORS |
| 프론트엔드 | Vue 3 + Vite + Vue Router + Axios |
| 차트 | lightweight-charts (TradingView 오픈소스) |
| 통신 | 2초 간격 폴링 (비동기 작업 추적) |
- Python 3.11+
- Node.js 18+
cd QuantMiroFish
pip install -r requirements.txt
python main.py콘솔에 백테스트 결과 + matplotlib 차트 4개가 출력됩니다.
# 터미널 1: 백엔드 (포트 5001)
cd QuantMiroFish/backend
pip install -r requirements.txt
python run.py
# 터미널 2: 프론트엔드 (포트 3000)
cd QuantMiroFish/frontend
npm install
npm run dev브라우저에서 http://localhost:3000 접속
- 티커 선택 (기본: SPY), 기간 설정 (전체/10년/5년/1년)
- yfinance에서 OHLCV 데이터 다운로드
- 기술적 지표 19개 자동 계산 (SMA, EMA, RSI, MACD, BB, ATR, 스토캐스틱, ROC, OBV 등)
- 캔들스틱 차트 + SMA 50/200 오버레이로 데이터 확인
- 3명 애널리스트 가중치 슬라이더 조정 (기본: 거시 35%, 기술 40%, 심리 25%)
- RSI 과매수/과매도 임계값, 시그널 임계값 설정
- 초기 자본, 수수료율 설정
- 전체 기간에 대해 매일 3명의 애널리스트가 독립 분석 수행
- 실시간 진행률 표시 (2초 폴링)
- 각 애널리스트의 라이브 신호/신뢰도 카드 표시
- 분석 완료 후 자동으로 백테스트 실행
- 8개 KPI 카드: 총 수익률, 연간수익률, 샤프비율, MDD, 거래 횟수, 승률, 수익/손실 비율, Alpha
- 포트폴리오 차트: 전략 수익 vs Buy & Hold 비교
- 드로다운 차트: 최대 낙폭 시각화
- 거래내역 테이블: 전체 매매 기록 (페이지네이션)
- 애널리스트별 신호 시계열 차트
- BUY/SELL/HOLD 시그널 분포
- 애널리스트별 평균 신호, 평균 신뢰도 요약
- 히스토리 저장 기능 (과거 시뮬레이션 비교 가능)
| 지표 | 의미 | 기준 |
|---|---|---|
| 총 수익률 | 전략의 전체 수익 | 양수면 수익 |
| 연간 수익률 | 연평균 수익률 | 시장 평균(~10%) 대비 비교 |
| 샤프 비율 | 위험 대비 수익 | 1.0 이상이면 양호 |
| 최대 낙폭 (MDD) | 최대 손실 구간 | 작을수록 좋음 (-20% 이내 양호) |
| 승률 | 수익 거래 비율 | 50% 이상이면 양호 |
| 수익/손실 비율 | 총 이익 / 총 손실 | 1.0 이상이면 수익 우위 |
| Alpha | Buy & Hold 대비 초과 수익 | 양수면 시장 대비 우수 |
- SMA 50/200 골든/데드 크로스 체제 판단
- 가격 vs SMA 200 이격도로 과열/과매도 감지
- ATR 기반 변동성 필터로 신뢰도 조절
- RSI 30/70 과매도/과매수 시그널
- MACD 히스토그램 크로스오버 감지
- 볼린저밴드 %B로 밴드 돌파/스퀴즈 판단
- 거래량 비율 (현재 vs 20일 평균)로 세력 확인
- OBV 20일 기울기로 매집/분산 추세 판단
- ROC 모멘텀 + 스토캐스틱 %K/%D 크로스
config.py에서 조정 가능한 주요 값들:
# 거래 빈도 조절
SIGNAL_THRESHOLD = 0.2 # 낮추면 거래 빈번, 높이면 보수적
# 애널리스트 비중
ANALYST_WEIGHTS = {
"macro": 0.35, # 추세 추종 강화 시 증가
"technical": 0.40, # 단기 시그널 강화 시 증가
"sentiment": 0.25, # 거래량 확인 강화 시 증가
}
# 지표 민감도
RSI_OVERBOUGHT = 70 # 65로 낮추면 매도 민감도 증가
RSI_OVERSOLD = 30 # 35로 높이면 매수 민감도 증가
# 비용
COMMISSION_PCT = 0.001 # 수수료율 (0.1%)
INITIAL_CAPITAL = 100_000 # 초기 자본금- 이 시스템은 교육/시뮬레이션 목적이며 실제 투자 조언이 아닙니다
- 과거 성과가 미래 수익을 보장하지 않습니다
- Long-only 전략 (공매도 미지원)
- 슬리피지, 시장 충격 등 실제 거래 비용은 미반영
- yfinance 데이터는 조정 종가 기준이며 실시간 데이터가 아닙니다