renamed module to PyFacts
This commit is contained in:
parent
c605f71f10
commit
0bf1deac48
@ -1,4 +1,4 @@
|
|||||||
from .core import *
|
from .core import *
|
||||||
from .fincal import *
|
from .pyfacts import *
|
||||||
from .statistics import *
|
from .statistics import *
|
||||||
from .utils import *
|
from .utils import *
|
@ -20,7 +20,7 @@ from typing import (
|
|||||||
|
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
from .utils import FincalOptions, _parse_date, _preprocess_timeseries
|
from .utils import PyfactsOptions, _parse_date, _preprocess_timeseries
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
@ -908,7 +908,7 @@ class TimeSeriesCore:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if closest is None:
|
if closest is None:
|
||||||
closest = FincalOptions.get_closest
|
closest = PyfactsOptions.get_closest
|
||||||
|
|
||||||
time_delta_dict = {"exact": 0, "previous": -1, "next": 1}
|
time_delta_dict = {"exact": 0, "previous": -1, "next": 1}
|
||||||
|
|
||||||
@ -983,7 +983,7 @@ class TimeSeriesCore:
|
|||||||
return self.data
|
return self.data
|
||||||
|
|
||||||
if string_date_format == "default":
|
if string_date_format == "default":
|
||||||
string_date_format = FincalOptions.date_format
|
string_date_format = PyfactsOptions.date_format
|
||||||
|
|
||||||
data = {datetime.datetime.strftime(dt, string_date_format): val for dt, val in self.data.items()}
|
data = {datetime.datetime.strftime(dt, string_date_format): val for dt, val in self.data.items()}
|
||||||
return data
|
return data
|
||||||
@ -1006,7 +1006,7 @@ class TimeSeriesCore:
|
|||||||
return list(self.data.items())
|
return list(self.data.items())
|
||||||
|
|
||||||
if string_date_format == "default":
|
if string_date_format == "default":
|
||||||
string_date_format = FincalOptions.date_format
|
string_date_format = PyfactsOptions.date_format
|
||||||
|
|
||||||
data = [(datetime.datetime.strftime(dt, string_date_format), val) for dt, val in self.data.items()]
|
data = [(datetime.datetime.strftime(dt, string_date_format), val) for dt, val in self.data.items()]
|
||||||
return data
|
return data
|
@ -11,7 +11,7 @@ from dateutil.relativedelta import relativedelta
|
|||||||
|
|
||||||
from .core import AllFrequencies, Frequency, Series, TimeSeriesCore, date_parser
|
from .core import AllFrequencies, Frequency, Series, TimeSeriesCore, date_parser
|
||||||
from .utils import (
|
from .utils import (
|
||||||
FincalOptions,
|
PyfactsOptions,
|
||||||
_find_closest_date,
|
_find_closest_date,
|
||||||
_interval_to_years,
|
_interval_to_years,
|
||||||
_is_eomonth,
|
_is_eomonth,
|
||||||
@ -540,7 +540,7 @@ class TimeSeries(TimeSeriesCore):
|
|||||||
sd = statistics.stdev(rolling_returns.values)
|
sd = statistics.stdev(rolling_returns.values)
|
||||||
if annualize_volatility:
|
if annualize_volatility:
|
||||||
if traded_days is None:
|
if traded_days is None:
|
||||||
traded_days = FincalOptions.traded_days
|
traded_days = PyfactsOptions.traded_days
|
||||||
|
|
||||||
if return_period_unit == "months":
|
if return_period_unit == "months":
|
||||||
sd *= math.sqrt(12 / return_period_value)
|
sd *= math.sqrt(12 / return_period_value)
|
@ -2,9 +2,9 @@ import datetime
|
|||||||
import statistics
|
import statistics
|
||||||
from typing import Literal
|
from typing import Literal
|
||||||
|
|
||||||
from fincal.core import date_parser
|
from pyfacts.core import date_parser
|
||||||
|
|
||||||
from .fincal import TimeSeries
|
from .pyfacts import TimeSeries
|
||||||
from .utils import _interval_to_years
|
from .utils import _interval_to_years
|
||||||
|
|
||||||
|
|
@ -8,7 +8,7 @@ from .exceptions import DateNotFoundError, DateOutOfRangeError
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class FincalOptions:
|
class PyfactsOptions:
|
||||||
date_format: str = "%Y-%m-%d"
|
date_format: str = "%Y-%m-%d"
|
||||||
closest: str = "previous" # next
|
closest: str = "previous" # next
|
||||||
traded_days: int = 365
|
traded_days: int = 365
|
||||||
@ -42,7 +42,7 @@ def _parse_date(date: str, date_format: str = None) -> datetime.datetime:
|
|||||||
return datetime.datetime.fromordinal(date.toordinal())
|
return datetime.datetime.fromordinal(date.toordinal())
|
||||||
|
|
||||||
if date_format is None:
|
if date_format is None:
|
||||||
date_format = FincalOptions.date_format
|
date_format = PyfactsOptions.date_format
|
||||||
|
|
||||||
try:
|
try:
|
||||||
date = datetime.datetime.strptime(date, date_format)
|
date = datetime.datetime.strptime(date, date_format)
|
4
setup.py
4
setup.py
@ -3,8 +3,8 @@ from setuptools import find_packages, setup
|
|||||||
license = open("LICENSE").read().strip()
|
license = open("LICENSE").read().strip()
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="Fincal",
|
name="PyFacts",
|
||||||
version='0.0.1',
|
version="0.0.1",
|
||||||
license=license,
|
license=license,
|
||||||
author="Gourav Kumar",
|
author="Gourav Kumar",
|
||||||
author_email="gouravkr@outlook.in",
|
author_email="gouravkr@outlook.in",
|
||||||
|
@ -3,7 +3,7 @@ import math
|
|||||||
import random
|
import random
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
import fincal as fc
|
import pyfacts as pft
|
||||||
import pytest
|
import pytest
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ def create_prices(s0: float, mu: float, sigma: float, num_prices: int) -> list:
|
|||||||
|
|
||||||
|
|
||||||
def sample_data_generator(
|
def sample_data_generator(
|
||||||
frequency: fc.Frequency,
|
frequency: pft.Frequency,
|
||||||
start_date: datetime.date = datetime.date(2017, 1, 1),
|
start_date: datetime.date = datetime.date(2017, 1, 1),
|
||||||
num: int = 1000,
|
num: int = 1000,
|
||||||
skip_weekends: bool = False,
|
skip_weekends: bool = False,
|
||||||
@ -90,11 +90,11 @@ def sample_data_generator(
|
|||||||
|
|
||||||
timedelta_dict = {
|
timedelta_dict = {
|
||||||
frequency.freq_type: int(
|
frequency.freq_type: int(
|
||||||
frequency.value * num * (7 / 5 if frequency == fc.AllFrequencies.D and skip_weekends else 1)
|
frequency.value * num * (7 / 5 if frequency == pft.AllFrequencies.D and skip_weekends else 1)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
end_date = start_date + relativedelta(**timedelta_dict)
|
end_date = start_date + relativedelta(**timedelta_dict)
|
||||||
dates = fc.create_date_series(start_date, end_date, frequency.symbol, skip_weekends=skip_weekends, eomonth=eomonth)
|
dates = pft.create_date_series(start_date, end_date, frequency.symbol, skip_weekends=skip_weekends, eomonth=eomonth)
|
||||||
values = create_prices(1000, mu, sigma, num)
|
values = create_prices(1000, mu, sigma, num)
|
||||||
ts = list(zip(dates, values))
|
ts = list(zip(dates, values))
|
||||||
return ts
|
return ts
|
||||||
|
@ -3,9 +3,9 @@ import random
|
|||||||
from typing import Literal, Mapping, Sequence
|
from typing import Literal, Mapping, Sequence
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from fincal.core import AllFrequencies, Frequency, Series, TimeSeriesCore
|
from pyfacts.core import AllFrequencies, Frequency, Series, TimeSeriesCore
|
||||||
from fincal.fincal import create_date_series
|
from pyfacts.pyfacts import create_date_series
|
||||||
from fincal.utils import FincalOptions
|
from pyfacts.utils import PyfactsOptions
|
||||||
|
|
||||||
|
|
||||||
class TestFrequency:
|
class TestFrequency:
|
||||||
@ -141,9 +141,9 @@ class TestSlicing:
|
|||||||
assert ts.get("2021-02-23", -1) == -1
|
assert ts.get("2021-02-23", -1) == -1
|
||||||
assert ts.get("2021-02-10", closest="previous")[1] == 230
|
assert ts.get("2021-02-10", closest="previous")[1] == 230
|
||||||
assert ts.get("2021-02-10", closest="next")[1] == 240
|
assert ts.get("2021-02-10", closest="next")[1] == 240
|
||||||
FincalOptions.get_closest = "previous"
|
PyfactsOptions.get_closest = "previous"
|
||||||
assert ts.get("2021-02-10")[1] == 230
|
assert ts.get("2021-02-10")[1] == 230
|
||||||
FincalOptions.get_closest = "next"
|
PyfactsOptions.get_closest = "next"
|
||||||
assert ts.get("2021-02-10")[1] == 240
|
assert ts.get("2021-02-10")[1] == 240
|
||||||
|
|
||||||
def test_contains(self):
|
def test_contains(self):
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from fincal import (
|
from pyfacts import (
|
||||||
AllFrequencies,
|
AllFrequencies,
|
||||||
FincalOptions,
|
PyfactsOptions,
|
||||||
Frequency,
|
Frequency,
|
||||||
TimeSeries,
|
TimeSeries,
|
||||||
create_date_series,
|
create_date_series,
|
||||||
)
|
)
|
||||||
from fincal.exceptions import DateNotFoundError
|
from pyfacts.exceptions import DateNotFoundError
|
||||||
|
|
||||||
|
|
||||||
class TestDateSeries:
|
class TestDateSeries:
|
||||||
@ -120,7 +120,7 @@ class TestTimeSeriesCreation:
|
|||||||
|
|
||||||
class TestTimeSeriesBasics:
|
class TestTimeSeriesBasics:
|
||||||
def test_fill(self, create_test_data):
|
def test_fill(self, create_test_data):
|
||||||
FincalOptions.get_closest = "exact"
|
PyfactsOptions.get_closest = "exact"
|
||||||
ts_data = create_test_data(frequency=AllFrequencies.D, num=50, skip_weekends=True)
|
ts_data = create_test_data(frequency=AllFrequencies.D, num=50, skip_weekends=True)
|
||||||
ts = TimeSeries(ts_data, frequency="D")
|
ts = TimeSeries(ts_data, frequency="D")
|
||||||
ffill_data = ts.ffill()
|
ffill_data = ts.ffill()
|
||||||
@ -253,7 +253,7 @@ class TestReturns:
|
|||||||
def test_date_formats(self, create_test_data):
|
def test_date_formats(self, create_test_data):
|
||||||
ts_data = create_test_data(AllFrequencies.D, skip_weekends=True)
|
ts_data = create_test_data(AllFrequencies.D, skip_weekends=True)
|
||||||
ts = TimeSeries(ts_data, "D")
|
ts = TimeSeries(ts_data, "D")
|
||||||
FincalOptions.date_format = "%d-%m-%Y"
|
PyfactsOptions.date_format = "%d-%m-%Y"
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
ts.calculate_returns(
|
ts.calculate_returns(
|
||||||
"2020-04-10", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
"2020-04-10", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
||||||
@ -265,7 +265,7 @@ class TestReturns:
|
|||||||
returns2 = ts.calculate_returns("01-04-2020", return_period_unit="days", return_period_value=90)
|
returns2 = ts.calculate_returns("01-04-2020", return_period_unit="days", return_period_value=90)
|
||||||
assert round(returns1[1], 6) == round(returns2[1], 6) == 0.073632
|
assert round(returns1[1], 6) == round(returns2[1], 6) == 0.073632
|
||||||
|
|
||||||
FincalOptions.date_format = "%m-%d-%Y"
|
PyfactsOptions.date_format = "%m-%d-%Y"
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
ts.calculate_returns(
|
ts.calculate_returns(
|
||||||
"2020-04-01", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
"2020-04-01", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
||||||
@ -278,7 +278,7 @@ class TestReturns:
|
|||||||
assert round(returns1[1], 6) == round(returns2[1], 6) == 0.073632
|
assert round(returns1[1], 6) == round(returns2[1], 6) == 0.073632
|
||||||
|
|
||||||
def test_limits(self, create_test_data):
|
def test_limits(self, create_test_data):
|
||||||
FincalOptions.date_format = "%Y-%m-%d"
|
PyfactsOptions.date_format = "%Y-%m-%d"
|
||||||
ts_data = create_test_data(AllFrequencies.D)
|
ts_data = create_test_data(AllFrequencies.D)
|
||||||
ts = TimeSeries(ts_data, "D")
|
ts = TimeSeries(ts_data, "D")
|
||||||
with pytest.raises(DateNotFoundError):
|
with pytest.raises(DateNotFoundError):
|
||||||
@ -468,7 +468,7 @@ class TestReturnsAgain:
|
|||||||
|
|
||||||
def test_date_formats(self):
|
def test_date_formats(self):
|
||||||
ts = TimeSeries(self.data, frequency="M")
|
ts = TimeSeries(self.data, frequency="M")
|
||||||
FincalOptions.date_format = "%d-%m-%Y"
|
PyfactsOptions.date_format = "%d-%m-%Y"
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
ts.calculate_returns(
|
ts.calculate_returns(
|
||||||
"2020-04-10", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
"2020-04-10", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
||||||
@ -480,7 +480,7 @@ class TestReturnsAgain:
|
|||||||
returns2 = ts.calculate_returns("10-04-2020", return_period_unit="days", return_period_value=90)
|
returns2 = ts.calculate_returns("10-04-2020", return_period_unit="days", return_period_value=90)
|
||||||
assert round(returns1[1], 4) == round(returns2[1], 4) == 5.727
|
assert round(returns1[1], 4) == round(returns2[1], 4) == 5.727
|
||||||
|
|
||||||
FincalOptions.date_format = "%m-%d-%Y"
|
PyfactsOptions.date_format = "%m-%d-%Y"
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
ts.calculate_returns(
|
ts.calculate_returns(
|
||||||
"2020-04-10", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
"2020-04-10", annual_compounded_returns=True, return_period_unit="days", return_period_value=90
|
||||||
@ -494,7 +494,7 @@ class TestReturnsAgain:
|
|||||||
|
|
||||||
def test_limits(self):
|
def test_limits(self):
|
||||||
ts = TimeSeries(self.data, frequency="M")
|
ts = TimeSeries(self.data, frequency="M")
|
||||||
FincalOptions.date_format = "%Y-%m-%d"
|
PyfactsOptions.date_format = "%Y-%m-%d"
|
||||||
with pytest.raises(DateNotFoundError):
|
with pytest.raises(DateNotFoundError):
|
||||||
ts.calculate_returns("2020-04-25", return_period_unit="days", return_period_value=90, closest_max_days=10)
|
ts.calculate_returns("2020-04-25", return_period_unit="days", return_period_value=90, closest_max_days=10)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import fincal as fc
|
import pyfacts as pft
|
||||||
|
|
||||||
|
|
||||||
def test_conf(conf_fun):
|
def test_conf(conf_fun):
|
||||||
@ -8,9 +8,9 @@ def test_conf(conf_fun):
|
|||||||
|
|
||||||
class TestSharpe:
|
class TestSharpe:
|
||||||
def test_sharpe_daily_freq(self, create_test_data):
|
def test_sharpe_daily_freq(self, create_test_data):
|
||||||
data = create_test_data(num=1305, frequency=fc.AllFrequencies.D, skip_weekends=True)
|
data = create_test_data(num=1305, frequency=pft.AllFrequencies.D, skip_weekends=True)
|
||||||
ts = fc.TimeSeries(data, "D")
|
ts = pft.TimeSeries(data, "D")
|
||||||
sharpe_ratio = fc.sharpe_ratio(
|
sharpe_ratio = pft.sharpe_ratio(
|
||||||
ts,
|
ts,
|
||||||
risk_free_rate=0.06,
|
risk_free_rate=0.06,
|
||||||
from_date="2017-02-04",
|
from_date="2017-02-04",
|
||||||
@ -20,7 +20,7 @@ class TestSharpe:
|
|||||||
)
|
)
|
||||||
assert round(sharpe_ratio, 4) == 1.0502
|
assert round(sharpe_ratio, 4) == 1.0502
|
||||||
|
|
||||||
sharpe_ratio = fc.sharpe_ratio(
|
sharpe_ratio = pft.sharpe_ratio(
|
||||||
ts,
|
ts,
|
||||||
risk_free_rate=0.06,
|
risk_free_rate=0.06,
|
||||||
from_date="2017-01-09",
|
from_date="2017-01-09",
|
||||||
@ -30,7 +30,7 @@ class TestSharpe:
|
|||||||
)
|
)
|
||||||
assert round(sharpe_ratio, 4) == 1.0701
|
assert round(sharpe_ratio, 4) == 1.0701
|
||||||
|
|
||||||
sharpe_ratio = fc.sharpe_ratio(
|
sharpe_ratio = pft.sharpe_ratio(
|
||||||
ts,
|
ts,
|
||||||
risk_free_rate=0.06,
|
risk_free_rate=0.06,
|
||||||
from_date="2018-01-02",
|
from_date="2018-01-02",
|
||||||
@ -40,7 +40,7 @@ class TestSharpe:
|
|||||||
)
|
)
|
||||||
assert round(sharpe_ratio, 4) == 1.4374
|
assert round(sharpe_ratio, 4) == 1.4374
|
||||||
|
|
||||||
sharpe_ratio = fc.sharpe_ratio(
|
sharpe_ratio = pft.sharpe_ratio(
|
||||||
ts,
|
ts,
|
||||||
risk_free_rate=0.06,
|
risk_free_rate=0.06,
|
||||||
from_date="2017-07-03",
|
from_date="2017-07-03",
|
||||||
@ -51,9 +51,9 @@ class TestSharpe:
|
|||||||
assert round(sharpe_ratio, 4) == 0.8401
|
assert round(sharpe_ratio, 4) == 0.8401
|
||||||
|
|
||||||
def test_sharpe_weekly_freq(self, create_test_data):
|
def test_sharpe_weekly_freq(self, create_test_data):
|
||||||
data = create_test_data(num=261, frequency=fc.AllFrequencies.W, mu=0.6, sigma=0.7)
|
data = create_test_data(num=261, frequency=pft.AllFrequencies.W, mu=0.6, sigma=0.7)
|
||||||
ts = fc.TimeSeries(data, "W")
|
ts = pft.TimeSeries(data, "W")
|
||||||
sharpe_ratio = fc.sharpe_ratio(
|
sharpe_ratio = pft.sharpe_ratio(
|
||||||
ts,
|
ts,
|
||||||
risk_free_rate=0.052,
|
risk_free_rate=0.052,
|
||||||
from_date="2017-01-08",
|
from_date="2017-01-08",
|
||||||
@ -63,7 +63,7 @@ class TestSharpe:
|
|||||||
)
|
)
|
||||||
assert round(sharpe_ratio, 4) == 0.4533
|
assert round(sharpe_ratio, 4) == 0.4533
|
||||||
|
|
||||||
sharpe_ratio = fc.sharpe_ratio(
|
sharpe_ratio = pft.sharpe_ratio(
|
||||||
ts,
|
ts,
|
||||||
risk_free_rate=0.052,
|
risk_free_rate=0.052,
|
||||||
from_date="2017-02-05",
|
from_date="2017-02-05",
|
||||||
@ -73,7 +73,7 @@ class TestSharpe:
|
|||||||
)
|
)
|
||||||
assert round(sharpe_ratio, 4) == 0.4898
|
assert round(sharpe_ratio, 4) == 0.4898
|
||||||
|
|
||||||
sharpe_ratio = fc.sharpe_ratio(
|
sharpe_ratio = pft.sharpe_ratio(
|
||||||
ts,
|
ts,
|
||||||
risk_free_rate=0.052,
|
risk_free_rate=0.052,
|
||||||
from_date="2018-01-01",
|
from_date="2018-01-01",
|
||||||
|
Loading…
Reference in New Issue
Block a user