Source code for kaxanuk.attribution_analysis.entities.market_data
# prices
import dataclasses
import datetime
from kaxanuk.attribution_analysis.entities.market_data_daily_row import MarketDataDailyRow
from kaxanuk.attribution_analysis.entities.ticker import Ticker
from kaxanuk.attribution_analysis.exceptions import (
EntityTypeError,
EntityValueError
)
from kaxanuk.attribution_analysis.services import (
entity_helper,
validator
)
[docs]
@dataclasses.dataclass(frozen=True, slots=True)
class MarketData:
start_date: datetime.date
end_date: datetime.date
ticker: Ticker
daily_rows: dict[str, MarketDataDailyRow]
def __post_init__(self):
field_type_errors = entity_helper.detect_field_type_errors(self)
if len(field_type_errors):
msg = " ".join([
f"Field type errors found in {self.__class__.__name__} for ticker {self.ticker}:",
"\n\t".join(field_type_errors)
])
raise EntityTypeError(msg)
if not all(
isinstance(row, MarketDataDailyRow)
for row in self.daily_rows.values()
):
raise EntityValueError("Incorrect data in MarketData.daily_rows")
if any(
not validator.is_date_pattern(key)
for key in self.daily_rows
):
raise EntityValueError("MarketData.daily_rows keys need to be date strings in 'YYYY-MM-DD' format")
if not (
list(self.daily_rows.keys())
== sorted(self.daily_rows.keys())
):
raise EntityValueError("MarketData.daily_rows are not correctly sorted by date")