Initial public release
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
# hydra/api/backtest.py
|
||||
from dataclasses import asdict
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from hydra.api.auth import verify_api_key
|
||||
from hydra.backtest.runner import BacktestRunner
|
||||
from hydra.indicator.calculator import IndicatorCalculator
|
||||
from hydra.regime.detector import RegimeDetector
|
||||
from hydra.strategy.signal import SignalGenerator
|
||||
|
||||
router = APIRouter(prefix="/backtest")
|
||||
_store = None
|
||||
|
||||
|
||||
def set_store_for_backtest(store) -> None:
|
||||
global _store
|
||||
_store = store
|
||||
|
||||
|
||||
class BacktestRequest(BaseModel):
|
||||
market: str
|
||||
symbol: str
|
||||
timeframe: str
|
||||
since: int
|
||||
until: int
|
||||
initial_capital: float = 10000.0
|
||||
trade_amount_usd: float = 100.0
|
||||
commission_pct: float = 0.001
|
||||
|
||||
|
||||
@router.post("/run")
|
||||
async def run_backtest(
|
||||
req: BacktestRequest,
|
||||
_: str = Depends(verify_api_key),
|
||||
):
|
||||
if _store is None:
|
||||
raise HTTPException(status_code=503, detail="Store not initialized")
|
||||
if req.since >= req.until:
|
||||
raise HTTPException(status_code=400, detail="since must be less than until")
|
||||
|
||||
runner = BacktestRunner(
|
||||
store=_store,
|
||||
calculator=IndicatorCalculator(),
|
||||
detector=RegimeDetector(),
|
||||
generator=SignalGenerator(),
|
||||
initial_capital=req.initial_capital,
|
||||
trade_amount_usd=req.trade_amount_usd,
|
||||
commission_pct=req.commission_pct,
|
||||
)
|
||||
try:
|
||||
result = await runner.run(
|
||||
market=req.market,
|
||||
symbol=req.symbol,
|
||||
timeframe=req.timeframe,
|
||||
since=req.since,
|
||||
until=req.until,
|
||||
)
|
||||
except ValueError as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
|
||||
return asdict(result)
|
||||
Reference in New Issue
Block a user