# EVALUATOR import yfinance as yf from datetime import datetime, timedelta import pandas as pd from sklearn.metrics import mean_absolute_error from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import pandas as pd from pydantic.v1 import BaseModel, Field from langchain.tools import BaseTool from typing import Optional, Type from langchain.tools import StructuredTool def evaluator_tools(): def compare_prediction(mae_rf, mae_arima,prediction_rf,prediction_arima): if mae_rf>mae_arima: result=prediction_arima else: result=prediction_rf return {"final_predicted_outcome": result}#,"mae_rf": mae_rf} class compare_predictionInput(BaseModel): """Input for printing final prediction number.""" mae_rf: int = Field(..., description="Mean average error for random forest") mae_arima: int = Field(..., description="Mean average error for ARIMA") prediction_rf: int = Field(..., description="Price prediction using random forest") prediction_arima: int = Field(..., description="Price prediction using ARIMA") class compare_predictionTool(BaseTool): name = "Comparing rf and arima predictions" description = "Useful for showing which predicted outcome is the final result." def _run(self, mae_rf=int,mae_arima=int,prediction_rf=int,prediction_arima=int): result = compare_prediction(mae_rf,mae_arima,prediction_rf,prediction_arima) return {"final_predicted_outcome": result} def _arun(self, mae_rf=int,mae_arima=int,prediction_rf=int,prediction_arima=int): raise NotImplementedError("This tool does not support async") args_schema: Optional[Type[BaseModel]] = compare_predictionInput def buy_or_sell(current_price: float, prediction:float) -> str: if current_price>prediction: position="sell" else: position="buy" return str(position) class buy_or_sellInput(BaseModel): """Input for printing final prediction number.""" current_price: float = Field(..., description="Current stock price") prediction: float = Field(..., description="Final price prediction from Evaluator") class buy_or_sellTool(BaseTool): name = "Comparing current price with prediction" description = """Useful for deciding if to buy/sell stocks based on the prediction result.""" def _run(self, current_price=float,prediction=float): position = buy_or_sell(current_price,prediction) return {"position": position} def _arun(self,current_price=float,prediction=float): raise NotImplementedError("This tool does not support async") args_schema: Optional[Type[BaseModel]] = buy_or_sellInput tools_evaluate = [ StructuredTool.from_function( func=compare_predictionTool, args_schema=compare_predictionInput, description="Function to evaluate predicted stock prices and print final result.", ), StructuredTool.from_function( func=buy_or_sellTool, args_schema=buy_or_sellInput, description="Function to evaluate client stock position.", ), ] return tools_evaluate