yashveersinghsohi / Statistical_Modeling_for_Time_Series_Forecasting

The S&P 500 Market Index is analysed using popular statistical models such as SARIMA, ETS and GARCH. Additionally, a powerful open source forecasting package from Facebook, called Prophet, is also used.
26 stars 19 forks source link

Exponential Smoothing init model should have box cox option before fitting? #4

Open HaoLi111 opened 1 year ago

HaoLi111 commented 1 year ago

I think it should be (I am not very sure)

def fit_exp_smo_model(train_data, params):
    (t, d, s, sp, u) = params
    model = ExponentialSmoothing(train_data, trend = t, damped = d, seasonal = s, seasonal_periods = sp, use_boxcox = u)
    model_fit = model.fit(optimized = True)
    return model_fit
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-26-f9e0a75c20ae> in <module>
     10 count = 0
     11 params = (t, d, s, sp, u)
---> 12 model = fit_exp_smo_model(train_df["spx_ret"][1:], params)
     13 
     14 model_predictions = model.predict(start = test_df.index[0], end = test_df.index[-1])

<ipython-input-18-00c99d617e7a> in fit_exp_smo_model(train_data, params)
      2     (t, d, s, sp, u) = params
      3     model = ExponentialSmoothing(train_data, trend = t, damped = d, seasonal = s, seasonal_periods = sp)
----> 4     model_fit = model.fit(optimized = True, use_boxcox = u)
      5     return model_fit

~/anaconda3/envs/torch/lib/python3.7/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

~/anaconda3/envs/torch/lib/python3.7/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

~/anaconda3/envs/torch/lib/python3.7/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

~/anaconda3/envs/torch/lib/python3.7/site-packages/statsmodels/tsa/holtwinters/model.py in fit(self, smoothing_level, smoothing_trend, smoothing_seasonal, damping_trend, optimized, remove_bias, start_params, method, minimize_kwargs, use_brute, use_boxcox, use_basinhopping, initial_level, initial_trend)
   1093         if use_boxcox is not None:
   1094             raise ValueError(
-> 1095                 "use_boxcox was set at model initialization and cannot "
   1096                 "be changed"
   1097             )

ValueError: use_boxcox was set at model initialization and cannot be changed
HaoLi111 commented 1 year ago

But then If we change the previous block to

def fit_exp_smo_model(train_data, params):
    (t, d, s, sp, u) = params
    model = ExponentialSmoothing(train_data, trend = t, damped = d, seasonal = s, seasonal_periods = sp, use_boxcox = u)
    model_fit = model.fit(optimized = True)
    return model_fit

Then we have

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-28-d7948105976f> in <module>
     10 count = 0
     11 params = (t, d, s, sp, u)
---> 12 model = fit_exp_smo_model(train_df["spx_ret"][1:], params)
     13 
     14 model_predictions = model.predict(start = test_df.index[0], end = test_df.index[-1])

<ipython-input-27-4a05bacdb636> in fit_exp_smo_model(train_data, params)
      1 def fit_exp_smo_model(train_data, params):
      2     (t, d, s, sp, u) = params
----> 3     model = ExponentialSmoothing(train_data, trend = t, damped = d, seasonal = s, seasonal_periods = sp, use_boxcox = u)
      4     model_fit = model.fit(optimized = True)
      5     return model_fit

~/anaconda3/envs/torch/lib/python3.7/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

~/anaconda3/envs/torch/lib/python3.7/site-packages/statsmodels/tsa/holtwinters/model.py in __init__(self, endog, trend, damped_trend, seasonal, seasonal_periods, initialization_method, initial_level, initial_trend, initial_seasonal, use_boxcox, bounds, dates, freq, missing)
    289         self._use_boxcox = use_boxcox
    290         self._lambda = np.nan
--> 291         self._y = self._boxcox()
    292         self._initialize()
    293         self._fixed_parameters = {}

~/anaconda3/envs/torch/lib/python3.7/site-packages/statsmodels/tsa/holtwinters/model.py in _boxcox(self)
    335             y = boxcox(self._y, self._use_boxcox)
    336         else:
--> 337             raise TypeError("use_boxcox must be True, False or a float.")
    338         return y
    339 

TypeError: use_boxcox must be True, False or a float.
HaoLi111 commented 1 year ago

So I haven;t been able to fix it. Also its error message is different from what is written in the previous markdown block, on what options we have for this block. may be we should have an if structure to detect if the input is a string or float or boolean and parse into different function calls? Or maybe just use GridSearch with scikitlearn(if it is possible to cooporate it in that way)