AI-powered Stock Predictor Python, AI
👤 Sharing: AI
```python
import yfinance as yf
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
import matplotlib.pyplot as plt
def fetch_data(ticker, start_date, end_date):
"""Fetches stock data from Yahoo Finance."""
try:
data = yf.download(ticker, start=start_date, end=end_date)
return data
except Exception as e:
print(f"Error fetching data for {ticker}: {e}")
return None
def preprocess_data(data, feature='Close', sequence_length=60):
"""Preprocesses the stock data for LSTM model."""
if data is None or data.empty:
print("No data to preprocess.")
return None, None, None
data = data[[feature]].values
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
X, y = [], []
for i in range(sequence_length, len(scaled_data)):
X.append(scaled_data[i-sequence_length:i, 0])
y.append(scaled_data[i, 0])
X, y = np.array(X), np.array(y)
X = np.reshape(X, (X.shape[0], X.shape[1], 1)) # Reshape for LSTM
return X, y, scaler
def create_lstm_model(input_shape):
"""Creates an LSTM model."""
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=input_shape))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=1)) # Predicts one value (closing price)
model.compile(optimizer='adam', loss='mean_squared_error')
return model
def train_model(model, X_train, y_train, epochs=25, batch_size=32):
"""Trains the LSTM model."""
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size)
return model
def predict_future(model, last_sequence, days_to_predict, scaler):
"""Predicts future stock prices."""
predictions = []
current_sequence = last_sequence.copy()
for _ in range(days_to_predict):
# Reshape the input for prediction
current_sequence_reshaped = np.reshape(current_sequence, (1, current_sequence.shape[0], 1))
# Make the prediction
predicted_scaled = model.predict(current_sequence_reshaped)
# Inverse transform to get the original scale
predicted_price = scaler.inverse_transform(predicted_scaled)[0, 0]
predictions.append(predicted_price)
# Update the sequence with the predicted value
current_sequence = np.roll(current_sequence, -1)
current_sequence[-1] = predicted_scaled
return predictions
def evaluate_model(model, X_test, y_test, scaler):
"""Evaluates the model on test data."""
y_pred_scaled = model.predict(X_test)
y_pred = scaler.inverse_transform(y_pred_scaled)
y_true = scaler.inverse_transform(y_test.reshape(-1, 1)) # Reshape to (n, 1)
rmse = np.sqrt(np.mean((y_pred - y_true)**2))
print(f"Root Mean Squared Error (RMSE): {rmse}")
return y_pred, y_true, rmse
def plot_results(y_true, y_pred, ticker):
"""Plots the predicted vs actual stock prices."""
plt.figure(figsize=(12, 6))
plt.plot(y_true, label='Actual Price', color='blue')
plt.plot(y_pred, label='Predicted Price', color='red')
plt.title(f'{ticker} Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()
def main(ticker='AAPL', start_date='2015-01-01', end_date='2023-01-01', sequence_length=60, days_to_predict=30):
"""Main function to orchestrate the stock prediction process."""
# 1. Fetch Data
data = fetch_data(ticker, start_date, end_date)
if data is None or data.empty:
print("Aborting prediction due to data issues.")
return
# 2. Preprocess Data
X, y, scaler = preprocess_data(data, sequence_length=sequence_length)
if X is None or y is None:
print("Aborting prediction due to preprocessing issues.")
return
# 3. Split Data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 4. Create and Train Model
model = create_lstm_model(input_shape=(X_train.shape[1], 1))
model = train_model(model, X_train, y_train)
# 5. Evaluate Model
y_pred, y_true, rmse = evaluate_model(model, X_test, y_test, scaler)
# 6. Plot Results
plot_results(y_true, y_pred, ticker)
# 7. Predict Future
last_sequence = X[-1]
future_predictions = predict_future(model, last_sequence, days_to_predict, scaler)
print("\nFuture Predictions:")
for i, prediction in enumerate(future_predictions):
print(f"Day {i+1}: {prediction:.2f}")
if __name__ == "__main__":
main()
```
👁️ Viewed: 9
Comments