Local changes: Updated model training, removed debug instrumentation, and configuration improvements
This commit is contained in:
84
backend/api/portfolio.py
Normal file
84
backend/api/portfolio.py
Normal file
@@ -0,0 +1,84 @@
|
||||
"""Portfolio API endpoints."""
|
||||
|
||||
from typing import Optional
|
||||
from fastapi import APIRouter, HTTPException, Depends, Query
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from ..core.dependencies import get_portfolio_tracker
|
||||
from ..core.schemas import PortfolioResponse, PortfolioHistoryResponse
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
# Import portfolio analytics
|
||||
def get_portfolio_analytics():
|
||||
"""Get portfolio analytics instance."""
|
||||
from src.portfolio.analytics import get_portfolio_analytics as _get_analytics
|
||||
return _get_analytics()
|
||||
|
||||
|
||||
@router.get("/current", response_model=PortfolioResponse)
|
||||
async def get_current_portfolio(
|
||||
paper_trading: bool = True,
|
||||
tracker=Depends(get_portfolio_tracker)
|
||||
):
|
||||
"""Get current portfolio state."""
|
||||
try:
|
||||
portfolio = await tracker.get_current_portfolio(paper_trading=paper_trading)
|
||||
return PortfolioResponse(**portfolio)
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@router.get("/history", response_model=PortfolioHistoryResponse)
|
||||
async def get_portfolio_history(
|
||||
days: int = Query(30, ge=1, le=365),
|
||||
paper_trading: bool = True,
|
||||
tracker=Depends(get_portfolio_tracker)
|
||||
):
|
||||
"""Get portfolio history."""
|
||||
try:
|
||||
history = await tracker.get_portfolio_history(days=days, paper_trading=paper_trading)
|
||||
|
||||
dates = [h['timestamp'] if isinstance(h['timestamp'], str) else h['timestamp'].isoformat()
|
||||
for h in history]
|
||||
values = [float(h['total_value']) for h in history]
|
||||
pnl = [float(h.get('total_pnl', 0)) for h in history]
|
||||
|
||||
return PortfolioHistoryResponse(
|
||||
dates=dates,
|
||||
values=values,
|
||||
pnl=pnl
|
||||
)
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@router.post("/positions/update-prices")
|
||||
async def update_positions_prices(
|
||||
prices: dict,
|
||||
paper_trading: bool = True,
|
||||
tracker=Depends(get_portfolio_tracker)
|
||||
):
|
||||
"""Update current prices for positions."""
|
||||
try:
|
||||
from decimal import Decimal
|
||||
price_dict = {k: Decimal(str(v)) for k, v in prices.items()}
|
||||
await tracker.update_positions_prices(price_dict, paper_trading=paper_trading)
|
||||
return {"status": "updated"}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@router.get("/risk-metrics")
|
||||
async def get_risk_metrics(
|
||||
days: int = Query(30, ge=1, le=365),
|
||||
paper_trading: bool = True,
|
||||
analytics=Depends(get_portfolio_analytics)
|
||||
):
|
||||
"""Get portfolio risk metrics."""
|
||||
try:
|
||||
metrics = await analytics.get_performance_metrics(days=days, paper_trading=paper_trading)
|
||||
return metrics
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
Reference in New Issue
Block a user