初速1PV

プログラミングにまつわることの記録

BitMEXの1分足データから移動平均線を求める

BitMEXの自動売買bot移動平均線が使えそうだったので、自分で計算してみます。 本記事のコードのではBitMEXから1分足データを取得し、移動平均線を描画します。

移動平均線

wikipedia から

移動平均線(いどうへいきんせん)は、株価や外国為替テクニカル分析において使用される指標。移動平均も参照。

株価や外国為替 (FX)でもつかわれている指標で、ビットコインの為替にも適用可能ではないかと思えます。 移動平均線は平均する株価の期間によって、たとえば、5日移動平均線であれば、過去5日の日足の終値の平均値をグラフにしたものです。

実装

取得したデータを加工して移動平均線を作成します。データの作成ができたらローソク足と一緒に移動平均線を描画します。 ローソク足の情報はBitMEXが提供しており (https://www.bitmex.com/api/udf/history)、取得には特に認証を必要としません。また、グラフの描画はplotlyというグラフの描画ライブラリを用います。

依存ライブラリ

pip install plotly requests

コード

import json
from datetime import datetime, timedelta
import requests
import plotly

SYMBOL = 'XBTUSD'


def get_ohlc(resolution, start_time, end_time=datetime.today()):
    res = requests.get('https://www.bitmex.com/api/udf/history', params={
        'symbol': SYMBOL,
        'resolution': resolution,
        'from': start_time.timestamp(),
        'to': end_time.timestamp(),
        })
    return json.loads(res.text)


def moving_average_of(ohlc_data, n):
    assert 't' in ohlc_data and 'c' in ohlc_data
    ret = { 't': [], 'm': [] }
    ave = sum(ohlc_data['c'][:n]) / n
    ret['t'].append(ohlc_data['t'][n-1])
    ret['m'].append(ave)
    for i in range(n, len(ohlc_data['t'])):
        ave -= ohlc_data['c'][i - n] / n
        ave += ohlc_data['c'][i] / n
        ret['t'].append(ohlc_data['t'][i])
        ret['m'].append(ave)
    return ret


ohlc_data = get_ohlc(1, datetime.today() + timedelta(days=-1))
ohlc_data['t'] = list(map(datetime.utcfromtimestamp, ohlc_data['t']))

trace1 = plotly.graph_objs.Candlestick(
    x=ohlc_data['t'],
    open=ohlc_data['o'],
    high=ohlc_data['h'],
    low=ohlc_data['l'],
    close=ohlc_data['c'],
)

ma5 = moving_average_of(ohlc_data, 5)
trace2 = plotly.graph_objs.Scatter(x=ma5['t'], y=ma5['m'])

ma9 = moving_average_of(ohlc_data, 9)
trace3 = plotly.graph_objs.Scatter(x=ma9['t'], y=ma9['m'])
plotly.offline.plot([trace1, trace2, trace3], filename='moving-average.html')

実行例

上記のコードでは実行時から1日前までの1分足データから移動平均線を計算していますが、1日、7時間、1時間分の1分足と移動平均線でプロットした結果が以下になります。 

f:id:shirai3:20190720144230p:plain
1日分の1分足

f:id:shirai3:20190720144303p:plain
7時間分の1分足

f:id:shirai3:20190720144508p:plain
1時間分の1分足

plotlyではブラウザでプロットした画像を表示してくれますが、上の中では自分でのディスプレイでは7時間分くらいが一番移動平均線がくっきり見えそれなりの量のデータが並んでくれて、1時間分のではやや寂しい見た目でした。 ブログ用にスクリーンショットを貼ると詰まって見えてしまうだけかもしれないので、実験する場合は、特に理由がなければ7, 8時間分のデータをプロットするのがいいと思います。

おわりに

wikipediaによると、移動平均線は25日と9日のものを使うらしいですが、頻繁にトレードする場合はなどは使うローソク足や平均する時間の幅も異なるかと思いますが、 上記で書いたコードでは引数をいじるだけでほしい移動平均線を計算することができます。

参考