diff --git a/openbb_terminal/forecast/theta_model.py b/openbb_terminal/forecast/theta_model.py index 74ef6523933..5f0e266b094 100644 --- a/openbb_terminal/forecast/theta_model.py +++ b/openbb_terminal/forecast/theta_model.py @@ -8,7 +8,7 @@ from typing import List, Optional, Tuple, Union import numpy as np import pandas as pd from darts import TimeSeries -from darts.metrics import mape +from darts.metrics import mape, rmse, mse from darts.models import Theta from darts.utils.utils import SeasonalityMode from statsmodels.tools.sm_exceptions import ConvergenceWarning @@ -34,6 +34,7 @@ def get_theta_data( n_predict: int = 5, start_window: float = 0.85, forecast_horizon: int = 5, + metric: str = "mape", ) -> Tuple[ Optional[List[TimeSeries]], Optional[List[TimeSeries]], @@ -64,7 +65,9 @@ def get_theta_data( start_window: float Size of sliding window from start of timeseries and onwards forecast_horizon: int - Number of days to forecast when backtesting and retraining historical + Number of days to forecast when backtesting and retraining historical data + metric: str + Metric to use when backtesting and retraining historical data. Defaults to "mape". Returns ------- @@ -135,10 +138,19 @@ def get_theta_data( # fit model on entire series for final prediction best_theta_model_final.fit(ticker_series) prediction = best_theta_model_final.predict(int(n_predict)) - precision = mape( - actual_series=ticker_series, pred_series=historical_fcast_theta - ) # mape = mean average precision error - console.print(f"Theta Model obtains MAPE: {precision:.2f}% \n") + + if metric == "rmse": + precision = rmse( + actual_series=ticker_series, pred_series=historical_fcast_theta + ) + elif metric == "mse": + precision = mse(actual_series=ticker_series, pred_series=historical_fcast_theta) + elif metric == "mape": + precision = mape( + actual_series=ticker_series, pred_series=historical_fcast_theta + ) + + console.print(f"Theta Model obtains {metric.upper()}: {precision:.2f}% \n") return ( ticker_series, diff --git a/openbb_terminal/forecast/theta_view.py b/openbb_terminal/forecast/theta_view.py index 428e95c1663..041b865fbf7 100644 --- a/openbb_terminal/forecast/theta_view.py +++ b/openbb_terminal/forecast/theta_view.py @@ -34,6 +34,7 @@ def display_theta_forecast( end_date: Optional[datetime] = None, naive: bool = False, export_pred_raw: bool = False, + metric: str = "mape", external_axes: Optional[List[plt.axes]] = None, ): """Display Theta forecast @@ -73,6 +74,10 @@ def display_theta_forecast( naive: bool Whether to show the naive baseline. This just assumes the closing price will be the same as the previous day's closing price. Defaults to False. + export_pred_raw: bool + Whether to export the raw predicted values. Defaults to False. + metric: str + The metric to use for backtesting. Defaults to "mape". external_axes:Optional[List[plt.axes]] External axes to plot on """ @@ -95,6 +100,7 @@ def display_theta_forecast( target_column=target_column, start_window=start_window, forecast_horizon=forecast_horizon, + metric=metric, ) if ticker_series == []: return @@ -119,6 +125,7 @@ def display_theta_forecast( naive=naive, export_pred_raw=export_pred_raw, external_axes=external_axes, + metric=metric, ) if residuals: