Summary
YFinanceProvider.batch_get_prices calls self.get_price_history(symbol) with no start, end, or period arguments. yfinance defaults to 1 month of daily data (~20 rows). Feature calculators that require 252+ rows (ADX, Bollinger, _rolling_rank with window=252) receive an undersized frame and produce mostly-NaN features. No warning or error is raised.
Evidence
src/data/providers.py lines 132-139:
def batch_get_prices(self, symbols):
for symbol in symbols:
results[symbol] = self.get_price_history(symbol) # no period/start/end
get_price_history signature: (symbol, start=None, end=None, interval="1d"). Default yfinance period when all are None: 1 month.
Fix
Pass a default period covering at least 2 years: self.get_price_history(symbol, start=two_years_ago), or add a days parameter to batch_get_prices that mirrors the single-fetch API.
Summary
YFinanceProvider.batch_get_pricescallsself.get_price_history(symbol)with nostart,end, orperiodarguments. yfinance defaults to 1 month of daily data (~20 rows). Feature calculators that require 252+ rows (ADX, Bollinger,_rolling_rankwithwindow=252) receive an undersized frame and produce mostly-NaN features. No warning or error is raised.Evidence
src/data/providers.pylines 132-139:get_price_historysignature:(symbol, start=None, end=None, interval="1d"). Default yfinance period when all are None: 1 month.Fix
Pass a default period covering at least 2 years:
self.get_price_history(symbol, start=two_years_ago), or add adaysparameter tobatch_get_pricesthat mirrors the single-fetch API.