てけとーぶろぐ。

ソフトウェアの開発と、お絵かきと、雑記と。

Pythonでビットコインの価格をグラフ化する

前回収集した価格データをグラフ化して、自動売買のアルゴリズムを考えてみましょう。

価格データのグラフ化

前回収集した価格データのCSVファイルが以下です。

ticker_20200514.zip

こちらをPythonプログラムでグラフ化してみます。
グラフの描画にはnumpyパッケージ, matplotlibパッケージを使います。
またCSVファイルの読み込み等にpandasパッケージを使います。

それぞれをインストールします。

> pip install matplotlib
> pip install pandas

matplotlibを使ったグラフの描画については以下のサイトを参考にしました。

note-tech.com
note-tech.com

全体のコードは以下になります。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


if __name__ == '__main__':

    df = pd.read_csv('ticker_20200514.csv')

    df['timestamp'] = pd.to_datetime(df['timestamp'])

    START_TIMESTAMP = '2020-05-06 10:00'
    END_TIMESTAMP = '2020-05-06 18:00'
    SAMPLING_PERIOD_SEC = 3
    SHORT_MA_PERIOD_SEC = 1 * 60
    LONG_MA_PERIOD_SEC = 10 * 60

    # データの期間を絞る
    df = df[(df['timestamp'] >= START_TIMESTAMP) & (df['timestamp'] < END_TIMESTAMP)]

    # 移動平均の列を作成
    df['askShortMa'] = df['ask'].rolling(SHORT_MA_PERIOD_SEC // SAMPLING_PERIOD_SEC, min_periods=1).mean()
    df['askLongMa'] = df['ask'].rolling(LONG_MA_PERIOD_SEC // SAMPLING_PERIOD_SEC, min_periods=1).mean()

    # グラフ描画
    fig, ax = plt.subplots()
    ax.plot(df['timestamp'], df['ask'], label='ask')
    ax.plot(df['timestamp'], df['askShortMa'], label='ask ma 1 min')
    ax.plot(df['timestamp'], df['askLongMa'], label='ask ma 10 min')
    ax.legend(fontsize=16)
    ax.set_xlabel('timestamp', fontsize=16)
    ax.set_ylabel('¥', fontsize=16)
    ax.set_title('Ticker', fontsize=16)
    plt.show()

上記サイトから幾つか変更点があります。

まず全データを描画すると時間がかかるためデータを絞りました。
以下のコードで指定の期間分に絞ったDataFrameを作成しています。

    # データの期間を絞る
    df = df[(df['timestamp'] >= START_TIMESTAMP) & (df['timestamp'] < END_TIMESTAMP)]

また移動平均の求め方について
上記サイトではnumpyのconvolve()を使っていますが
pandasでできる範囲はpandasでということで以下のサイトを参考にpandasのrolling()で移動平均を求めています。

note.nkmk.me

以下のコードになります。
「min_periods=1」として先頭の方でデータが足りなくても1つ以上データがあればある分だけで平均値を求めるようにしています。

    # 移動平均の列を作成
    df['askShortMa'] = df['ask'].rolling(SHORT_MA_PERIOD_SEC // SAMPLING_PERIOD_SEC, min_periods=1).mean()
    df['askLongMa'] = df['ask'].rolling(LONG_MA_PERIOD_SEC // SAMPLING_PERIOD_SEC, min_periods=1).mean()

実行すると以下のグラフが描画されます。

f:id:kurimayoshida:20200607160330p:plain

自動取引のアルゴリズムを考える

グラフを眺めてみるとどうでしょうか?
移動平均の期間を変えたり、表示する期間を変えたりしてもいいかと思います。
1分の移動平均線が10分の移動平均線を下から突き抜けるとある程度価格が上昇しているように見えます。
いわゆるゴールデンクロスですね。

参考: 「ゴールデンクロス」「デッドクロス」とは? | お金のキャンパス

このゴールデンクロスを買いシグナルとする自動取引のアルゴリズムでいくことにしましょう。
分析と言うには程遠い感じですしゆくゆくは機械学習の学習結果を使った自動取引などにも挑戦したいとは思うのですが
まずは実現しやすいものでどの程度の成績がでるか試してみます。


次回はこのゴールデンクロスを使った売買のアルゴリズムをつくり
売買をシミュレーションしてみます。