From 09a9062ec9c0aa245f55aa161ced9203d6071f16 Mon Sep 17 00:00:00 2001 From: octo-patch Date: Sat, 18 Apr 2026 09:23:30 +0800 Subject: [PATCH 1/2] fix: make news article limits and lookback window configurable (fixes #562) Three parameters were hardcoded with no way to override via config: - count=20 in yf.Ticker.get_news() inside get_news_yfinance - look_back_days=7 default in get_global_news_yfinance - limit=10 default in get_global_news_yfinance Add three new keys to DEFAULT_CONFIG: - news_article_limit (default 20): max articles per ticker for get_news - global_news_lookback_days (default 7): lookback window for get_global_news - global_news_article_limit (default 10): max global articles for get_global_news Both yfinance and alpha_vantage news implementations now read these values from config, allowing users running weekly/monthly strategies to increase coverage without modifying library source code. --- tradingagents/dataflows/alpha_vantage_news.py | 13 ++++++++++--- tradingagents/dataflows/yfinance_news.py | 17 ++++++++++++----- tradingagents/default_config.py | 4 ++++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/tradingagents/dataflows/alpha_vantage_news.py b/tradingagents/dataflows/alpha_vantage_news.py index 4cf7bb0e..9783b307 100644 --- a/tradingagents/dataflows/alpha_vantage_news.py +++ b/tradingagents/dataflows/alpha_vantage_news.py @@ -1,4 +1,5 @@ from .alpha_vantage_common import _make_api_request, format_datetime_for_api +from .config import get_config def get_news(ticker, start_date, end_date) -> dict[str, str] | str: """Returns live and historical market news & sentiment data from premier news outlets worldwide. @@ -22,21 +23,27 @@ def get_news(ticker, start_date, end_date) -> dict[str, str] | str: return _make_api_request("NEWS_SENTIMENT", params) -def get_global_news(curr_date, look_back_days: int = 7, limit: int = 50) -> dict[str, str] | str: +def get_global_news(curr_date, look_back_days: int = None, limit: int = None) -> dict[str, str] | str: """Returns global market news & sentiment data without ticker-specific filtering. Covers broad market topics like financial markets, economy, and more. Args: curr_date: Current date in yyyy-mm-dd format. - look_back_days: Number of days to look back (default 7). - limit: Maximum number of articles (default 50). + look_back_days: Number of days to look back (defaults to global_news_lookback_days config). + limit: Maximum number of articles (defaults to global_news_article_limit config). Returns: Dictionary containing global news sentiment data or JSON string. """ from datetime import datetime, timedelta + config = get_config() + if look_back_days is None: + look_back_days = config.get("global_news_lookback_days", 7) + if limit is None: + limit = config.get("global_news_article_limit", 50) + # Calculate start date curr_dt = datetime.strptime(curr_date, "%Y-%m-%d") start_dt = curr_dt - timedelta(days=look_back_days) diff --git a/tradingagents/dataflows/yfinance_news.py b/tradingagents/dataflows/yfinance_news.py index dd1046f5..40bb300b 100644 --- a/tradingagents/dataflows/yfinance_news.py +++ b/tradingagents/dataflows/yfinance_news.py @@ -5,6 +5,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta from .stockstats_utils import yf_retry +from .config import get_config def _extract_article_data(article: dict) -> dict: @@ -66,7 +67,8 @@ def get_news_yfinance( """ try: stock = yf.Ticker(ticker) - news = yf_retry(lambda: stock.get_news(count=20)) + count = get_config().get("news_article_limit", 20) + news = yf_retry(lambda: stock.get_news(count=count)) if not news: return f"No news found for {ticker}" @@ -106,20 +108,25 @@ def get_news_yfinance( def get_global_news_yfinance( curr_date: str, - look_back_days: int = 7, - limit: int = 10, + look_back_days: int = None, + limit: int = None, ) -> str: """ Retrieve global/macro economic news using yfinance Search. Args: curr_date: Current date in yyyy-mm-dd format - look_back_days: Number of days to look back - limit: Maximum number of articles to return + look_back_days: Number of days to look back (defaults to global_news_lookback_days config) + limit: Maximum number of articles to return (defaults to global_news_article_limit config) Returns: Formatted string containing global news articles """ + config = get_config() + if look_back_days is None: + look_back_days = config.get("global_news_lookback_days", 7) + if limit is None: + limit = config.get("global_news_article_limit", 10) # Search queries for macro/global news search_queries = [ "stock market economy", diff --git a/tradingagents/default_config.py b/tradingagents/default_config.py index a9b75e4b..b0314a5d 100644 --- a/tradingagents/default_config.py +++ b/tradingagents/default_config.py @@ -22,6 +22,10 @@ DEFAULT_CONFIG = { "max_debate_rounds": 1, "max_risk_discuss_rounds": 1, "max_recur_limit": 100, + # News fetching configuration + "news_article_limit": 20, # max articles per ticker for get_news + "global_news_lookback_days": 7, # lookback window (days) for get_global_news + "global_news_article_limit": 10, # max articles returned by get_global_news # Data vendor configuration # Category-level configuration (default for all tools in category) "data_vendors": { From 50902c3dc0bd82747aae0bd018a49f45928dcdc7 Mon Sep 17 00:00:00 2001 From: octo-patch Date: Sat, 18 Apr 2026 13:44:28 +0800 Subject: [PATCH 2/2] fix(news): align type hints with config-default semantics and add Alpha Vantage limit Addresses gemini-code-assist review on #565: - Type hints: int | None for nullable look_back_days/limit on get_global_news in alpha_vantage_news.py, yfinance_news.py, and news_data_tools.py. Adds explicit str type hint to curr_date in alpha_vantage_news.py. - Config override: news_data_tools.get_global_news no longer hardcodes look_back_days=7 / limit=5; defaults to None so DEFAULT_CONFIG values flow through to the dataflow layer. - Cross-vendor consistency: alpha_vantage_news.get_news now respects the news_article_limit config (parity with yfinance_news.get_news_yfinance). - Fallback consistency: alpha_vantage_news.get_global_news fallback now matches DEFAULT_CONFIG (10) instead of the legacy 50. --- tradingagents/agents/utils/news_data_tools.py | 10 ++++++---- tradingagents/dataflows/alpha_vantage_news.py | 6 ++++-- tradingagents/dataflows/yfinance_news.py | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tradingagents/agents/utils/news_data_tools.py b/tradingagents/agents/utils/news_data_tools.py index 781e793c..641f1f95 100644 --- a/tradingagents/agents/utils/news_data_tools.py +++ b/tradingagents/agents/utils/news_data_tools.py @@ -23,16 +23,18 @@ def get_news( @tool def get_global_news( curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], - look_back_days: Annotated[int, "Number of days to look back"] = 7, - limit: Annotated[int, "Maximum number of articles to return"] = 5, + look_back_days: Annotated[int | None, "Number of days to look back (defaults to global_news_lookback_days config)"] = None, + limit: Annotated[int | None, "Maximum number of articles to return (defaults to global_news_article_limit config)"] = None, ) -> str: """ Retrieve global news data. Uses the configured news_data vendor. Args: curr_date (str): Current date in yyyy-mm-dd format - look_back_days (int): Number of days to look back (default 7) - limit (int): Maximum number of articles to return (default 5) + look_back_days (int | None): Number of days to look back. If None, uses + the global_news_lookback_days value from DEFAULT_CONFIG (7). + limit (int | None): Maximum number of articles to return. If None, uses + the global_news_article_limit value from DEFAULT_CONFIG (10). Returns: str: A formatted string containing global news data """ diff --git a/tradingagents/dataflows/alpha_vantage_news.py b/tradingagents/dataflows/alpha_vantage_news.py index 9783b307..615d4236 100644 --- a/tradingagents/dataflows/alpha_vantage_news.py +++ b/tradingagents/dataflows/alpha_vantage_news.py @@ -15,15 +15,17 @@ def get_news(ticker, start_date, end_date) -> dict[str, str] | str: Dictionary containing news sentiment data or JSON string. """ + limit = get_config().get("news_article_limit", 20) params = { "tickers": ticker, "time_from": format_datetime_for_api(start_date), "time_to": format_datetime_for_api(end_date), + "limit": str(limit), } return _make_api_request("NEWS_SENTIMENT", params) -def get_global_news(curr_date, look_back_days: int = None, limit: int = None) -> dict[str, str] | str: +def get_global_news(curr_date: str, look_back_days: int | None = None, limit: int | None = None) -> dict[str, str] | str: """Returns global market news & sentiment data without ticker-specific filtering. Covers broad market topics like financial markets, economy, and more. @@ -42,7 +44,7 @@ def get_global_news(curr_date, look_back_days: int = None, limit: int = None) -> if look_back_days is None: look_back_days = config.get("global_news_lookback_days", 7) if limit is None: - limit = config.get("global_news_article_limit", 50) + limit = config.get("global_news_article_limit", 10) # Calculate start date curr_dt = datetime.strptime(curr_date, "%Y-%m-%d") diff --git a/tradingagents/dataflows/yfinance_news.py b/tradingagents/dataflows/yfinance_news.py index 40bb300b..4ef4efb2 100644 --- a/tradingagents/dataflows/yfinance_news.py +++ b/tradingagents/dataflows/yfinance_news.py @@ -108,8 +108,8 @@ def get_news_yfinance( def get_global_news_yfinance( curr_date: str, - look_back_days: int = None, - limit: int = None, + look_back_days: int | None = None, + limit: int | None = None, ) -> str: """ Retrieve global/macro economic news using yfinance Search.