Spaces:
Sleeping
Sleeping
| 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 | |
| } |