import numpy as np, pandas as pd, matplotlib.pyplot as plt, yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

# Load & scale data
df = yf.download('AAPL', start='2012-01-01', end='2022-01-01')[['Close']].rolling(5).mean().dropna()
scaler = MinMaxScaler(); data = scaler.fit_transform(df)

# Create sequences
def seq(data, step=60):
    X, y = [], []
    for i in range(len(data)-step):
        X.append(data[i:i+step]); y.append(data[i+step])
    return np.array(X), np.array(y)
X, y = seq(data); s = int(0.8*len(X))
Xtr, Xt, ytr, yt = X[:s], X[s:], y[:s], y[s:]

# LSTM model
m = Sequential([
    LSTM(50, return_sequences=True, input_shape=(60,1)), Dropout(0.2),
    LSTM(50), Dropout(0.2), Dense(25), Dense(1)
])
m.compile(optimizer='adam', loss='mse')
m.fit(Xtr, ytr, epochs=50, batch_size=32, validation_data=(Xt, yt), verbose=0)

# Predict
p = scaler.inverse_transform(m.predict(Xt))
yt = scaler.inverse_transform(yt)
print("RMSE:", np.sqrt(np.mean((yt - p)**2)))

# Future forecast
fut = []
seq_last = data[-60:]
for _ in range(100):
    n = m.predict(seq_last.reshape(1,60,1))[0,0]
    fut.append(n); seq_last = np.append(seq_last[1:], n)
fut = scaler.inverse_transform(np.array(fut).reshape(-1,1))

# Plot
plt.plot(df.index, df, c='b')
plt.plot(df.index[-len(p):], p, c='r')
plt.plot(pd.date_range(df.index[-1], periods=101, freq='D')[1:], fut, c='orange')
plt.title('AAPL LSTM Forecast'); plt.show()