import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# Load Data
df = (
pd.read_csv('crypto_prices.csv', parse_dates=['Date'], index_col='Date')
[['Bitcoin', 'Ethereum']]
.dropna()
)
# Scale Data
scaler = MinMaxScaler()
scaled = scaler.fit_transform(df)
# Sequence Builder
def create_sequences(data, seq_len):
X, y = [], []
for i in range(seq_len, len(data)):
X.append(data[i-seq_len:i])
y.append(data[i])
return np.array(X), np.array(y)
SEQ_LEN = 60
X, y = create_sequences(scaled, SEQ_LEN)
# Train-Test Split
split = int(len(X) * 0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
# LSTM Model
model = Sequential([
LSTM(16, return_sequences=True, input_shape=(SEQ_LEN, 2)),
Dropout(0.2),
LSTM(16),
Dropout(0.2),
Dense(2)
])
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, y_train, epochs=20, batch_size=32, verbose=0)
# Prediction
pred = model.predict(X_test)
predicted = scaler.inverse_transform(pred)
actual = scaler.inverse_transform(y_test)
# Plotting
plt.figure(figsize=(12, 6))
plt.plot(actual[:, 0], label='Actual Bitcoin')
plt.plot(predicted[:, 0], label='Predicted Bitcoin')
plt.plot(actual[:, 1], label='Actual Ethereum')
plt.plot(predicted[:, 1], label='Predicted Ethereum')
plt.legend()
plt.title("Bitcoin & Ethereum Price Prediction (LSTM)")
plt.xlabel("Time")
plt.ylabel("Price")
plt.tight_layout()
plt.show()