diff --git a/app/cron_price_analysis.py b/app/cron_price_analysis.py index 6e8f3b0..31f9fd2 100755 --- a/app/cron_price_analysis.py +++ b/app/cron_price_analysis.py @@ -65,11 +65,12 @@ async def run(): total_symbols = stock_symbols print(f"Total tickers: {len(total_symbols)}") - start_date = datetime(2015, 1, 1).strftime("%Y-%m-%d") + start_date = datetime(2020, 1, 1).strftime("%Y-%m-%d") end_date = datetime.today().strftime("%Y-%m-%d") chunk_size = len(total_symbols) // 70 # Divide the list into N chunks chunks = [total_symbols[i:i + chunk_size] for i in range(0, len(total_symbols), chunk_size)] + #chunks = [['TSLA']] for chunk in chunks: tasks = [] for ticker in tqdm(chunk): diff --git a/app/ml_models/prophet_model.py b/app/ml_models/prophet_model.py index 4a11a1e..35a2b26 100755 --- a/app/ml_models/prophet_model.py +++ b/app/ml_models/prophet_model.py @@ -64,9 +64,9 @@ class PricePredictor: # Apply rolling average to smooth the forecast intervals rolling_window = 200 - forecast['smoothed_upper'] = forecast['yhat_upper'].rolling(window=rolling_window, min_periods=1).mean().round(2) - forecast['smoothed_lower'] = forecast['yhat_lower'].rolling(window=rolling_window, min_periods=1).mean().round(2) - forecast['smoothed_mean'] = forecast['yhat'].rolling(window=rolling_window, min_periods=1).mean().round(2) + forecast['smoothed_upper'] = forecast['yhat_upper'].round(2)#.rolling(window=rolling_window, min_periods=1).mean().round(2) + forecast['smoothed_lower'] = forecast['yhat_lower'].round(2)#.rolling(window=rolling_window, min_periods=1).mean().round(2) + forecast['smoothed_mean'] = forecast['yhat'].round(2)#.rolling(window=rolling_window, min_periods=1).mean().round(2) # Actual and predicted values for evaluation (optional) actual_values = df['y'].values @@ -81,16 +81,23 @@ class PricePredictor: historical_date_list = df['ds'][-1200:].dt.strftime('%Y-%m-%d').tolist() historical_price_list = df['y'][-1200:].round(2).tolist() + metrics_dict = { + 'mse': mean_squared_error(actual_values, predicted_values), + 'mae': mean_absolute_error(actual_values, predicted_values), + 'r2': r2_score(actual_values, predicted_values)} + print("Metrics:", metrics_dict) + # Get monthly historical data and round the close value monthly_historical_data = get_monthly_historical_data(df) monthly_historical_data = [{**item, 'close': round(item['close'], 2)} for item in monthly_historical_data] future_forecast = forecast[forecast['ds'] > df['ds'].max()]['smoothed_mean'] - if not future_forecast.empty: - median_price = round(np.median(future_forecast), 2) - else: - median_price = round(forecast['smoothed_mean'].iloc[-1], 2) + median_price = round(np.mean([ + forecast['smoothed_lower'].iloc[-1], + forecast['smoothed_mean'].iloc[-1], + forecast['smoothed_upper'].iloc[-1] + ]), 2) # Latest actual price from the dataset latest_price = round(df['y'].iloc[-1], 2) @@ -101,7 +108,6 @@ class PricePredictor: 'highPriceTarget': upper_list[-1], 'lowPriceTarget': lower_list[-1], 'medianPriceTarget': median_price, - 'latestPrice': latest_price }