mirror of
https://github.com/Xe138/AI-Trader.git
synced 2026-04-01 17:17:24 -04:00
51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
"""Period metrics calculation for date range queries."""
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
def calculate_period_metrics(
|
|
starting_value: float,
|
|
ending_value: float,
|
|
start_date: str,
|
|
end_date: str,
|
|
trading_days: int
|
|
) -> dict:
|
|
"""Calculate period return and annualized return.
|
|
|
|
Args:
|
|
starting_value: Portfolio value at start of period
|
|
ending_value: Portfolio value at end of period
|
|
start_date: Start date (YYYY-MM-DD)
|
|
end_date: End date (YYYY-MM-DD)
|
|
trading_days: Number of actual trading days in period
|
|
|
|
Returns:
|
|
Dict with period_return_pct, annualized_return_pct, calendar_days, trading_days
|
|
"""
|
|
# Calculate calendar days (inclusive)
|
|
start_dt = datetime.strptime(start_date, "%Y-%m-%d")
|
|
end_dt = datetime.strptime(end_date, "%Y-%m-%d")
|
|
calendar_days = (end_dt - start_dt).days + 1
|
|
|
|
# Calculate period return
|
|
if starting_value == 0:
|
|
period_return_pct = 0.0
|
|
else:
|
|
period_return_pct = ((ending_value - starting_value) / starting_value) * 100
|
|
|
|
# Calculate annualized return
|
|
if calendar_days == 0 or starting_value == 0 or ending_value <= 0:
|
|
annualized_return_pct = 0.0
|
|
else:
|
|
# Formula: ((ending / starting) ** (365 / days) - 1) * 100
|
|
annualized_return_pct = ((ending_value / starting_value) ** (365 / calendar_days) - 1) * 100
|
|
|
|
return {
|
|
"starting_portfolio_value": starting_value,
|
|
"ending_portfolio_value": ending_value,
|
|
"period_return_pct": round(period_return_pct, 2),
|
|
"annualized_return_pct": round(annualized_return_pct, 2),
|
|
"calendar_days": calendar_days,
|
|
"trading_days": trading_days
|
|
}
|