penti/backend/app/schemas/backtest.py

87 lines
2.1 KiB
Python
Raw Permalink Normal View History

2026-01-31 23:30:51 +09:00
"""Backtest schemas."""
from pydantic import BaseModel, Field
from typing import List, Dict, Any, Optional
from datetime import datetime, date
from uuid import UUID
class BacktestConfig(BaseModel):
"""백테스트 설정."""
name: str = Field(..., description="백테스트 이름")
strategy_name: str = Field(..., description="전략 이름")
start_date: date = Field(..., description="시작일")
end_date: date = Field(..., description="종료일")
initial_capital: float = Field(default=10000000.0, description="초기 자본금")
commission_rate: float = Field(default=0.0015, description="수수료율")
rebalance_frequency: str = Field(default='monthly', description="리밸런싱 주기")
strategy_config: Optional[Dict[str, Any]] = Field(default=None, description="전략 설정")
class TradeResponse(BaseModel):
"""거래 응답."""
ticker: str
action: str
quantity: float
price: float
date: datetime
class EquityCurvePoint(BaseModel):
"""자산 곡선 포인트."""
date: datetime
value: float
cash: float
positions_value: float
class BacktestResults(BaseModel):
"""백테스트 결과."""
initial_capital: float
final_value: float
total_return_pct: float
cagr: float
max_drawdown_pct: float
sharpe_ratio: float
sortino_ratio: float
volatility: float
win_rate_pct: float
calmar_ratio: float
total_trades: int
equity_curve: List[Dict[str, Any]]
trades: List[Dict[str, Any]]
class BacktestRunResponse(BaseModel):
"""백테스트 실행 응답."""
id: UUID
name: str
strategy_name: str
start_date: date
end_date: date
initial_capital: float
status: str
config: Optional[Dict[str, Any]]
results: Optional[BacktestResults]
created_at: datetime
class Config:
from_attributes = True
class BacktestRunCreate(BaseModel):
"""백테스트 실행 생성 요청."""
config: BacktestConfig
class BacktestListResponse(BaseModel):
"""백테스트 목록 응답."""
items: List[BacktestRunResponse]
total: int