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.
146 lines
3.4 KiB
Python
146 lines
3.4 KiB
Python
from datetime import datetime
|
|
from typing import Optional, List, Dict, Any
|
|
from pydantic import BaseModel, Field
|
|
from app.models.enums import (
|
|
RegionEnum,
|
|
StrategyEnum,
|
|
TradeTypeEnum,
|
|
BacktestStatusEnum,
|
|
ModelType,
|
|
AlertTypeEnum,
|
|
TrainingStatusEnum,
|
|
)
|
|
|
|
|
|
class PriceData(BaseModel):
|
|
timestamp: datetime
|
|
region: RegionEnum
|
|
day_ahead_price: float
|
|
real_time_price: float
|
|
volume_mw: float
|
|
|
|
|
|
class BatteryState(BaseModel):
|
|
timestamp: datetime
|
|
battery_id: str
|
|
capacity_mwh: float
|
|
charge_level_mwh: float
|
|
charge_rate_mw: float
|
|
discharge_rate_mw: float
|
|
efficiency: float
|
|
charge_level_pct: float = Field(default_factory=lambda: 0.0)
|
|
|
|
|
|
class BacktestConfig(BaseModel):
|
|
start_date: str
|
|
end_date: str
|
|
strategies: List[StrategyEnum] = Field(default_factory=list)
|
|
use_ml: bool = True
|
|
battery_min_reserve: Optional[float] = None
|
|
battery_max_charge: Optional[float] = None
|
|
arbitrage_min_spread: Optional[float] = None
|
|
|
|
|
|
class BacktestMetrics(BaseModel):
|
|
total_revenue: float
|
|
arbitrage_profit: float
|
|
battery_revenue: float
|
|
mining_profit: float
|
|
battery_utilization: float
|
|
price_capture_rate: float
|
|
win_rate: float
|
|
sharpe_ratio: float
|
|
max_drawdown: float
|
|
total_trades: int
|
|
|
|
|
|
class TrainingRequest(BaseModel):
|
|
model_type: ModelType
|
|
horizon: Optional[int] = None
|
|
start_date: str
|
|
end_date: str
|
|
hyperparameters: Dict[str, Any] = Field(default_factory=dict)
|
|
|
|
|
|
class PredictionResponse(BaseModel):
|
|
model_id: str
|
|
timestamp: datetime
|
|
prediction: float
|
|
confidence: Optional[float] = None
|
|
features_used: List[str] = Field(default_factory=list)
|
|
|
|
|
|
class ModelInfo(BaseModel):
|
|
model_id: str
|
|
model_type: ModelType
|
|
version: str
|
|
created_at: datetime
|
|
metrics: Dict[str, float] = Field(default_factory=dict)
|
|
hyperparameters: Dict[str, Any] = Field(default_factory=dict)
|
|
|
|
|
|
class TrainingStatus(BaseModel):
|
|
training_id: str
|
|
status: TrainingStatusEnum
|
|
progress: float = 0.0
|
|
current_epoch: Optional[int] = None
|
|
total_epochs: Optional[int] = None
|
|
metrics: Dict[str, float] = Field(default_factory=dict)
|
|
error_message: Optional[str] = None
|
|
started_at: Optional[datetime] = None
|
|
completed_at: Optional[datetime] = None
|
|
|
|
|
|
class ArbitrageOpportunity(BaseModel):
|
|
timestamp: datetime
|
|
buy_region: RegionEnum
|
|
sell_region: RegionEnum
|
|
buy_price: float
|
|
sell_price: float
|
|
spread: float
|
|
volume_mw: float
|
|
|
|
|
|
class DashboardSummary(BaseModel):
|
|
latest_timestamp: datetime
|
|
total_volume_mw: float
|
|
avg_realtime_price: float
|
|
arbitrage_count: int
|
|
battery_count: int
|
|
avg_battery_charge: float
|
|
|
|
|
|
class Trade(BaseModel):
|
|
timestamp: datetime
|
|
backtest_id: str
|
|
trade_type: TradeTypeEnum
|
|
region: Optional[RegionEnum] = None
|
|
price: float
|
|
volume_mw: float
|
|
revenue: float
|
|
battery_id: Optional[str] = None
|
|
|
|
|
|
class StrategyStatus(BaseModel):
|
|
strategy: StrategyEnum
|
|
enabled: bool
|
|
last_execution: Optional[datetime] = None
|
|
total_trades: int = 0
|
|
profit_loss: float = 0.0
|
|
|
|
|
|
class Alert(BaseModel):
|
|
alert_id: str
|
|
alert_type: AlertTypeEnum
|
|
timestamp: datetime
|
|
message: str
|
|
data: Dict[str, Any] = Field(default_factory=dict)
|
|
acknowledged: bool = False
|
|
|
|
|
|
class AppSettings(BaseModel):
|
|
battery_min_reserve: float
|
|
battery_max_charge: float
|
|
arbitrage_min_spread: float
|
|
mining_margin_threshold: float
|