diff --git a/qf_lib/data_providers/yfinance/yfinance_data_provider.py b/qf_lib/data_providers/yfinance/yfinance_data_provider.py index c9b19cfa..7524f3c9 100644 --- a/qf_lib/data_providers/yfinance/yfinance_data_provider.py +++ b/qf_lib/data_providers/yfinance/yfinance_data_provider.py @@ -67,7 +67,8 @@ def price_field_to_str_map(self, *args) -> Dict[PriceField, str]: def get_history(self, tickers: Union[YFinanceTicker, Sequence[YFinanceTicker]], fields: Union[None, str, Sequence[str]], start_date: datetime, end_date: datetime = None, frequency: Frequency = None, - look_ahead_bias: bool = False, **kwargs) -> Union[QFSeries, QFDataFrame, QFDataArray]: + look_ahead_bias: bool = False, auto_adjust: bool = True, **kwargs) \ + -> Union[QFSeries, QFDataFrame, QFDataArray]: """ Gets historical attributes (fields) of different securities (tickers). @@ -87,6 +88,8 @@ def get_history(self, tickers: Union[YFinanceTicker, Sequence[YFinanceTicker]], frequencies at the following intervals: 60, 30, 15, 5 and 1 minute. look_ahead_bias: bool if set to False, the look-ahead bias will be taken care of to make sure no future data is returned + auto_adjust: bool + Adjust back all OHLC prices automatically. Default values is True. Returns ------- @@ -117,6 +120,7 @@ def get_history(self, tickers: Union[YFinanceTicker, Sequence[YFinanceTicker]], tickers_str = [t.as_string() for t in tickers] df = yf.download(list(set(tickers_str)), start_date, end_date, keepna=True, interval=self._frequency_to_period(frequency), + auto_adjust=auto_adjust, progress=False) df = df.reindex(columns=MultiIndex.from_product([fields, tickers_str])) values = df.values.reshape(len(df), len(tickers), len(fields)) diff --git a/qf_lib/tests/integration_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py b/qf_lib/tests/integration_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py index f1a9d1f8..cfa29642 100644 --- a/qf_lib/tests/integration_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py +++ b/qf_lib/tests/integration_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py @@ -85,7 +85,7 @@ def assert_equal(result, expected_value, decimals=2): ) def test_get_history__daily__real_timer(tickers, fields, start_date, end_date, expected_values, data_provider): result = data_provider.get_history(YFinanceTicker.from_string(tickers), fields, str_to_date(start_date), - str_to_date(end_date)) + str_to_date(end_date), auto_adjust=False) assert_equal(result, expected_values) @@ -107,7 +107,7 @@ def test_get_history__daily__real_timer(tickers, fields, start_date, end_date, e ) def test_incorrect_inputs(tickers, fields, start_date, end_date, expected_values, data_provider): result = data_provider.get_history(YFinanceTicker.from_string(tickers), fields, str_to_date(start_date), - str_to_date(end_date)) + str_to_date(end_date), auto_adjust=False) assert_equal(result, expected_values) @@ -123,7 +123,8 @@ def test_incorrect_inputs(tickers, fields, start_date, end_date, expected_values ) def test_get_history__various_frequencies_real_timer(tickers, fields, start_date, end_date, frequency, expected_values, data_provider): - result = data_provider.get_history(YFinanceTicker.from_string(tickers), fields, start_date, end_date, frequency) + result = data_provider.get_history(YFinanceTicker.from_string(tickers), fields, start_date, end_date, frequency, + auto_adjust=False) assert_equal(result, expected_values) @@ -151,5 +152,6 @@ def test_get_history__settable_timer(tickers, fields, start_date, end_date, freq MarketOpenEvent.set_trigger_time({"hour": 9, "minute": 30, "second": 0, "microsecond": 0}) data_provider.timer = SettableTimer(current_time) - result = data_provider.get_history(YFinanceTicker.from_string(tickers), fields, start_date, end_date, frequency) + result = data_provider.get_history(YFinanceTicker.from_string(tickers), fields, start_date, end_date, frequency, + auto_adjust=False) assert_equal(result, expected_values) diff --git a/qf_lib/tests/unit_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py b/qf_lib/tests/unit_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py index afcaddbe..1f2426bd 100644 --- a/qf_lib/tests/unit_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py +++ b/qf_lib/tests/unit_tests/data_providers/yfinance_data_provider/test_yfinance_data_provider.py @@ -39,7 +39,7 @@ def data_provider(): def mock_daily_yfinance_download(): """ Fixture to mock yfinance.download to return hardcoded data. """ - def _mock_download(tickers, start, end, interval, keepna, progress): + def _mock_download(tickers, start, end, **kwargs): # Hardcoded data for testing data = { "AAPL": pd.DataFrame({