【Python】Coincheck APIからビットコイン1分ローソク足データを自動取得

コーディング

Coincheckは1時間のローソク足データを無償で取得できますが、仮想通貨のボラティリティを考えると1分足の方が何かと便利です。しかし1分足は公式に提供されていません。

それなら自分で1分ローソク足チャートを作成に必要なデータを自動取得するプログラムをAWS上で運用しよう!というのが今回の記事になります。

ちなみにbitFlyerなどの一部の取引所はCryptowatcherから取得できますが、少額自動売買ではCoincheckの取引手数料無料が魅力的なため、『Coincheckの1分ローソク足を取得する』という点に拘っていきます。

ローソク足チャートに必要なデータ

ローソク足は時間単位における始値、高値、安値、終値を箱ひげ図で描画したグラフです。時間単位で価格が上昇した場合は青or緑、下落した場合は赤色の箱ひげ図で表されます。

描画に必要な値の4つの値の意味は以下の通り。

  • 始値(open):時間単位開始時の価格
  • 高値(high):時間単位内の成立した取引の最高値
  • 安値(low):時間単位内に成立した取引の最安値
  • 終値(close):時間単位に最後に成立した取引価格

以上を略してOHLCとか、出来高(volume)も含めてOHLCVとも呼ばれます。ということで1分間隔のOHLCVデータを取得できれば1分ローソク足が描画できます。

Coincheck APIからpythonを使ってOHLCVを取得

残念ながらCoincheck APIには1分足のOHLCVを取得する機能がありません。そこで直近の全取引データを取得して、その取引内容をOHLCVを自作する必要があります。

Coincheck APIから全取引データを取得

全取引データの取得APIは公式に記載されているURL(https://coincheck.com/api/trades)にrequestsのgetメソッドでアクセスします。

import requests

url = 'https://coincheck.com/api/trades'
params = {
    'pair': 'btc_jpy', # 通貨ペアを指定
    'limit': 100       # デフォルトでは10件しか取得しないので、最大の100を指定
         }
all_trades = requests.get(url, params=params).json()

取得した全取引データ(辞書型)の”data” keyにリスト形式で取引データが格納されており、さらにリスト中に辞書型で各取引のデータが以下の形式で格納されています。

all_trades['data'] = [
                      {
                        'id': '取引ID', 
                        'amount': '0.15',
                        'rate': '4000000',
                        'pair': 'btc_jpy',
                        'order_type': 'sell or buy',
                        'created_at': '2023-01-10T05:55:38.000Z' 
                      },...
                     ]

全取引データを直近1分間のOHLCVに変換

取得した取引データのうち、OHLCVに必要になるのは以下3つ。

  • ”amount”: 成立した取引の出来高。volumeの算出に必要。
  • ”rate”: 成立した取引価格。OHLCの算出に必要。
  • “created_at”:成立した時刻。1分ごとのデータに集約するために必要。ただし米国太平洋時間なので注意。

ここで注意すべきは時間データが米国太平洋時間であるという点です。こちらを日本時間に修正しつつ、取得した現在時刻の1分前のデータだけを集約します。表形式にしてしまえば時刻データはpandasで簡単に扱えます!

import pandas as pd

df = pd.DataFrame(all_trades['data'])                  # 取得した取引データをデータフレームに変換
df['created_at'] = pd.to_datetime(df['created_at'])    # 時刻データをdatetime形式に変換
df = df.set_index('created_at')                        # 時刻をindexに設定
df.index = df.index.tz_convert('Asia/Tokyo')           # 時刻データを日本時間に変換

now = pd.Timestamp.now(tz='Asia/Tokyo')                # 現在時刻を取得
now = now.replace(second=0)                            # 現在時刻の秒を切り捨てる
one_minute_ago = now - pd.Timedelta(minutes=1)         # 1分前の時刻を取得

last_1min = df.between_time(one_minute_ago.time(), now.time()) # 直前1分間のデータにスライス
last_1min = last_1min[['amount', 'rate']].astype(float)

last_1minのデータフレームからOHLCVデータを抽出してCSVファイルに格納します。

import csv

ohlcv = [
    str(one_minute_ago),
    last_1min['rate'][-1],     # open
    last_1min['rate'].max(),   # high
    last_1min['rate'].min(),   # low
    last_1min['rate'][0],      # close
    last_1min['amount'].sum()  # volume
]

with open('./ohlcv.csv', 'a') as f:
    csv.writer(f).writerow(ohlcv)

出来高が多い時間帯の対策

ここまでのコードを纏めてcronを使って1分毎に実行すればよいのですが、ビットコイン価格が急騰/急落したタイミングなど取引量が多い場合は取引件数が100では足りない可能性があります。

その対策として、プログラムを実行して20秒後、40秒後に当該分のデータ、60秒後に直前1分間のデータをそれぞれ取得することで最大300件データを取得するようにします。まとめたコードは以下になります。

import csv
from time import sleep

import pandas as pd
import requests

url = 'https://coincheck.com/api/trades'
params = {
    'pair': 'btc_jpy',
    'limit': 100
    }

missing_data = False
dfs = []

# 時刻取得
now = pd.Timestamp.now(tz='Asia/Tokyo').replace(second=0) # 現在
in_one_minute = now + pd.Timedelta(minutes=1)             # 1分後

for i in range(3): # 20, 40, 60秒後にそれぞれデータを取得
    sleep(20)

    all_trades = requests.get(url, params=params).json()
    df = pd.DataFrame(all_trades['data'])
    df['created_at'] = pd.to_datetime(df['created_at'])
    df = df.set_index('created_at')
    df.index = df.index.tz_convert('Asia/Tokyo')
    df = df.between_time(now.time(), in_one_minute.time())
    dfs.append(df)

    if len(df) == 100:                      # データ数が100のときはフラグを立てる
        missing_data = True

df = pd.concat(dfs, axis=0)                 # データフレーム集約
df = df.drop_duplicates()                   # 重複削除
df = df[['amount', 'rate']].astype(float)

# get ohlcv
ohlcv = [
    str(now),
    df['rate'][-1],
    df['rate'].max(),
    df['rate'].min(),
    df['rate'][0],
    df['amount'].sum()
]

ohlcv.append('data missing') if missing_data else ohlcv.append('-')

with open('./ohlcv.csv', 'a') as f:
    csv.writer(f).writerow(ohlcv)

1分間に300件以上の取引がある場合は一応アラートを残しつつ諦めます笑

最後にAWS上で1分毎にプログラムを実行する

プログラムを24時間常時動かすためにはAWSなどのクラウドサーバーを利用すると便利です。AWSのt2.microというクラウドサーバーは最初の1年無料で使えます。(2023年8月現在)

AWSのt2.micro起動方法、SSH接続方法は以下Qiitaの記事が参考になります!(手抜き)

SSHでAWS上のLinuxに接続できたら、あとはPython環境を作成してcronで1分毎に上記のプログラムを実行するだけです!これで目的のCoincheckの1分ローソク足が取得できます。

次回の記事では実際にローソクを分析することに挑戦したいと思います!

コメント