【仮想通貨】移動平均線・ゴールデンクロス・デッドクロスをリアルタイムに可視化|Python・自動売買ツール作成

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

このような方におすすめの記事です
  • 仮想通貨(暗号資産)や株価の自動売買に興味がある!
  • Pythonでリアルタイムに変化するアニメーショングラフを描きたい
  • 移動平均線の描く方法を知りたい
  • ゴールデンクロス・デッドクロスを自動で識別できるようにしたい
目次

はじめに|仮想通貨のテクニカル分析

本記事では上動画のように、ビットコイン価格の移動平均線をリアルタイムに観察し、ゴールデンクロス・デッドクロスを可視化するという趣旨でプログラムの記述方法を解説します。

開発言語はPythonであり、プログラムを記述する上でのポイントは下記になります。

  • リアルタイムにビットコイン価格を取得し、グラフとして可視化
  • 5日移動平均線と25日移動平均線を描く
  • 上記移動平均線をもとにゴールデン/デッドクロスを可視化

なお、今回は例に仮想通貨を用いましたが、他にも株価やFX等にも応用できる内容としておりますため、それら自動売買に興味がある方も是非ご覧ください。

【参考】テクニカル分析採用の自動取引におすすめの暗号資産(仮想通貨)取引所

スクロールできます
取引所名最低取引量現物取引手数料*1入金手数料[円]入金手数料[BTC]出金手数料[円]送金手数料[BTC]信用取引API提供ccxt自動売買おすすめ
0.0001BTCMaker:-0.01%
Taker:0.05%
無料無料0円/
400円(大口出金)
無料×★★★★★
0.0001BTCMaker:-0.02%
Taker:0.12%
無料無料550円/
770円(3万円以上)
0.0006 BTC×★★★★☆
*20.001 BTC0.01〜0.15%0〜330 円無料220〜770 円0.0004 BTC★★★★☆
0.0001 BTC無料無料無料330 円無料××★★★★☆
0.0001 BTC無料無料無料330 円0.0005 BTC★★★★★
0.005 BTC無料無料無料407円0.0005 BTC×★★★★★
表:暗号資産取引所の比較表(最低取引量の単位はBTCで記載)
補足
  1. 現物取引手数料の対象通貨はBTC/JPY。手数料は約定数量 × 上記記載の割合[%]として算出可能。
  2. bitFlyerの取引手数料はLightningBTC現物の手数料を表示

テクニカル分析を活用した自動取引を実践した場合、短期間での暗号資産の取引回数が増加する傾向にあります。さらに、自動取引の期間にデイトレードを採用した場合、なおさら増加すると言えます。

したがって、テクニカルトレードで取引利益を最大化したい場合は「取引手数料が安い取引所を選択する」ことを推奨します。

上記に示した暗号資産(仮想通貨)取引所は全てテクニカルトレードと相性が良いおすすめ取引所です。また、以下には仮想通貨の自動取引を実践する上で必須となるAPI利用方法についても言及しています。

APIの利用方法をマスターすると自動取引で実現できる幅も広がります。是非合わせてご参考下さい。

スクロールできます
API利用手順確認API利用手順確認API利用手順確認API利用手順確認API利用手順確認API利用手順確認

Pythonでビットコイン価格の移動平均線を描きゴールデンクロスを可視化

それでは実際にPythonプログラムを構築していきましょう!以下プログラムの構築手順を示します。

  1. 必要なPythonライブラリ呼出
  2. 価格データを取得する関数作成
  3. リアルタイムに推移する価格変動グラフ・移動平均線・ゴールデン/デッドクロスを描画
  4. 実行関数を記述

今回使用するビットコイン価格のデータは、から取得しています。

仮想通貨の自動売買ツールを作成したい!」「他にも自動売買のノウハウを知りたい!」等の興味があれば、下記の記事で実際に自動売買ツールの作成体験ができます。是非合わせてご覧ください。

必要なPythonライブラリを呼出

まずプログラムを構築する上で必要なPythonライブラリをインポートします。下記のように記述しましょう。

import json
import requests
from time import sleep
from itertools import count
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.animation import FuncAnimation
plt.style.use('fivethirtyeight')
mpl.use('TkAgg')

価格データを取得する関数作成

続いてグラフを描くために必要なビットコイン価格情報を取得するコードを記載します。

今回はGMOコインのビットコイン価格を例としていますが、この関数の出力値を別の暗号資産取引所に変更したり、株価やFX等に書き換えると、後述のコードが別の自動売買ツールとしても応用できるようになります。

# GMOコイン 板情報
def gmo_table():
    ita_prep = requests.get('https://api.coin.z.com/public/v1/ticker?symbol=BTC')
    ita = ita_prep.json()['data'][0]
    return ita

GMOコインのパブリックAPIを用いてビットコインの価格データを取得し、値を出力できるような関数を記述しています。

移動平均線・ゴールデン/デッドクロスを描画

今回の趣旨である「移動平均線」「ゴールデンクロス・デッドクロスの識別」がリアルタイムで表現できるグラフ関数を作成します。

短期移動平均線には5(日・時間・秒)平均、長期移動平均線には25(日・時間・秒)平均のいづれかを用いてゴールデンクロス・デッドクロスを可視化できるようにします。

x       = []      # x軸
index  = count()  # x軸(カウント)
y_gmo   = []      # gmo(ask)
y_5day  = []      # 5日移動平均
y_25day = []      # 25日移動平均

# グラフ可視化関数
def animate(i):
    # GMOコイン(買値)
    gmo_ask =  float(gmo_table()["ask"])
    # リスト格納
    x.append(next(index))
    y_gmo.append(gmo_ask)

    # 5(日・時間・秒)
    if len(y_gmo) >= 5:
        x1   = 0
        MA_5 = sum([x1 + y_gmo[-i-1] for i in range(5)])/5
    else:
        MA_5 = None
    y_5day.append(MA_5)

    # 25(日・時間・秒)
    if len(y_gmo) >= 25:
        x2   = 0
        MA_25 = sum([x2 + y_gmo[-i-1] for i in range(25)])/25
    else:
        MA_25 = None
    y_25day.append(MA_25)

    # ゴールデンクロス/デッドクロス
    if len(y_25day) > 25:
        if (y_5day[-1] > y_25day[-1] ) & (y_5day[-2] < y_25day[-2]):
            text = "Golden Cross!"
        elif (y_5day[-1] < y_25day[-1] ) & (y_5day[-2] > y_25day[-2]):
            text = "Dead Cross!"
        else:
            text = "No Trend"
    else:
        text = "No Trend"

    #グラフ設定
    plt.cla()
    if text == "No Trend":
        plt.title(text,color="black", size=20)
    else:
        plt.title(text,color="red", size=50)
    plt.xlabel("Time")
    plt.ylabel("Bitcoin[BTC]")
    plt.plot(x,y_gmo ,label="GMO Coin")
    plt.plot(x,y_5day ,label="MA_5days")
    plt.plot(x,y_25day ,label="MA_25days")
    plt.legend(loc="upper left")
    plt.tight_layout()

実行関数を記述

最後にPythonスクリプトを実行するためのコードを以下のように記載します。

# アニメーショングラフ適用(インターバル:1秒)
ani = FuncAnimation(plt.gcf(),animate,interval=1000) # デイトレ向け
# ani = FuncAnimation(plt.gcf(),animate,interval=86400*1000) # スイングトレード向け

# グラフ表示
plt.tight_layout()
plt.show()

グラフを表示する頻度はFuncAnimation()メソッドを用いて設定できます。

デイトレ・スイングトレード等の自動売買の目的に合わせてグラフの表示頻度を設定するのがおすすめです。

スクロールできます
グラフの表示頻度FunctionAnimation()修正内容意味
デイトレード向けinterval=10001秒毎にグラフを更新
スイングトレード向けinterval=86400*10001日毎にグラフを更新

5日,25日移動平均線を表現したい場合は、スイングトレード向けの設定方法を参照ください。デイトレ向けの設定にしたい場合はコードのこのまま利用できます。

これでスクリプトが完成です!ターミナルまたはコマンドプロンプトを開き、作成したPythonスクリプトを実行しましょう。

本記事紹介したビットコインチャート分析コードの全量

今回ご紹介したコードを全て下記に掲載しました。

まずはコピペで動作確認してみたいという方はこちらを活用下さい。

import json
import requests
from time import sleep
from itertools import count
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.animation import FuncAnimation
plt.style.use('fivethirtyeight')
mpl.use('TkAgg')

# GMOコイン 板情報
def gmo_table():
    ita_prep = requests.get('https://api.coin.z.com/public/v1/ticker?symbol=BTC')
    ita = ita_prep.json()['data'][0]
    return ita

x       = []      # x軸
index  = count()  # x軸(カウント)
y_gmo   = []      # gmo(ask)
y_5day  = []      # 5日移動平均
y_25day = []      # 25日移動平均

# グラフ可視化関数
def animate(i):
    # GMOコイン(買値)
    gmo_ask =  float(gmo_table()["ask"])
    # リスト格納
    x.append(next(index))
    y_gmo.append(gmo_ask)

    # 5日移動平均
    if len(y_gmo) >= 5:
        x1   = 0
        MA_5 = sum([x1 + y_gmo[-i-1] for i in range(5)])/5
    else:
        MA_5 = None
    y_5day.append(MA_5)

    # 25日移動平均
    if len(y_gmo) >= 25:
        x2   = 0
        MA_25 = sum([x2 + y_gmo[-i-1] for i in range(25)])/25
    else:
        MA_25 = None
    y_25day.append(MA_25)

    # ゴールデンクロス/デッドクロス
    if len(y_25day) > 25:
        if (y_5day[-1] > y_25day[-1] ) & (y_5day[-2] < y_25day[-2]):
            text = "Golden Cross!"
        elif (y_5day[-1] < y_25day[-1] ) & (y_5day[-2] > y_25day[-2]):
            text = "Dead Cross!"
        else:
            text = "No Trend"
    else:
        text = "No Trend"

    #グラフ設定
    plt.cla()
    if text == "No Trend":
        plt.title(text,color="black", size=20)
    else:
        plt.title(text,color="red", size=50)
    plt.xlabel("Time")
    plt.ylabel("Bitcoin[BTC]")
    plt.plot(x,y_gmo ,label="GMO Coin")
    plt.plot(x,y_5day ,label="MA_5days")
    plt.plot(x,y_25day ,label="MA_25days")
    plt.legend(loc="upper left")
    plt.tight_layout()

# アニメーショングラフ適用(インターバル:1秒)
ani = FuncAnimation(plt.gcf(),animate,interval=1000) # デイトレ向け
# ani = FuncAnimation(plt.gcf(),animate,interval=86400*1000) # スイングトレード向け

# グラフ表示
plt.tight_layout()
plt.show()

【仮想通貨・ビットコイン】自動取引実践法・その他優良情報

最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。

取引所別:APIの取得手順と使い方の解説記事

スクロールできます
対応言語記事名
Python【GMOコイン】 APIで仮想通貨取引の自動化
Python【Huobi Japan】 APIで仮想通貨取引の自動化
Python【bitbank】 APIで仮想通貨取引の自動化
Python【Coincheck】APIで仮想通貨取引の自動化
Python【bitFlyer】APIで仮想通貨取引を自動化
Python【BITPOINT】APIで仮想通貨取引の自動化

機械学習やテクニカル分析を採用した仮想通貨取引の解説記事

スクロールできます
対応言語記事名指標
共通自動売買の種類・自作時のポイント全て
Pythonリアルタイムチャート分析基礎トレンド
Python移動平均線トレンド
Pythonゴールデンクロス・デッドクロストレンド
Pythonアービトラージ(裁定取引)時間・値幅
Pythonボリンジャーバンドオシレータ
PythonMACDオシレータ
PythonRSIオシレータ
Python時系列予測モデルの構築機械学習・AI
【トレンド】:値動きが上昇・下降どちらのトレンドなのか判断に有効
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効

その他仮想通貨自動トレード解説記事

スクロールできます
対応言語記事名
Python【データ収集】仮想通貨の過去データを大量取得する方法
Python【初心者向け】ccxtを活用した仮想通貨の自動取引
Node.js【初心者向け】ccxtを活用した仮想通貨の自動取引

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次