|
import os |
|
import gradio as gr |
|
import matplotlib.pyplot as plt |
|
import numpy as np |
|
import hopsworks |
|
from tensorflow.keras.models import load_model |
|
from inference_data_pipeline import InferenceDataPipeline |
|
from sklearn.preprocessing import MinMaxScaler |
|
|
|
name_to_ticker = { |
|
"ABB Ltd": "ABB.ST", |
|
"Alfa Laval": "ALFA.ST", |
|
"Assa Abloy B": "ASSA-B.ST", |
|
"Astra Zeneca": "AZN.ST", |
|
"Atlas Copco A": "ATCO-A.ST", |
|
"Atlas Copco B": "ATCO-B.ST", |
|
"Boliden": "BOL.ST", |
|
"Electrolux B": "ELUX-B.ST", |
|
"Ericsson B": "ERIC-B.ST", |
|
"Essity B": "ESSITY-B.ST", |
|
"Evolution": "EVO.ST", |
|
"Getinge B": "GETI-B.ST", |
|
"Hennes & Mauritz B": "HM-B.ST", |
|
"Hexagon AB": "HEXA-B.ST", |
|
"Investor B": "INVE-B.ST", |
|
"Kinnevik B": "KINV-B.ST", |
|
"Nordea Bank Abp": "NDA-SE.ST", |
|
"Sandvik": "SAND.ST", |
|
"Sinch B": "SINCH.ST", |
|
"SEB A": "SEB-A.ST", |
|
"Skanska B": "SKA-B.ST", |
|
"SKF B": "SKF-B.ST", |
|
"SCA B": "SCA-B.ST", |
|
"Svenska Handelsbanken A": "SHB-A.ST", |
|
"Swedbank A": "SWED-A.ST", |
|
"Tele2 B": "TEL2-B.ST", |
|
"Telia": "TELIA.ST", |
|
"Volvo B": "VOLV-B.ST", |
|
} |
|
|
|
def predict(stock_name): |
|
ticker = name_to_ticker[stock_name] |
|
|
|
|
|
project = hopsworks.login( |
|
api_key_value=os.environ['Hopsworks_API_Key'] |
|
) |
|
mr = project.get_model_registry() |
|
model = mr.get_model("FinanceModel", version=11) |
|
saved_model_dir = model.download() |
|
model = load_model(saved_model_dir + "/model.keras") |
|
|
|
|
|
time_period_news = "30d" |
|
time_period_price = "3mo" |
|
data_loader = InferenceDataPipeline(ticker, time_period_news, time_period_price) |
|
data = data_loader.get_data() |
|
|
|
|
|
previous_closing_prices = data["Close"].values |
|
|
|
data = data[-30:] |
|
|
|
|
|
input_scaler = MinMaxScaler() |
|
output_scaler = MinMaxScaler() |
|
|
|
|
|
output_scaler.fit_transform(previous_closing_prices.reshape(-1, 1)) |
|
|
|
|
|
data = input_scaler.fit_transform(data) |
|
|
|
|
|
data = data.reshape(1, 30, 8) |
|
prediction = model.predict(data) |
|
print(f"PREDICTION: {prediction}") |
|
|
|
|
|
prediction = output_scaler.inverse_transform(prediction)[0] |
|
|
|
|
|
fig, ax = plt.subplots(figsize=(8, 4)) |
|
previous_indices = range(len(previous_closing_prices)) |
|
ax.plot( |
|
previous_indices, |
|
previous_closing_prices, |
|
label="True Values", |
|
color="blue", |
|
) |
|
predicted_indices = np.arange( |
|
len(previous_closing_prices), len(previous_closing_prices) + len(prediction) |
|
) |
|
ax.plot([previous_indices[-1], predicted_indices[0]], [previous_closing_prices[-1], prediction[0]], color="red") |
|
ax.plot(predicted_indices, prediction, color="red", label="Predicted Values") |
|
ax.axvline(len(previous_closing_prices) - 1, linestyle="--", color="gray", alpha=0.6) |
|
ax.set_title(f"Prediction for {stock_name}") |
|
ax.set_xlabel("Time") |
|
ax.set_ylabel("Price") |
|
ax.legend() |
|
|
|
return fig |
|
|
|
|
|
interface = gr.Interface( |
|
fn=predict, |
|
inputs=gr.Dropdown( |
|
label="Stock name", |
|
choices=list(name_to_ticker.keys()), |
|
value="ABB.ST", |
|
), |
|
outputs=gr.Plot(label="Stock Prediction Plot"), |
|
title="Stock Predictor", |
|
description="Enter the name of a stock to generate a plot showing true values for the past 60 days and the predicted values for the next 5 days.", |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
interface.launch() |
|
|