File size: 2,386 Bytes
cb6c488
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import gradio as gr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

def forecast_stock(file, model_choice="ARIMA", horizon=30):
    df = pd.read_csv(file, parse_dates=["Date"])
    df = df.set_index("Date").asfreq("B")
    df["Aclose"] = df["Aclose"].interpolate()
    series = df["Aclose"].dropna()

    if model_choice == "ARIMA":
        model = ARIMA(series, order=(2,1,2))
        model_fit = model.fit()
        forecast = model_fit.forecast(steps=horizon)
    else:  # LSTM
        scaler = MinMaxScaler()
        data = scaler.fit_transform(series.values.reshape(-1,1))
        X, y = [], []
        seq_len = 60
        for i in range(len(data)-seq_len):
            X.append(data[i:i+seq_len])
            y.append(data[i+seq_len])
        X, y = np.array(X), np.array(y)

        model = Sequential([
            LSTM(50, input_shape=(seq_len,1)),
            Dense(1)
        ])
        model.compile(optimizer="adam", loss="mse")
        model.fit(X, y, epochs=3, batch_size=32, verbose=0)

        # Forecast
        last_seq = data[-seq_len:].reshape(1,seq_len,1)
        preds = []
        for _ in range(horizon):
            p = model.predict(last_seq, verbose=0)[0,0]
            preds.append(p)
            last_seq = np.append(last_seq[:,1:,:], [[[p]]], axis=1)
        forecast = scaler.inverse_transform(np.array(preds).reshape(-1,1)).flatten()

    # Plot results
    plt.figure(figsize=(10,5))
    plt.plot(series[-200:], label="History")
    plt.plot(pd.date_range(series.index[-1], periods=horizon+1, freq="B")[1:], forecast, label="Forecast")
    plt.legend()
    plt.title(f"{model_choice} Stock Forecast")
    plt.xlabel("Date")
    plt.ylabel("Price")
    plt.tight_layout()
    return plt

demo = gr.Interface(
    fn=forecast_stock,
    inputs=[
        gr.File(label="Upload Stock CSV"),
        gr.Radio(["ARIMA","LSTM"], value="ARIMA", label="Model"),
        gr.Slider(5,60,step=5,label="Forecast Horizon (days)")
    ],
    outputs=gr.Plot(label="Forecast Plot"),
    title="📈 Stock Price Forecasting",
    description="Upload stock data (CSV with Date,Aclose). Choose ARIMA or LSTM."
)

if __name__ == "__main__":
    demo.launch()