FinCoach / model_utils.py
SatyaVP's picture
feat: modified models_utils because project structure change
a08e17c
import numpy as np
import pandas as pd
import joblib
import onnxruntime as ort
# Load stock data
df_all = pd.read_csv("stocks.csv", index_col=0, parse_dates=True)
def make_prediction(symbol: str, window_size=30):
if symbol not in df_all.columns:
raise ValueError(f"{symbol} not found in dataset.")
series = df_all[symbol].dropna().values
if len(series) < window_size:
raise ValueError("Not enough data for prediction.")
scaler = joblib.load(f"scalers/{symbol}_scaler.pkl")
scaled_series = scaler.transform(series.reshape(-1, 1)).squeeze()
input_seq = scaled_series[-window_size:]
forecast_days = {
"1_day": 1,
"1_week": 7,
"1_month": 30,
"3_months": 90,
"6_months": 180
}
predictions = {}
current_input = input_seq.copy()
session = ort.InferenceSession(f"onnx_models/{symbol}_model.onnx")
input_name = session.get_inputs()[0].name
for horizon_name, steps_ahead in forecast_days.items():
input_window = current_input.copy()
for _ in range(steps_ahead):
X = np.array(input_window[-window_size:]).reshape(1, window_size, 1)
output = session.run(None, {input_name: X})[0]
next_scaled = output[0][0]
input_window = np.append(input_window, next_scaled)
final_scaled = input_window[-1]
final_pred = scaler.inverse_transform([[final_scaled]])[0][0]
predictions[horizon_name] = round(float(final_pred), 2)
return predictions