rmi-backend/app/analyzer/pnl_calculator.py

47 lines
1.3 KiB
Python

"""
Token-level PnL calculator.
Calculates profit/loss when user provides their average buy price.
"""
def calculate_token_pnl(token: dict, avg_cost: float) -> dict:
"""
Calculate PnL for a specific token given user's average buy price.
Args:
token: Enriched token dict from build_portfolio()
avg_cost: User's average buy price in USD
Returns:
{
"symbol": str,
"qty": float,
"avg_cost": float,
"current_price": float,
"cost_basis": float,
"current_value": float,
"pnl_usd": float,
"pnl_pct": float,
"is_profit": bool,
}
"""
qty = token.get("qty", 0)
current_price = token.get("price", 0)
cost_basis = avg_cost * qty
current_value = current_price * qty
pnl_usd = current_value - cost_basis
pnl_pct = (pnl_usd / cost_basis * 100) if cost_basis > 0 else 0.0
return {
"symbol": token.get("symbol", "?"),
"name": token.get("name", "?"),
"qty": qty,
"avg_cost": avg_cost,
"current_price": current_price,
"cost_basis": cost_basis,
"current_value": current_value,
"pnl_usd": pnl_usd,
"pnl_pct": pnl_pct,
"is_profit": pnl_usd >= 0,
}