Linux活用レシピ > 仮想通貨に活用 > RaspberryPiで仮想通貨の自動取引システムを作る
このページでは、「Raspberry Pi」と、それで動作するOS「Raspbian」を利用して、低電力の仮想通貨の自動取引システム(自動取引bot)を作る方法を紹介します。

RaspberryPiで自動取引システム(自動取引bot)を作る
バックテストの実施

    バックテストは、自動取引システム(自動取引bot)を作る際に一番重要となる「プログラムに買うか売るかのトレードの判断指標になる取引ルール」いわゆるシグナル」の検証を行うことです。
    具体的には、過去の売買記録をもとにしたシグナルのシミュレーションを行い、一番儲かるシグナルを探し当てる作業です。


    1. Pythonによるバックテストプログラム

    ここでは、Pythonによるバックテストプログラムを準備します。
    用いるシグナルは「移動平均線」となり、短期平均の仮想通貨の価格が長期平均より上なら買い、逆に下なら売りというシグナルとして処理するものです。
    このレシピでは短期を5日、長期を25日として設定し、シミュレーションを行います。

    早速ですが、プログラムは以下になります。
    pi@raspberrypi:~ $ vi gecko_get_backtest.py[ENTER]

    
    # ライブラリの読み込み
    import numpy as np
    import pandas as pd
    import time
    import requests
    import json
    import matplotlib as mpl
    from pylab import rcParams
    from datetime import datetime
    from matplotlib import pyplot as plt
    
    #ビットコインの価格データを取得する
    def get_btcprice(ticker,max): 
        url = ('https://api.coingecko.com/api/v3/coins/')+ticker+('/market_chart?vs_currency=jpy&days=')+max
        r = requests.get(url)
        r2 = json.loads(r.text) 
        return r2
    
    
    # 取得した価格データを整形する
    
    # jsonから価格データだけをPandasに変換して抽出する
    def get_price(r2):
        s = pd.DataFrame(r2['prices'])
        s.columns = ['date','price']
        date = []
        for i in s['date']:
            tsdate = int(i/1000)
            loc = datetime.utcfromtimestamp(tsdate)
            date.append(loc)
        s.index = date
        
        del s['date']
        return s
    
    # 処理開始
    # ビットコインの全期間の価格データを取得する
    r2 = get_btcprice('bitcoin', 'max')
    
    btc = get_price(r2)
    btc
    
    # データを可視化する
    
    # # 変化率を計算する
    change = btc['price'].pct_change()
    # 変化率からトータルリターン(累積変化率)を計算する
    trade_return = (change + 1).cumprod()
    print("trade_return = (change + 1).cumprod()")
    trade_return[0] = 1
    print("trade_return[0] = 1")
    print(trade_return)
    trade_return = trade_return*10000
    print(trade_return.head(), trade_return[-5:])
    
    #移動平均を計算する
    EMA5 = btc['price'].rolling(5).mean()
    EMA25 = btc['price'].rolling(25).mean()
    
    #変化率
    trade_change = (change + 1)
    print("trade_change = (change + 1)")
    print(trade_change)
    
    #print(len(btc['price']))
    #トレード戦略から売買シグナルを計算する
    signal = []
    for i in range(len(btc['price'])): 
        #5日平均が25日平均より上なら買い=1とする 
        if EMA5[i] > EMA25[i]: 
            signal.append(1)
     
        # 5日平均が25日平均より下なら売り=-1とする 
        elif EMA5[i] < EMA25[i]: 
            signal.append(-1) 
        else: signal.append(0) 
    
    font = {"family":"Kochi Gothic"}
    mpl.rc('font', **font)
    
    #キャンバスのサイズを大きくする
    rcParams['figure.figsize'] = 15,5
    
    # 日次変化率×トレードシグナルの累積変化率で
    # トレード戦略に従ってトレードした累積リターンを算出する
    backtest_return = ((change[1:-1] * signal[0:-2]) + 1).cumprod()
    print("change[1:-1]")
    print(change[1:-1].head(10),change[1:-1].tail(10))
    print("signal[0:-2]")
    print(signal[0:-2],signal[0:-2])
    backtest_return = backtest_return*10000 
    print("change[1:-1]")
    x = btc.index[0:-2]
    
    # matplotlibでリターンの推移を可視化
    plt.title('トレードリターンの比較') 
    plt.plot(btc, label='Bitcoin価格')
    plt.plot(x, trade_return[0:-2], 'purple', label='ホールドした場合のリターン', alpha=0.3, linewidth=1.0) 
    plt.plot(x, backtest_return, 'orange', label='移動平均で取引した場合のリターン', alpha=1, linewidth=1.5) 
    plt.plot(EMA5, 'red', label='移動平均5日', alpha=1, linewidth=1) 
    plt.plot(EMA25, 'green', label='移動平均25日', alpha=1, linewidth=1) 
    plt.grid(which='both') 
    plt.legend()
    plt.show()
    
    ※参考サイト「https://tkstock.site/2018/03/04/2018-03-04-211747/


    2. グラフを表示し検証

    それでは、作成したPythonのプログラムを以下の通り実行して、グラフを表示しシグナルを検証します。
    pi@raspberrypi:~ $ python3 gecko_get_backtest.py[ENTER]

    以下の通り描画されます。
    スクラッチ
    ※画像をクリックすると拡大表示されます。

    特に、以下の通りグラフの左下にある「Zoom to retangle」をクリックして・・・。
    スクラッチ

    気になる部分をマウスで選択すると・・・・。
    スクラッチ

    その部分が拡大表示され、自動的に再描画されるので、ごちゃごちゃした部分がより鮮明に確認でき、戦略を検討できて便利です。
    スクラッチ



    以上のようにシグナルを検証し、自動取引システム(自動取引bot)で売買処理する指標を検証することができます。

    なお、グラフの凡例などに日本語を用いていますが、Raspbianを日本語化していないと文字化けします。

    Raspbianを日本語化するレシピは以下に紹介していますので、参考にしてください。

    Raspberry Piを使ったライブストリーミング環境の製作

    また、日本語化した「Rasbian」のインストール済SDカードも以下のチャンネルで販売していますので、お時間のない場合はお求めください。