fix(data): include the requested end date in yfinance fetches

yfinance treats end as exclusive, so get_YFin_data_online dropped the requested
end_date row and load_ohlcv dropped the current day. Request one day past the
end so the range is inclusive (look-ahead is still prevented by the curr_date
filter; the header still shows the requested range). Also correct the load_ohlcv
docstring to the 5-year window it actually downloads.
This commit is contained in:
Yijia-Xiao
2026-06-13 21:30:11 +00:00
parent 65608831f8
commit dab07688fb
3 changed files with 73 additions and 6 deletions

View File

@@ -0,0 +1,61 @@
"""yfinance treats ``end`` as exclusive; we must request one extra day so the
requested end_date (and the current day) is actually included.
Regressions for #986 (current-day OHLCV excluded) and #987 (requested end_date
row omitted).
"""
import pandas as pd
import pytest
import tradingagents.dataflows.stockstats_utils as su
import tradingagents.dataflows.y_finance as yfin
from tradingagents.dataflows.config import set_config
@pytest.mark.unit
def test_get_yfin_requests_inclusive_end(monkeypatch):
captured = {}
class FakeTicker:
def __init__(self, symbol):
pass
def history(self, start, end):
captured["start"] = start
captured["end"] = end
idx = pd.to_datetime(["2025-05-08", "2025-05-09"])
return pd.DataFrame(
{"Open": [1.0, 2.0], "High": [1.0, 2.0], "Low": [1.0, 2.0],
"Close": [1.0, 2.0], "Volume": [1, 2]},
index=idx,
)
monkeypatch.setattr(yfin.yf, "Ticker", FakeTicker)
out = yfin.get_YFin_data_online("AAPL", "2025-05-01", "2025-05-09")
# end is requested one day past end_date so 2025-05-09 is included (#987).
assert captured["end"] == "2025-05-10"
# Header still reflects the requested range, not the internal +1 day.
assert "to 2025-05-09" in out
@pytest.mark.unit
def test_load_ohlcv_requests_inclusive_end(monkeypatch, tmp_path):
set_config({"data_cache_dir": str(tmp_path)})
captured = {}
def fake_download(symbol, start, end, **kwargs):
captured["end"] = end
idx = pd.to_datetime([pd.Timestamp.today().normalize()])
return pd.DataFrame(
{"Open": [100.0], "High": [100.0], "Low": [100.0],
"Close": [100.0], "Volume": [1]},
index=idx,
)
monkeypatch.setattr(su.yf, "download", fake_download)
today = pd.Timestamp.today().strftime("%Y-%m-%d")
su.load_ohlcv("AAPL", today)
expected_end = (pd.Timestamp.today() + pd.Timedelta(days=1)).strftime("%Y-%m-%d")
assert captured["end"] == expected_end # tomorrow -> today's row included (#986)