Some tests for Sharpe ratio
Also some corrections based identified during testing
This commit is contained in:
parent
68d854cb3f
commit
aea6bf9b57
@ -28,9 +28,12 @@ Fincal aims to simplify things by allowing you to:
|
|||||||
### Fincal features
|
### Fincal features
|
||||||
- [x] Sync two TimeSeries
|
- [x] Sync two TimeSeries
|
||||||
- [x] Average rolling return
|
- [x] Average rolling return
|
||||||
- [ ] Sharpe ratio
|
- [x] Sharpe ratio
|
||||||
- [ ] Jensen's Alpha
|
- [ ] Jensen's Alpha
|
||||||
- [ ] Beta
|
- [ ] Beta
|
||||||
|
- [ ] Sortino ratio
|
||||||
|
- [ ] Correlation & R-squared
|
||||||
|
- [ ] Treynor ratio
|
||||||
- [x] Max drawdown
|
- [x] Max drawdown
|
||||||
|
|
||||||
### Pending implementation
|
### Pending implementation
|
||||||
|
@ -528,7 +528,7 @@ class TimeSeries(TimeSeriesCore):
|
|||||||
traded_days = FincalOptions.traded_days
|
traded_days = FincalOptions.traded_days
|
||||||
|
|
||||||
if return_period_unit == "months":
|
if return_period_unit == "months":
|
||||||
sd *= math.sqrt(12)
|
sd *= math.sqrt(12 / return_period_value)
|
||||||
elif return_period_unit == "days":
|
elif return_period_unit == "days":
|
||||||
sd *= math.sqrt(traded_days / return_period_value)
|
sd *= math.sqrt(traded_days / return_period_value)
|
||||||
|
|
||||||
@ -805,7 +805,7 @@ def read_csv(
|
|||||||
nrows: int = -1,
|
nrows: int = -1,
|
||||||
delimiter: str = ",",
|
delimiter: str = ",",
|
||||||
encoding: str = "utf-8",
|
encoding: str = "utf-8",
|
||||||
) -> TimeSeriesCore:
|
) -> TimeSeries:
|
||||||
"""Reads Time Series data directly from a CSV file"""
|
"""Reads Time Series data directly from a CSV file"""
|
||||||
|
|
||||||
data = _preprocess_csv(csv_file_path, delimiter, encoding)
|
data = _preprocess_csv(csv_file_path, delimiter, encoding)
|
||||||
|
51
tests/test_stats.py
Normal file
51
tests/test_stats.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import fincal as fc
|
||||||
|
|
||||||
|
|
||||||
|
def test_conf(conf_fun):
|
||||||
|
conf_add = conf_fun
|
||||||
|
assert conf_add(2, 4) == 6
|
||||||
|
|
||||||
|
|
||||||
|
class TestSharpe:
|
||||||
|
def test_sharpe_daily(self, create_test_data):
|
||||||
|
data = create_test_data(num=1305, frequency=fc.AllFrequencies.D, skip_weekends=True)
|
||||||
|
ts = fc.TimeSeries(data, "D")
|
||||||
|
sharpe_ratio = fc.sharpe_ratio(
|
||||||
|
ts,
|
||||||
|
risk_free_rate=0.06,
|
||||||
|
from_date="2017-02-04",
|
||||||
|
to_date="2021-12-31",
|
||||||
|
return_period_unit="months",
|
||||||
|
return_period_value=1,
|
||||||
|
)
|
||||||
|
assert round(sharpe_ratio, 4) == 1.0502
|
||||||
|
|
||||||
|
sharpe_ratio = fc.sharpe_ratio(
|
||||||
|
ts,
|
||||||
|
risk_free_rate=0.06,
|
||||||
|
from_date="2017-01-09",
|
||||||
|
to_date="2021-12-31",
|
||||||
|
return_period_unit="days",
|
||||||
|
return_period_value=7,
|
||||||
|
)
|
||||||
|
assert round(sharpe_ratio, 4) == 1.0701
|
||||||
|
|
||||||
|
sharpe_ratio = fc.sharpe_ratio(
|
||||||
|
ts,
|
||||||
|
risk_free_rate=0.06,
|
||||||
|
from_date="2018-01-02",
|
||||||
|
to_date="2021-12-31",
|
||||||
|
return_period_unit="years",
|
||||||
|
return_period_value=1,
|
||||||
|
)
|
||||||
|
assert round(sharpe_ratio, 4) == 1.4374
|
||||||
|
|
||||||
|
sharpe_ratio = fc.sharpe_ratio(
|
||||||
|
ts,
|
||||||
|
risk_free_rate=0.06,
|
||||||
|
from_date="2017-07-03",
|
||||||
|
to_date="2021-12-31",
|
||||||
|
return_period_unit="months",
|
||||||
|
return_period_value=6,
|
||||||
|
)
|
||||||
|
assert round(sharpe_ratio, 4) == 0.8401
|
Loading…
Reference in New Issue
Block a user