47 lines
1.3 KiB
Python
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,
|
|
}
|