diff --git a/.env.example b/.env.example index 1328b838..7b053d21 100644 --- a/.env.example +++ b/.env.example @@ -4,3 +4,7 @@ GOOGLE_API_KEY= ANTHROPIC_API_KEY= XAI_API_KEY= OPENROUTER_API_KEY= + +# Options Data Providers +TRADIER_API_KEY= +TRADIER_SANDBOX=false diff --git a/tradingagents/agents/utils/options_tools.py b/tradingagents/agents/utils/options_tools.py new file mode 100644 index 00000000..102efb1a --- /dev/null +++ b/tradingagents/agents/utils/options_tools.py @@ -0,0 +1,48 @@ +from langchain_core.tools import tool +from typing import Annotated +from tradingagents.dataflows.interface import route_to_vendor + + +@tool +def get_options_chain( + symbol: Annotated[str, "ticker symbol of the company"], + min_dte: Annotated[int, "minimum days to expiration"] = 0, + max_dte: Annotated[int, "maximum days to expiration"] = 50, +) -> str: + """ + Retrieve options chain data with Greeks and IV for a given ticker symbol. + Returns strikes, expirations, bid/ask, volume, OI, 1st-order Greeks + (Delta, Gamma, Theta, Vega, Rho), and implied volatility (bid_iv, + mid_iv, ask_iv, smv_vol) filtered by DTE range. + + Args: + symbol (str): Ticker symbol of the company, e.g. AAPL, TSLA + min_dte (int): Minimum days to expiration (default 0) + max_dte (int): Maximum days to expiration (default 50) + Returns: + str: A formatted dataframe containing options chain data with Greeks and IV. + """ + return route_to_vendor("get_options_chain", symbol, min_dte, max_dte) + + +@tool +def get_options_expirations( + symbol: Annotated[str, "ticker symbol of the company"], + min_dte: Annotated[int, "minimum days to expiration"] = 0, + max_dte: Annotated[int, "maximum days to expiration"] = 50, +) -> str: + """ + Retrieve available options expiration dates for a given ticker symbol, + filtered by DTE range. + + Args: + symbol (str): Ticker symbol of the company, e.g. AAPL, TSLA + min_dte (int): Minimum days to expiration (default 0) + max_dte (int): Maximum days to expiration (default 50) + Returns: + str: Comma-separated list of expiration dates (YYYY-MM-DD format). + """ + result = route_to_vendor("get_options_expirations", symbol, min_dte, max_dte) + if isinstance(result, list): + return ", ".join(result) + return str(result) diff --git a/tradingagents/dataflows/interface.py b/tradingagents/dataflows/interface.py index 0caf4b68..4e8a8f28 100644 --- a/tradingagents/dataflows/interface.py +++ b/tradingagents/dataflows/interface.py @@ -23,6 +23,11 @@ from .alpha_vantage import ( get_global_news as get_alpha_vantage_global_news, ) from .alpha_vantage_common import AlphaVantageRateLimitError +from .tradier import ( + get_options_chain as get_tradier_options_chain, + get_options_expirations as get_tradier_options_expirations, +) +from .tradier_common import TradierRateLimitError # Configuration and routing logic from .config import get_config @@ -57,12 +62,20 @@ TOOLS_CATEGORIES = { "get_global_news", "get_insider_transactions", ] + }, + "options_chain": { + "description": "Options chain data with Greeks and IV", + "tools": [ + "get_options_chain", + "get_options_expirations", + ] } } VENDOR_LIST = [ "yfinance", "alpha_vantage", + "tradier", ] # Mapping of methods to their vendor-specific implementations @@ -107,6 +120,13 @@ VENDOR_METHODS = { "alpha_vantage": get_alpha_vantage_insider_transactions, "yfinance": get_yfinance_insider_transactions, }, + # options_chain + "get_options_chain": { + "tradier": get_tradier_options_chain, + }, + "get_options_expirations": { + "tradier": get_tradier_options_expirations, + }, } def get_category_for_method(method: str) -> str: @@ -156,7 +176,7 @@ def route_to_vendor(method: str, *args, **kwargs): try: return impl_func(*args, **kwargs) - except AlphaVantageRateLimitError: + except (AlphaVantageRateLimitError, TradierRateLimitError): continue # Only rate limits trigger fallback raise RuntimeError(f"No available vendor for '{method}'") \ No newline at end of file diff --git a/tradingagents/default_config.py b/tradingagents/default_config.py index 898e1e1e..ae318377 100644 --- a/tradingagents/default_config.py +++ b/tradingagents/default_config.py @@ -27,6 +27,7 @@ DEFAULT_CONFIG = { "technical_indicators": "yfinance", # Options: alpha_vantage, yfinance "fundamental_data": "yfinance", # Options: alpha_vantage, yfinance "news_data": "yfinance", # Options: alpha_vantage, yfinance + "options_chain": "tradier", # Options: tradier }, # Tool-level configuration (takes precedence over category-level) "tool_vendors": {