Posts

Using novel RNN-LSTM architecture for cryptocurrency market analysis. Predicts the actual Bitcoin and Ethereum prices

Bane Sons

 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()

Post a Comment