Add FastAPI backend for energy trading system
Implements FastAPI backend with ML model support for energy trading, including price prediction models and RL-based battery trading policy. Features dashboard, trading, backtest, and settings API routes with WebSocket support for real-time updates.
This commit is contained in:
108
backend/app/api/routes/backtest.py
Normal file
108
backend/app/api/routes/backtest.py
Normal file
@@ -0,0 +1,108 @@
|
||||
from typing import List, Optional
|
||||
from fastapi import APIRouter, BackgroundTasks, HTTPException
|
||||
from datetime import datetime
|
||||
from app.models.schemas import (
|
||||
BacktestConfig,
|
||||
BacktestMetrics,
|
||||
BacktestStatusEnum,
|
||||
Trade,
|
||||
)
|
||||
from app.utils.logger import get_logger
|
||||
import uuid
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
_backtest_store: dict = {}
|
||||
_backtest_results: dict = {}
|
||||
|
||||
|
||||
@router.post("/start")
|
||||
async def start_backtest(config: BacktestConfig, name: Optional[str] = None):
|
||||
backtest_id = str(uuid.uuid4())
|
||||
|
||||
_backtest_store[backtest_id] = {
|
||||
"backtest_id": backtest_id,
|
||||
"name": name or f"Backtest {backtest_id[:8]}",
|
||||
"status": BacktestStatusEnum.RUNNING,
|
||||
"config": config.dict(),
|
||||
"created_at": datetime.utcnow(),
|
||||
"started_at": datetime.utcnow(),
|
||||
"completed_at": None,
|
||||
"error_message": None,
|
||||
}
|
||||
|
||||
logger.info(f"Backtest started: {backtest_id}")
|
||||
|
||||
return {
|
||||
"backtest_id": backtest_id,
|
||||
"status": BacktestStatusEnum.RUNNING,
|
||||
"name": _backtest_store[backtest_id]["name"],
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{backtest_id}")
|
||||
async def get_backtest_status(backtest_id: str):
|
||||
if backtest_id not in _backtest_store:
|
||||
raise HTTPException(status_code=404, detail=f"Backtest {backtest_id} not found")
|
||||
|
||||
backtest = _backtest_store[backtest_id]
|
||||
result = _backtest_results.get(backtest_id)
|
||||
|
||||
return {
|
||||
"status": backtest["status"],
|
||||
"name": backtest["name"],
|
||||
"created_at": backtest["created_at"],
|
||||
"started_at": backtest["started_at"],
|
||||
"completed_at": backtest["completed_at"],
|
||||
"error_message": backtest["error_message"],
|
||||
"results": result if backtest["status"] == BacktestStatusEnum.COMPLETED else None,
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{backtest_id}/results")
|
||||
async def get_backtest_results(backtest_id: str):
|
||||
if backtest_id not in _backtest_results:
|
||||
raise HTTPException(status_code=404, detail=f"Results for backtest {backtest_id} not found")
|
||||
|
||||
return _backtest_results[backtest_id]
|
||||
|
||||
|
||||
@router.get("/{backtest_id}/trades")
|
||||
async def get_backtest_trades(backtest_id: str, limit: int = 100):
|
||||
if backtest_id not in _backtest_store:
|
||||
raise HTTPException(status_code=404, detail=f"Backtest {backtest_id} not found")
|
||||
|
||||
trades = _backtest_results.get(backtest_id, {}).get("trades", [])
|
||||
return {"backtest_id": backtest_id, "trades": trades[-limit:], "total": len(trades)}
|
||||
|
||||
|
||||
@router.get("/history")
|
||||
async def get_backtest_history():
|
||||
backtests = []
|
||||
for backtest_id, backtest in _backtest_store.items():
|
||||
backtests.append(
|
||||
{
|
||||
"backtest_id": backtest_id,
|
||||
"name": backtest["name"],
|
||||
"status": backtest["status"],
|
||||
"created_at": backtest["created_at"],
|
||||
"completed_at": backtest["completed_at"],
|
||||
}
|
||||
)
|
||||
|
||||
return {"backtests": backtests, "total": len(backtests)}
|
||||
|
||||
|
||||
@router.delete("/{backtest_id}")
|
||||
async def delete_backtest(backtest_id: str):
|
||||
if backtest_id not in _backtest_store:
|
||||
raise HTTPException(status_code=404, detail=f"Backtest {backtest_id} not found")
|
||||
|
||||
del _backtest_store[backtest_id]
|
||||
if backtest_id in _backtest_results:
|
||||
del _backtest_results[backtest_id]
|
||||
|
||||
logger.info(f"Backtest deleted: {backtest_id}")
|
||||
return {"message": f"Backtest {backtest_id} deleted"}
|
||||
Reference in New Issue
Block a user