First_agent_template / tools /stock_price_tool.py
Bshraman's picture
Update tools/stock_price_tool.py
531bb0a verified
from typing import Any, Optional
from smolagents.tools import Tool
import yfinance as yf
class StockPriceTool(Tool):
"""
A tool that fetches the latest stock price for a given stock ticker.
This class extends the Tool base class from smolagents.
"""
name = "stock_price_tool"
description = "Fetches the latest stock price for a given stock ticker using yfinance."
inputs = {'ticker_symbol': {'type': 'any', 'description': 'Stock Ticker Symbol'}}
output_type = "Any"
def _call(self, ticker_symbol: str) -> Any:
"""
Fetches the latest stock price for the given ticker symbol.
Args:
ticker_symbol (str): The stock ticker symbol (e.g., "AAPL" for Apple, "GOOGL" for Google).
Returns:
float: The current stock price of the given ticker symbol.
None: If an error occurs or data is unavailable.
Example:
>>> StockPriceTool()._call("AAPL")
150.25
"""
try:
# Fetch the stock data using yfinance
stock = yf.Ticker(ticker_symbol)
# Get the current price (the last close price)
stock_data = stock.history(period="1d")
if stock_data.empty:
return None
current_price = stock_data['Close'].iloc[0]
return float(current_price)
except Exception as e:
# If there's an error, log it and return None
print(f"Error fetching price for {ticker_symbol}: {str(e)}")
return None
def __init__(self, *args, **kwargs):
self.is_initialized = False
def forward_stage(self, ticker_symbol: str) -> Optional[Any]:
"""
Forward stage to handle further analysis or additional steps after fetching the stock price.
Args:
ticker_symbol (str): The stock ticker symbol.
Returns:
Any: Additional stock analysis or further actions based on the stock data.
Example:
>>> StockPriceTool().forward_stage("AAPL")
{"price": 150.25, "price_change": -0.5}
"""
# Fetch the current stock price
current_price = self._call(ticker_symbol)
if current_price is None:
return {"error": f"Unable to fetch data for {ticker_symbol}"}
# For forward analysis, we can fetch historical data for further insights
stock = yf.Ticker(ticker_symbol)
stock_data = stock.history(period="5d") # Fetch last 5 days of stock data
if stock_data.empty:
return {"error": f"No historical data available for {ticker_symbol}"}
# Calculate the price change over the last 5 days
price_change = current_price - stock_data['Close'].iloc[-2]
price_change_percent = (price_change / stock_data['Close'].iloc[-2]) * 100
return {
"price": current_price,
"price_change": price_change,
"price_change_percent": price_change_percent
}