Python {Article125}

ようこそ「Python」へ...

ディープラーニングでビットコイン(BTC)の価格を予測するには〔4〕ビットコインの価格を予測する

ここでは6回に分けて仮想通貨ビットコイン(Bitcoin)の価格を予測する方法を解説します。 このシリーズでは、ディープラーニングのLSTM(Long Short Term Memory)モデルを使用してビットコインの価格を予測します。

第4回目では、ディープラーニングのLSTMモデルを使用してビットコインの価格を予測します。 ここでは、ビットコイン(BTC)の他にイーサリアム(ETH)、ビットコインキャッシュ(BCH)、リップル(XRP)、ライトコイン(LTC)などの仮想通貨の価格についても予測します。 更に、仮想通貨だけでなくGAFAMの株価についても予測してみます。

説明文の左側に図の画像が表示されていますが縮小されています。 画像を拡大するにはマウスを画像上に移動してクリックします。 画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。 画像の任意の場所をクリックして閉じることもできます。

click image to zoom!
図A BTC-USD (train)
click image to zoom!
図B BTC-USD (test)
click image to zoom!
図C ETH-USD
click image to zoom!
図D BCH-USD
click image to zoom!
図E XRP-USD
click image to zoom!
図E LTC-USD

LSTMモデルを使用して仮想通貨と株価を予測する

  1. ビットコインの学習データ(Train)の価格を予測する

    ここでは第3回目の「記事(Article124)」で作成したLSTMモデルを使用して、 ビットコインの学習データ(Train)の価格を予測します。

    Visual Studio Code (VS Code)を起動したら、 シリーズ第3回目の「記事(Article124)」で作成したプログラムファイル(*.py)を開いて行306-357をコピペして追加します。

    行313-314では「model.predict()」メソッドで学習用データ(x_train)の価格を予測しています。 予測した価格は正規化されているので通常の価格に戻しています。 行315では学習用データ(y_train)の実価格が正規化されているので通常の価格に戻しています。

    行317-324では学習用データの実価格(y_train)と予測価格(predicted_train_prices)をグラフに表示しています。

    行332-343では検証用データ(Test)に対して同様の処理を行っています。

    行349-354では学習用データ(Train)と検証用データ(Test)のRMSEを計算して表示しています。

    #############################################################
    ### Part 4 : Predict Crypto Price
    #############################################################
    
    ### LSTM Prediction using x_train and plotting line graph against Actual y_train
    
    # Transformation to original form and making the predictions
    predicted_train_prices = model.predict(x_train)
    predicted_train_prices = scaler.inverse_transform(predicted_train_prices.reshape(-1, 1))
    actual_train_prices = scaler.inverse_transform(y_train.reshape(-1, 1))
    
    plt.figure(figsize=(16,7))
    plt.plot(actual_train_prices, label='Actual Train', color='green')
    plt.plot(predicted_train_prices, label='Predicted Train', color='red')
    plt.title(f'{symbol} Actual vs Predicted Train Prices')
    plt.xlabel('Time')
    plt.ylabel('Close Price USD ($)')
    plt.legend(loc='best')
    plt.show()
    
    
    #%% 
    
    ### LSTM Predictions using x_test and plotting line graph against Actual y_test
    
    # predicted_btc_price_test_data = regressor.predict(testX)
    predicted_test_prices = model.predict(x_test)
    predicted_test_prices = scaler.inverse_transform(predicted_test_prices.reshape(-1, 1))
    actual_test_prices = scaler.inverse_transform(y_test.reshape(-1, 1))
    
    plt.figure(figsize=(16,7))
    plt.plot(actual_test_prices, label='Actual Test', color='green')
    plt.plot(predicted_test_prices, label='Predicted Test', color='red')
    plt.title(f'{symbol} Actual vs Predicted Test Prices')
    plt.xlabel('Time')
    plt.ylabel('Close Price USD ($)')
    plt.legend(loc='best')
    plt.show()
    
    
    #%%
    
    ### RMSE (Root Mean Squared Error) - Train Data
    rmse_lstm_train = math.sqrt(mean_squared_error(actual_train_prices, predicted_train_prices))
    print(f"Train RMSE: {rmse_lstm_train:.3%} ")    
    
    ### RMSE (Root Mean Squared Error) - Test Data
    rmse_lstm_test = math.sqrt(mean_squared_error(actual_test_prices, predicted_test_prices))
    print(f"Test RMSE: {rmse_lstm_test:.3%}")       
    
    
    #%%
    click image to zoom!
    図1-1
    ここでは、「model.predict()」で学習用データ(x_train)の価格を予測しています。 予測した価格は「predicted_train_prices」に格納されています。 予測した価格は正規化されているので「scaler.inverse_transform()」で元の価格に戻しています。 「インタラクティブ」ウィンドウには、 正規化された予測価格と通常の価格に戻した価格を表示しています。 「0~1」の数値に変換されていた価格が通常の価格に戻っているのが確認できます。

    click image to zoom!
    図1-2
    ここでは、正規化された「y_train」の価格と通常の状態に戻した価格を「インタラクティブ」ウィンドウに表示しています。 「0~1」に正規化された価格が通常の価格に戻っているのが確認できます。

    click image to zoom!
    図1-3
    ここでは学習データ(Train)の実価格と予測価格をグラフに表示しています。 実価格と予測価格がほぼ一致しているのでかなりの精度で予測できていると判断できます。
  2. ビットコインの検証データ(Test)の価格を予測する

    ここでは第3回目の「記事(Article124)」で作成したLSTMモデルを使用して、 ビットコインの検証データ(Test)の価格を予測します。

    click image to zoom!
    図2-1
    ここでは検証データ(Test)の実価格と予測価格を「インタラクティブ」ウィンドウに表示しています。 先頭の価格に注目すると実価格「$17089.503」が予測価格「$17133.055」となっています。
    click image to zoom!
    図2-2
    ここでは検証データの実価格と予測価格をグラフに表示しています。 学習データと異なり検証データでは実価格と予測価格に少し差が出ています。 モデルの各種パラメータを調整して予測精度をもう少し上げる必要があるかもしれません。
  3. LSTMモデルのRMSE (Root Mean Squared Error)を調べる

    ここではLSTMモデルのRMSE(二乗平均平方根誤差)を調べます。 RMSEは実データの予測精度を調べるときに使用します。 この数値が小さいほど予測精度が高いことを意味します。 ちなみに、モデルを学習させているときは損失値(loss, val_loss)を使用して評価します。 なお、損失値については第3回目の「記事(Article124)」で解説しています。

    click image to zoom!
    図3
    ここでは、学習用データ(Train)と検証用データ(Test)のRMSEを表示しています。 検証用のRMSE(81482.266%)が学習用のRMSE(27390.485%)よりかなり高いので、検証用データに対する予測精度は学習用データより悪いことになります。 学習用のデータ件数と検証用のデータ件数を変えて再度モデルを学習させる必要がありそうです。

    TIP1:図3に表示しているように学習用データと検証用データのRMSEにはかなりの差があります。 本番で使用するときは「prediction_days」に「int(close_ndarr.shape[0] * 0.2)」を設定して、 学習用と検証用のデータを[8:2]くらいの比率にしてください。 さらに「win-size」を「60」くらいに設定してください。 これでRMSEが大幅に改善します。
    prediction_days = int(close_ndarr.shape[0] * 0.2) 
    win_size = 60

  4. 他の仮想通貨(ETH, BCH, XRP, LTC)の価格も予測してみる

    ここでは仮想通貨(ETH, BCH, XRP, LTC)の価格も予測します。 ビットコイン以外の仮想通貨を予測するときは、 変数「symbol」に仮想通貨のシンボルを設定します。 たとえば、イーサリアムの価格を予測するときは「ETH-USD」を設定します。

    ### Get the crypto data from Yahoo! Finance
    symbol = 'BTC-USD' #  ETH-USD, BCH-USD, XRP-USD, LTC-USD
    interval = '1d' 
    csv_file = f"data/csv/dl_crypto({symbol})_{interval}.csv"  # data/csv/dl_crypto(BTC-USD)_{1d|1m}.csv
    isFile = os.path.isfile(csv_file)
    
    click image to zoom!
    図4-1 ETH-USD
    ここではイーサリアム(ETH-USD)の直近の60日間の価格を予測しています。
    click image to zoom!
    図4-2 BCH-USD
    ここではビットコインキャシュ(BCH-USD)の直近の60日間の価格を予測しています。
    click image to zoom!
    図4-3 XRP-USD
    ここではリップル(XRP-USD)の直近の60日間の価格を予測しています。
    click image to zoom!
    図4-4 LTC-USD
    ここではライトコイン(LTC-USD)の直近の60日間の価格を予測しています。
  5. GAFAMの株価も予測してみる

    ここではGAFAMの株価も予測します。 株価するときは、 変数「symbol(ticker)」に企業のティッカーを設定します。 たとえば、グーグルの株価を予測するときは「GOOG」を設定します。 旧Facebookの株価は「META」のティッカーを使用します。
    ### Get the stock data from Yahoo! Finance
    symbol = ticker = 'GOOG' # GOOG, AAPL, FB=>META, AMZN, MSFT
    interval = '1d' 
    csv_file = f"data/csv/dl_stock({ticker})_{interval}.csv"  # data/csv/dl_stock(GOOG)_{1d|1m}.csv
    isFile = os.path.isfile(csv_file)
    
    click image to zoom!
    図5-1 GOOG
    ここではグーグル(GOOD)の直近の60日間の株価を予測しています。
    click image to zoom!
    図5-2 AAPL
    ここではアップル(AAPL)の直近の60日間の株価を予測しています。
    click image to zoom!
    図5-3 META
    ここではメタ(META)の直近の60日間の株価を予測しています。
    click image to zoom!
    図5-4 AMZN
    ここではアマゾン(AMZN)の直近の60日間の株価を予測しています。
    click image to zoom!
    図5-5 MSFT
    ここではマイクロソフト(MSFT)の直近の60日間の株価を予測しています。