Files
OpenBB/openbb_terminal/forecast/trans_model.py
teh_coderer 59d8b36bb0 [IMPROVE] Fix Docstring formatting/Fix missing, incomplete type hints (#3412)
* Fixes

* Update stocks_helper.py

* update git-actions set-output to new format

* Update stocks_helper.py

* Update terminal_helper.py

* removed LineAnnotateDrawer from qa_view

* lint

* few changes

* updates

* sdk auto gen modules done

* Update stocks_helper.py

* updates to changed imports, and remove first sdk_modules

* Update generate_sdk.py

* Update generate_sdk.py

* pylint

* revert stocks_helper

* Update generate_sdk.py

* Update sdk.py

* Update generate_sdk.py

* full auto generation, added sdk.py/controllers creation

* missed enable forecasting

* added running black in subprocess after sdk files generation completes

* removed deleted sdk_arg_logger

* comment out tests

* property doc fix

* clean up

* Update generate_sdk.py

* make trailmap classes useable for doc generation

* Update generate_sdk.py

* added lineon to trailmap class for linking to func in markdown

* changed lineon to dict

* added full_path to trailmap for linking in docs

* updated portfolio

* feat: initial files

* feat: added meta head

* feat: added funcdef

* added func_def to trailmap attributes for markdown in docs, added missing type hints to covid functions

* feat: added view and merged with jaun

* Update generate_sdk.py

* Update generate_sdk.py

* Update generate_sdk.py

* Update generate_sdk.py

* init

* fix returns

* fix: random stuff

* fix: random

* fixed encoding issue on windows

* fix: generate tabs

* update

* Update generate_sdk_markdown.py

* Create .pydocstyle.ini

* added type hint classes for views

* fixes

* alt, ba

* alt-economy

* Update finviz_compare_model.py

* fixs

* Update substack_model.py

* Update generate_sdk.py

* last of my section

* porfolio

* po

* Update optimizer_model.py

* fixing more things

* few more

* keys done

* update

* fixes

* Update generate_sdk_markdown.py

* Update generate_sdk_markdown.py

* mypy forecast fix

* Update generate_sdk_markdown.py

* Update generate_sdk_markdown.py

* Update generate_sdk_markdown.py

* fixes

* forecast fixes

* one more fix

* Update coinbase_model.py

* Update generate_sdk_markdown.py

Co-authored-by: Colin Delahunty <72827203+colin99d@users.noreply.github.com>
Co-authored-by: James Maslek <jmaslek11@gmail.com>
Co-authored-by: jose-donato <zmcdonato@gmail.com>
Co-authored-by: andrewkenreich <andrew.kenreich@gmail.com>
2022-11-15 16:37:49 -05:00

176 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# pylint: disable=too-many-arguments
"""Transformer Model"""
__docformat__ = "numpy"
import logging
import warnings
from typing import Tuple, Union, List, Optional
import pandas as pd
from darts import TimeSeries
from darts.models import TransformerModel
from openbb_terminal.decorators import log_start_end
from openbb_terminal.forecast import helpers
logger = logging.getLogger(__name__)
@log_start_end(log=logger)
def get_trans_data(
data: Union[pd.Series, pd.DataFrame],
target_column: str = "close",
n_predict: int = 5,
train_split: float = 0.85,
past_covariates: str = None,
forecast_horizon: int = 5,
input_chunk_length: int = 14,
output_chunk_length: int = 5,
d_model: int = 64,
nhead: int = 4,
num_encoder_layers: int = 3,
num_decoder_layers: int = 3,
dim_feedforward: int = 512,
activation: str = "relu",
dropout: float = 0.0,
batch_size: int = 32,
n_epochs: int = 100,
learning_rate: float = 1e-3,
model_save_name: str = "trans_model",
force_reset: bool = True,
save_checkpoints: bool = True,
) -> Tuple[
Optional[List[TimeSeries]],
Optional[List[TimeSeries]],
Optional[List[TimeSeries]],
Optional[float],
Optional[type[TransformerModel]],
]:
"""Performs Transformer forecasting
Parameters
----------
data: Union[pd.Series, pd.DataFrame]
Input Data
n_predict: int
Days to predict. Defaults to 5.
target_column: str
Target column to forecast. Defaults to "close".
train_split: float
Train/val split. Defaults to 0.85.
past_covariates: str
Multiple secondary columns to factor in when forecasting. Defaults to None.
forecast_horizon: int
Forecast horizon when performing historical forecasting. Defaults to 5.
input_chunk_length: int
Number of past time steps that are fed to the forecasting module at prediction time. Defaults to 14.
output_chunk_length: int
The length of the forecast of the model. Defaults to 5.
d_model: int
The number of expected features in the encoder/decoder inputs. Defaults to 64.
nhead: int
The number of heads in the multi-head attention mechanism. Defaults to 4.
num_encoder_layers: int
The number of encoder layers in the encoder. Defaults to 3.
num_decoder_layers: int
The number of decoder layers in the encoder. Defaults to 3.
dim_feedforward: int
The dimension of the feedforward network model. Defaults to 512.
activation: str
The activation function of encoder/decoder intermediate layer, ‘relu’ or ‘gelu’. Defaults to 'relu'.
dropout: float
Fraction of neurons afected by Dropout. Defaults to 0.0.
batch_size: int
Number of time series (input and output sequences) used in each training pass. Defaults to 32.
n_epochs: int
Number of epochs over which to train the model. Defaults to 100.
learning_rate: float
Defaults to 1e-3.
model_save_name: str
Name for model. Defaults to "brnn_model".
force_reset: bool
If set to True, any previously-existing model with the same name will be reset (all checkpoints will be
discarded). Defaults to True.
save_checkpoints: bool
Whether or not to automatically save the untrained model and checkpoints from training. Defaults to True.
Returns
-------
Tuple[List[TimeSeries], List[TimeSeries], List[TimeSeries], Optional[float], type[TransformerModel]]
Adjusted Data series,
Historical forecast by best RNN model,
list of Predictions,
Mean average precision error,
Best transformer Model.
"""
# TODO Check if torch GPU AVAILABLE
use_scalers = True
probabilistic = False
scaler, ticker_series = helpers.get_series(
data, target_column, is_scaler=use_scalers
)
train, val = ticker_series.split_before(train_split)
valid = helpers.check_data_length(
train, val, input_chunk_length, output_chunk_length
)
if not valid:
return [], [], [], None, None
(
past_covariate_whole,
past_covariate_train,
past_covariate_val,
) = helpers.past_covs(past_covariates, data, train_split, use_scalers)
trans_model = TransformerModel(
input_chunk_length=input_chunk_length,
output_chunk_length=output_chunk_length,
d_model=d_model,
nhead=nhead,
num_encoder_layers=num_encoder_layers,
num_decoder_layers=num_decoder_layers,
dim_feedforward=dim_feedforward,
activation=activation,
dropout=dropout,
batch_size=batch_size,
n_epochs=n_epochs,
optimizer_kwargs={"lr": learning_rate},
model_name=model_save_name,
random_state=42,
pl_trainer_kwargs=helpers.get_pl_kwargs(accelerator="cpu"),
force_reset=force_reset,
save_checkpoints=save_checkpoints,
)
# fit model on train series for historical forecasting
with warnings.catch_warnings():
warnings.simplefilter("ignore")
helpers.fit_model(
trans_model,
train,
val,
past_covariate_train,
past_covariate_val,
)
best_model = TransformerModel.load_from_checkpoint(
model_name=model_save_name, best=True
)
# Showing historical backtesting without retraining model (too slow)
return helpers.get_prediction(
"Transformer",
probabilistic,
use_scalers,
scaler,
past_covariates,
best_model,
ticker_series,
past_covariate_whole,
train_split,
forecast_horizon,
n_predict,
)