36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
"""Tests for portfolio analytics."""
|
|
|
|
import pytest
|
|
import pandas as pd
|
|
import numpy as np
|
|
from src.portfolio.analytics import get_portfolio_analytics, PortfolioAnalytics
|
|
|
|
|
|
class TestPortfolioAnalytics:
|
|
"""Tests for PortfolioAnalytics."""
|
|
|
|
@pytest.fixture
|
|
def analytics(self):
|
|
"""Create portfolio analytics instance."""
|
|
return get_portfolio_analytics()
|
|
|
|
def test_calculate_sharpe_ratio(self, analytics):
|
|
"""Test Sharpe ratio calculation."""
|
|
returns = pd.Series([0.01, -0.005, 0.02, -0.01, 0.015])
|
|
sharpe = analytics.calculate_sharpe_ratio(returns, risk_free_rate=0.0)
|
|
assert isinstance(sharpe, float)
|
|
|
|
def test_calculate_sortino_ratio(self, analytics):
|
|
"""Test Sortino ratio calculation."""
|
|
returns = pd.Series([0.01, -0.005, 0.02, -0.01, 0.015])
|
|
sortino = analytics.calculate_sortino_ratio(returns, risk_free_rate=0.0)
|
|
assert isinstance(sortino, float)
|
|
|
|
def test_calculate_max_drawdown(self, analytics):
|
|
"""Test max drawdown calculation."""
|
|
equity_curve = pd.Series([10000, 10500, 10200, 11000, 10800])
|
|
drawdown = analytics.calculate_max_drawdown(equity_curve)
|
|
assert isinstance(drawdown, float)
|
|
assert 0 <= drawdown <= 1
|
|
|