Python {Article027}

ようこそ「Python」へ...

GoogleのColab+TensorFlowを使用して仮想通貨(暗号通貨)の明日の価格を予測するには【Free CPU+GPU】

ここではGoogleのColaboratory(クラウド)環境下で、 Keras + TensorFlowを使用して仮想通貨(暗号通貨)の未来(明日)の価格を予測する手順を解説します。 GoogleのColaboratory(Colab)を使用すると、 Pythonのライブラリ(TensorFlow, Keras, Sklearn, Pandas, Matplotlib等)を一切インストールする必要がありません。 さらに、Googleの最新のハードウェア(CPU+GUP)を無料で使用することができます。 必要なのはGoogleのアカウントを作成するだけです。

GoogleのColabの環境下でアプリを作成するときはブラウザ上で動作するJupter Notebookを使用します。 なので、自分のPCにGPUが搭載されていない環境でもブラウザが動く環境であれば、 Googleの最新のハードウェア環境を無料で使用することが可能です。 ぜひ、この機会にGoogleのColabを使いこなして株価、仮想通貨(暗号通貨)等の予測に活用してください。

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

click image to zoom!
Create CSV Files
click image to zoom!
Google Colab
click image to zoom!
Upload CSV Files
click image to zoom!
Import CSV Files
click image to zoom!
Predict Price

GoogleのColab環境下で仮想通貨(暗号通貨)(DOGE)の明日の価格を予測する

ここでは仮想通貨(暗号通貨)(DOGE)の明日の価格をTensorFlowを使用してGoogleのColab環境下で予測します。 GoogleのColab環境で仮想通貨(暗号通貨)の価格を予測するには前準備が必要になります。 前準備では、仮想通貨(暗号通貨)の過去の価格情報をYahoo!FinanceからダウンロードしてCSVファイルに保存します。 この前準備の処理はローカルPCで行います。

価格の予測は、 ローカルPCで作成したCSVファイルをGoogleのクラウド上にアップロードする処理と、 仮想通貨(暗号通貨)の価格を予測する処理に分かれます。 これらの処理はすべてGoogleのColab環境下で行います。
  1. 前準備として仮想通貨(暗号通貨)の価格をYahoo!FinanceからダウンロードしてCSVファイルに保存する

    Visual Studio Code(VSC)を起動したら行1-25をコピペして実行します。 行2-4ではPythonのライブラリを取り込んでいます。 行6-7では仮想通貨(暗号通貨)「DOGE」のシンボルを定義しています。 行9-10ではYahoo!Financeから取得するDOGEコインの価格情報の範囲(開始日・終了日)を定義しています。 行12ではPandasのDataReader()メソッドでYahoo!FinanceからDOGEコインの価格情報を取り込んでDataFrameに格納しています。 行13ではDataFrameのIndex(Date)を解除しています。 これで列(Date)は通常の列になります。 行14では保存するCSVファイルのパスを定義しています。 行15ではPandasのto_csv()メソッドでDataFrameの内容をCSVファイルに出力しています。 to_csv()メソッドの引数に「index=False」を指定しているのでindexが除外されます。 行16では行15で作成したCSVファイルをPandasのread_csv()メソッドで取り込んでいます。 read_csv()メソッドの引数に「parse_date=['Date'」の指定があるので列「Date」の日付はstr型からdatetime型に自動的に変換されます。

    行18-19ではPandasのDataReader()で取り込むDOGEコインの価格情報の範囲(開始日・終了日)を定義しています。 行21-25ではYahoo!FinanceからDOGEコインの価格情報をCSVファイルに保存して、そのCSVファイルを取り込んでいます。
    # Import the libraries
    import pandas as pd # pip install pandas
    import pandas_datareader as web # pip install pandas-datareader
    import datetime as dt
    
    crypto_currency = 'DOGE' 
    against_currency = 'USD'
    
    start = dt.datetime(2016,1,1)
    end = dt.datetime.now()
    
    data = web.DataReader(f'{crypto_currency}-{against_currency}', 'yahoo', start, end)
    data = data.reset_index()
    csv_file = f'data/csv/article027/crypto({crypto_currency}-{against_currency}).csv'   # crypto(XXX-USD).csv
    data.to_csv(csv_file, index=False)
    data = pd.read_csv(csv_file, parse_dates=['Date'])
    
    test_start = dt.datetime(2020,1,1)
    test_end = dt.datetime.now()
    
    test_data = web.DataReader(f'{crypto_currency}-{against_currency}', 'yahoo', test_start, test_end)
    test_data = test_data.reset_index()
    csv_file2 = f'data/csv/article027/crypto2({crypto_currency}-{against_currency}).csv'   # crypto2(XXX-USD).csv
    test_data.to_csv(csv_file2, index=False)
    test_data = pd.read_csv(csv_file2, parse_dates=['Date'])
    click image to zoom!
    図1-1
    図1-1では行16のread_csv()メソッドで取り込んだCSVファイルの内容を表示しています。 CSVファイルにはYahoo!FinanceからダウンロードしたDOGEコインの価格情報(2016/1/1~2021/11/5)が格納されています。
    click image to zoom!
    図1-2
    図1-2では行25のread_csv()メソッドで取り込んだCSVファイルの内容を表示しています。 CSVファイルにはYahoo!FinanceからダウンロードしたDOGEコインの価格情報(2020/1/1~2021/11/5)が格納されています。
  2. ローカルPCで作成したCSVファイルをGoogleのクラウド上にアップロードする

    まずは、Googleのgmailのアカウントを作成してください。 アカウントの作成が完了したら、 「ここ」をクリックして、 Googleの「Colaboratory(Colab)」のサイトに移動します。 ブラウザに「Welcome To Colaboratory」のページが表示されたら「File」メニューをクリックします。 以降の手順は図の説明をご覧ください。
    click image to zoom!
    図2-1
    「File」メニューから「New notebook」をクリックします。
    click image to zoom!
    図2-2
    GoogleのColab上にJupter Notebookが表示されます。
    click image to zoom!
    図2-3
    Jupter Notebookのセルに行1-3のコードをコピペしたら[▶]ボタンをクリックして実行します。

    行1ではPythonのライブラリを取り込んでいます。 行2-3ではローカルPCに保存したCSVファイルをGoogleのクラウド(Colab)にアップロードします。 ローカルのファイルをクラウドにアップロードするには、google.colabのupload()メソッドを実行します。 uoload()メソッドを実行すると、 ファイル選択のボタンが表示されるのでボタンをクリックしてアップロードするCSVファイルを選択します。 アップロード処理が開始されます。 アップロードの途中経過が表示されるので「100% done」が表示されるまで待ちます。 同様の手順で2番目のCSVファイルをアップロードします。
    from google.colab import files
    uploaded = files.upload()   # upload 'crypto(DOGE-USD).csv'
    uploaded2 = files.upload()  # upload 'crypto2(DOGE-USD).csv'
  3. GoogleのColab上にアップロードしたCSVファイルを取り込む

    Jupter Notebookにセルを追加したら行1-7をコピペして[▶]で実行します。 2個のCSVファイルの内容が表示されます。 行1-2ではPythonのライブラリを取り込んでいます。 行3ではGoogleのクラウド(Colab)にアップロードしたCSVファイルをPandasのread_csv()メソッドでDataFrameに取り込んでいます。 read_csv()メソッドの引数にはCSVファイルをアップロードしたときの戻り値(uploaded)を指定します。 行4ではPandasのDataFrameの先頭レコードを表示しています。 行6-7では2番目のCSVファイルに対して同様の処理を行っています。
    import pandas as pd
    import io
    df = pd.read_csv(io.StringIO(uploaded['crypto(DOGE-USD).csv'].decode('utf-8')))
    print(df.head())
    
    df2 = pd.read_csv(io.StringIO(uploaded2['crypto2(DOGE-USD).csv'].decode('utf-8')))
    print(df2.head())

    click image to zoom!
    図2-4
    Pandasのread_csv()メソッドで取り込んだCSVファイルの先頭から5件が表示されています。
  4. 仮想通貨(暗号通貨)(DOGE)の明日の価格を予測する

    Jupter Notebookに新規セルを追加したら行1-108をコピペして[▶]で実行します。 行2-20ではPythonのライブラリを取り込んでいます。 行22-23では仮想通貨(暗号通貨)(DOGE)のシンボルを定義しています。 行25ではGoogleのクラウド(Clab)にアップロートしたCSVファイルをPandasのread_csv()メソッドでDataFrameに取り込んでいます。 read_csv()メソッドの引数にはアップロードしたときの戻り値(uploaded)を指定します。 行27-50ではTensorFlowが学習するためのデータを用意しています。 行52-53では学習用のデータをコンパイルして学習します。 行57-75では仮想通貨(暗号通貨)の価格を予測しています。 行77-83では学習の成果をグラフに表示して可視化しています。 行86-93では未来(明日)の価格を予測しています。 行95-108では予測価格をカラー(緑色)で表示しています。
    # TensorFlow Predicting Crypto Prices in Python(XXX-USD)
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    # In detail:-
    # 0 = all messages are logged (default behavior)
    # 1 = INFO messages are not printed
    # 2 = INFO and WARNING messages are not printed
    # 3 = INFO, WARNING, and ERROR messages are not printed
    
    import numpy as np  # pip install numpy or # pip install numpy==1.19.5 
    import matplotlib.pyplot as plt # pip install matplotlib
    import pandas as pd # pip install pandas
    import pandas_datareader as web # pip install pandas-datareader
    import datetime as dt
    
    from sklearn.preprocessing import MinMaxScaler
    from tensorflow.keras import models
    from tensorflow.keras.layers import Dense, Dropout, LSTM
    from tensorflow.keras.models import Sequential
    from tensorflow.python.keras.backend import dropout
    
    crypto_currency = 'DOGE' 
    against_currency = 'USD'
    
    data = pd.read_csv(io.StringIO(uploaded['crypto(DOGE-USD).csv'].decode('utf-8')))
    
    # Prepare data
    scaler = MinMaxScaler(feature_range=(0,1))
    scaled_data = scaler.fit_transform(data['Close'].values.reshape(-1,1))
    
    prediction_days = 60
    x_train, y_train = [], []
    
    for x in range(prediction_days, len(scaled_data)):
        x_train.append(scaled_data[x-prediction_days:x, 0])
        y_train.append(scaled_data[x, 0])
    
    x_train, y_train = np.array(x_train), np.array(y_train)
    x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
    
    # Create Neural Network
    model = Sequential()
    
    model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1], 1)))
    model.add(Dropout(0.2))
    model.add(LSTM(units=50, return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(units=50))
    model.add(Dropout(0.2))
    model.add(Dense(units=1))
    
    model.compile(optimizer='adam', loss='mean_squared_error')
    model.fit(x_train, y_train, epochs=25, batch_size=32)
    
    # Testing model
    
    test_data = pd.read_csv(io.StringIO(uploaded2['crypto2(DOGE-USD).csv'].decode('utf-8')))
    actual_prices = test_data['Close'].values
    
    total_dataset = pd.concat((data['Close'], test_data['Close']), axis=0)
    
    model_inputs = total_dataset[len(total_dataset) - len(test_data) - prediction_days:].values
    model_inputs = model_inputs.reshape(-1, 1)
    model_inputs = scaler.fit_transform(model_inputs)
    
    x_test = []
    
    for x in range(prediction_days, len(model_inputs)):
        x_test.append(model_inputs[x-prediction_days:x, 0])
    
    x_test = np.array(x_test)
    x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
    
    prediction_prices = model.predict(x_test)
    prediction_prices = scaler.inverse_transform(prediction_prices)
    
    plt.plot(actual_prices, color='black', label='Actual Prices')
    plt.plot(prediction_prices, color='green', label='Predicted Prices')
    plt.title(f'{crypto_currency}-{against_currency} price prediction')
    plt.xlabel('Time')
    plt.ylabel('Price')
    plt.legend(loc='upper left')
    plt.show()
    
    # Predict Next day
    real_data = [model_inputs[len(model_inputs) + 1 - prediction_days:len(model_inputs) + 1, 0]]
    real_data = np.array(real_data)
    real_data = np.reshape(real_data, (real_data.shape[0], real_data.shape[1], 1))
    
    prediction = model.predict(real_data)
    prediction = scaler.inverse_transform(prediction)
    
    #print(f'{crypto_currency}-{against_currency} prediction: $ {prediction[0][0]:,.2f}' )
    
    class bcolors:
        HEADER = '\033[95m'
        OKBLUE = '\033[94m'
        OKCYAN = '\033[96m'
        OKGREEN = '\033[92m'
        WARNING = '\033[93m'
        FAIL = '\033[91m'
        ENDC = '\033[0m'
        BOLD = '\033[1m'
        UNDERLINE = '\033[4m'
    
    print(f'{bcolors.OKGREEN}')
    print(f'{crypto_currency}-{against_currency} prediction: $ {prediction[0][0]:,.2f}' )
    print(f'{bcolors.ENDC}')

    click image to zoom!
    図2-5
    セルに行1-93をコピペしたら[▶]をクリックして実行します。
    click image to zoom!
    図2-6
    実行ボタンをクリックすると処理の途中経過が表示されます。 数分経過すると線グラフと明日の予測価格が表示されます。 ここでは明日のDOGEコインの予測価格はUSD $「0.29」になっています。 これを繰り返して機械学習の各種パラメータを調整して精度を高めます。