Compare commits

...

2 Commits

Author SHA1 Message Date
Giulio De Pasquale
f08254ec6a refactor(client): remove unused imports and simplify TickerData 2025-10-16 12:18:28 +01:00
Giulio De Pasquale
aeeb639fe2 refactor(data): restructure TimeSeriesTickerData to use series list and add helper methods 2025-10-16 12:17:56 +01:00
2 changed files with 37 additions and 32 deletions

View File

@ -1,33 +1,8 @@
from datetime import datetime, timedelta
from .taapi import TaapiClient
from typing import List, Dict
from .data import TickerData
import yfinance as yf
import pandas as pd
from dataclasses import dataclass
@dataclass
class TickerData:
name: str
date: datetime
open: float
close: float
low: float
high: float
avg: float
volume: int
@dataclass
class TimeSeriesFeatures:
"""Holds time-series data for a ticker with multiple lookback windows"""
ticker: str
target_date: datetime
current_day: TickerData
vix_current: TickerData
past_30d: List[TickerData] # Previous 30 trading days
class Client:
@ -86,7 +61,6 @@ class Client:
avg = (high + low) / 2.0
return TickerData(
name=ticker,
date=date,
open=round(open_price, 2),
high=round(high, 2),

View File

@ -1,4 +1,4 @@
from dataclasses import dataclass
from dataclasses import dataclass, field
from datetime import datetime
from typing import List
@ -11,15 +11,46 @@ class TickerData:
low: float
high: float
avg: float
volume: float
volume: int
@dataclass
class TimeSeriesTickerData:
ticker: str
target_date: datetime
current_day_data: TickerData
past_30d_data: List[TickerData]
series: List[TickerData] = field(default_factory=list)
@staticmethod
def build_time_series_ticker_data(
ticker: str, all_data: List[TickerData]
):
ordered = sorted({d.date: d for d in all_data}.values(), key=lambda d: d.date)
return TimeSeriesTickerData(
ticker=ticker,
series=ordered,
)
def get_by_date(self, dt: datetime) -> TickerData | None:
for d in self.series:
if d.date == dt:
return d
return None
def get_latest(self) -> TickerData | None:
if not self.series:
return None
return self.series[-1]
def get_range(self, start_date: datetime, end_date: datetime) -> List[TickerData]:
return [d for d in self.series if start_date <= d.date <= end_date]
@property
def target_date_data(self) -> TickerData | None:
"""Return the most recent TickerData (by convention, the target date tick)."""
return self.get_latest()
@dataclass