Added tests for max_drawdown
This commit is contained in:
parent
a19f7e7b21
commit
b2a4d73c59
@ -1,12 +1,13 @@
|
||||
import datetime
|
||||
import math
|
||||
import random
|
||||
from unittest import skip
|
||||
|
||||
import pytest
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from fincal.core import AllFrequencies, Frequency
|
||||
from fincal.exceptions import DateNotFoundError
|
||||
from fincal.fincal import TimeSeries, create_date_series
|
||||
from fincal.fincal import MaxDrawdown, TimeSeries, create_date_series
|
||||
from fincal.utils import FincalOptions
|
||||
|
||||
|
||||
@ -77,7 +78,9 @@ def create_test_timeseries(
|
||||
|
||||
start_date = datetime.datetime(2017, 1, 1)
|
||||
timedelta_dict = {
|
||||
frequency.freq_type: int(frequency.value * num * (7 / 5 if frequency == "D" and skip_weekends else 1))
|
||||
frequency.freq_type: int(
|
||||
frequency.value * num * (7 / 5 if frequency == AllFrequencies.D and skip_weekends else 1)
|
||||
)
|
||||
}
|
||||
end_date = start_date + relativedelta(**timedelta_dict)
|
||||
dates = create_date_series(start_date, end_date, frequency.symbol, skip_weekends=skip_weekends)
|
||||
@ -88,7 +91,7 @@ def create_test_timeseries(
|
||||
|
||||
class TestReturns:
|
||||
def test_returns_calc(self):
|
||||
ts = create_test_timeseries()
|
||||
ts = create_test_timeseries(AllFrequencies.D, skip_weekends=True)
|
||||
returns = ts.calculate_returns(
|
||||
"2020-01-01", annual_compounded_returns=False, return_period_unit="years", return_period_value=1
|
||||
)
|
||||
@ -120,7 +123,7 @@ class TestReturns:
|
||||
ts.calculate_returns("2020-04-04", return_period_unit="months", return_period_value=3, prior_match="exact")
|
||||
|
||||
def test_date_formats(self):
|
||||
ts = create_test_timeseries()
|
||||
ts = create_test_timeseries(AllFrequencies.D, skip_weekends=True)
|
||||
FincalOptions.date_format = "%d-%m-%Y"
|
||||
with pytest.raises(ValueError):
|
||||
ts.calculate_returns(
|
||||
@ -147,7 +150,7 @@ class TestReturns:
|
||||
|
||||
def test_limits(self):
|
||||
FincalOptions.date_format = "%Y-%m-%d"
|
||||
ts = create_test_timeseries()
|
||||
ts = create_test_timeseries(AllFrequencies.D)
|
||||
with pytest.raises(DateNotFoundError):
|
||||
ts.calculate_returns("2020-11-25", return_period_unit="days", return_period_value=90, closest_max_days=10)
|
||||
|
||||
@ -177,3 +180,31 @@ class TestVolatility:
|
||||
annualize_volatility=False,
|
||||
)
|
||||
assert round(sd, 6) == 0.020547
|
||||
|
||||
|
||||
class TestDrawdown:
|
||||
def test_daily_ts(self):
|
||||
ts = create_test_timeseries(AllFrequencies.D, skip_weekends=True)
|
||||
mdd = ts.max_drawdown()
|
||||
assert isinstance(mdd, dict)
|
||||
assert len(mdd) == 3
|
||||
assert all(i in mdd for i in ["start_date", "end_date", "drawdown"])
|
||||
expeced_response = {
|
||||
"start_date": datetime.datetime(2017, 6, 6, 0, 0),
|
||||
"end_date": datetime.datetime(2017, 7, 31, 0, 0),
|
||||
"drawdown": -0.028293686030751997,
|
||||
}
|
||||
assert mdd == expeced_response
|
||||
|
||||
def test_weekly_ts(self):
|
||||
ts = create_test_timeseries(AllFrequencies.W, mu=1, sigma=0.5)
|
||||
mdd = ts.max_drawdown()
|
||||
assert isinstance(mdd, dict)
|
||||
assert len(mdd) == 3
|
||||
assert all(i in mdd for i in ["start_date", "end_date", "drawdown"])
|
||||
expeced_response = {
|
||||
"start_date": datetime.datetime(2019, 2, 17, 0, 0),
|
||||
"end_date": datetime.datetime(2019, 11, 17, 0, 0),
|
||||
"drawdown": -0.2584760499552089,
|
||||
}
|
||||
assert mdd == expeced_response
|
||||
|
Loading…
Reference in New Issue
Block a user