stonks / model.py
DimaTivator's picture
v1
b5ecaef
Raw
History Blame Contribute Delete
1.93 kB
from config import Config
import torch
import torch.nn as nn
from transformers import AutoConfig, AutoTokenizer, AutoModelForSequenceClassification
import pandas as pd
from statsmodels.tsa.api import VAR
device = Config.DEVICE
# ---------------------------------------------- FinBERT ----------------------------------------------
class FinBert(nn.Module):
def __init__(self):
super().__init__()
config = AutoConfig.from_pretrained("ProsusAI/finbert")
self.model = AutoModelForSequenceClassification.from_config(config)
self.model.classifier = torch.nn.Identity()
self.fc = nn.Sequential(
nn.Linear(768, 1024),
nn.BatchNorm1d(1024),
nn.Dropout(p=0.2),
nn.ReLU(),
nn.Linear(1024, 512),
nn.BatchNorm1d(512),
nn.Dropout(p=0.2),
nn.ReLU(),
nn.Linear(512, 5),
)
def forward(self, *args, **kwargs):
x = self.model(*args, **kwargs).logits
x = self.fc(x)
return x
def get_model(weights_path):
model = FinBert()
model.load_state_dict(torch.load(weights_path, map_location=device))
tokenizer = AutoTokenizer.from_pretrained("ProsusAI/finbert")
return model, tokenizer
# ---------------------------------------------- VAR ----------------------------------------------
def get_VAR_forecast(df_train, forecast_horizon):
model = VAR(df_train)
lags = model.select_order(maxlags=7)
optimal_lag = lags.aic
var_model = model.fit(optimal_lag, trend="c")
last_values = df_train.values[-optimal_lag:]
forecast = var_model.forecast(y=last_values, steps=forecast_horizon)
forecast_df = pd.DataFrame(
forecast,
columns=df_train.columns,
index=pd.date_range(
start=df_train.index[-1], periods=forecast_horizon + 1, freq="D"
)[1:],
)
return forecast_df