Python

【Python】Cryptowatchが使えなくなったのでKrakenAPIを叩いて仮想通貨(暗号資産)のヒストリカルデータを取得

記事内に商品プロモーションを含む場合があります

こんにちは、hokkyokunです。

Cryptowatchが使えなくなってしまったので
KrakenのPublicAPIを叩いてヒストリカルデータ(過去データ)をとっていきたいと思います。

APIにはPrivateAPIとPublicAPIがあり、
PrivateAPIはkeyの取得が必要ですが、
Publicの場合は特段登録しなくても使えます。

価格データはPublicでも取得できるので
PublicAPIを叩いてみようと思います。

CryptowatchAPIが使えなくなった

CryptowatchのpublicAPIが使えなくなってます

以前は、
こんな感じの関数を使って仮想通貨のヒストリカルデータを取得していました。

import requests

def fetch_historical_data_from_CryptoWatch():
    exchange="kraken" #取引所(kraken)
    symbol="btcusd" #通貨ペア(ビットコイン/米ドル)
    url= f"https://api.cryptowat.ch/markets/{exchange}/{symbol}/ohlc?periods=86400&after=0"

    res = requests.get(url).json()
    return res

この関数を使ってみます。

res=fetch_historical_data_from_CryptoWatch()
print(res)

うまくいきませんでした。
少なくともこのままではデータ取れません。

代替案としてKrakenという取引所のAPIを使ってデータ取得を試みてみます。

Krakenとは?

Krakenは何かchatGPTに聞いてみると以下のようなことを教えてくれました。

Krakenは、アメリカ合衆国に本拠を置く、世界的に知られる暗号資産(仮想通貨)取引所です。以下はKrakenについての概要です:
設立年と創業者:Krakenは2011年に設立されました。創業者はジェシー・パウエル(Jesse Powell)です。
本社の所在地:本社はカリフォルニア州サンフランシスコに位置しています。
提供サービス:Krakenはビットコインを含む多種多様な暗号資産の売買を提供しており、ユーザーは取引所で直接資産を取引することができます。また、マージン取引、先物取引、OTC(Over The Counter)取引などの高度な取引オプションも提供しています。
セキュリティ:Krakenは業界内でも特にセキュリティが高いと評価されています。2要素認証(2FA)、コールドストレージ(オフラインストレージ)、厳格な監査プロセスなど、多層のセキュリティ対策を講じています。
規制とコンプライアンス:Krakenは、米国を含む複数の国の法規制に準拠して運営されており、適切なライセンスと規制の下でサービスを提供しています。
ユーザーベースと利用可能地域:Krakenは全世界の多くの国々でサービスを提供しており、幅広い国際的なユーザーベースを持っています。
Krakenは、その使いやすさ、高いセキュリティ基準、多様な取引オプションを提供することで、初心者から経験豊富なトレーダーまで幅広く支持されている取引所の一つです。

セキュリティの高い大手の仮想通貨取引所みたいです。

APIが用意されており、
登録しなくても使えるPublicAPIもあります。

PublicAPIで通貨のデータが取得できるので、
こちらを使わせてもらいます。

ヒストリカルデータの取得

コード

Pythonコードです。

引数は
symbol=通貨ペアを指定
start_date=データの開始日(datetime型)
end_date=データの終了日(datetime型)
interval=データの間隔(指定しなければ1440分毎=1日毎)

import requests
import pandas as pd
from datetime import datetime

def fetch_historical_data(symbol, start_date, end_date, interval=1440):
    """
    Kraken APIを使用して指定された通貨ペアのヒストリカルデータを取得

    Args:
    symbol (str): 取得したい通貨ペアのシンボル(例: 'XXBTZUSD')
    start_date (datetime): データ取得の開始日時
    end_date (datetime): データ取得の終了日時
    interval (int, optional): データの間隔(分単位)。デフォルトは1440分(1日)。

    Returns:
    pandas.DataFrame: 指定された通貨ペアのヒストリカルデータを含むDataFrame。
    """
    # Unixタイムスタンプに変換
    start_timestamp = int(start_date.timestamp())
    end_timestamp = int(end_date.timestamp())

    # KrakenのOHLCエンドポイントURL
    url = 'https://api.kraken.com/0/public/OHLC'

    # データを格納するためのデータフレーム
    df = pd.DataFrame()

    while start_timestamp < end_timestamp:
        # パラメータの設定
        params = {
            'pair': symbol,
            'interval': interval,
            'since': start_timestamp
        }

        # APIリクエストを実行
        response = requests.get(url, params=params)

        # レスポンスの確認
        if response.status_code != 200:
            raise Exception(f"API request failed with status code {response.status_code}")

        # データの抽出
        data = response.json()

        # 結果を確認
        if data['error']:
            return df

        # 取得したデータを追加
        new_data = pd.DataFrame(data['result'][symbol], columns=[
            'Time', 'Open', 'High', 'Low', 'Close', 'VWAP', 'Volume', 'Count'
        ])
        new_data['Time'] = pd.to_datetime(new_data['Time'], unit='s')
        df = pd.concat([df,new_data],ignore_index=True)

        # 次のリクエストの開始タイムスタンプを更新
        start_timestamp = int(data['result']['last'])

        last = int(data['result']['last'])
        if last <= start_timestamp:
            break  # 過去のデータが更新されない場合はループを終了
        start_timestamp = last

        # 取得したデータの最新タイムスタンプがend_dateを超えた場合、ループを終了
        if df['Time'].max() > pd.Timestamp(end_date):
            break

    df=df[(df["Time"]>=start_date) & (df["Time"]<=end_date)]

    return df

Pythonを短時間で使えるようにするにはスクールがお勧めです。
月額2980円となっており、正直この値段で質問ができるのはかなり魅力です。
月額型なので、費用もかなり抑えられます。

使用例

実際の使用例はこちらです。

ビットコイン/USドル=BTC-USDの2022年11月30日から2023年11月30日までで取得してみました。

通貨ペアの指定にコツがいります。(法則ある?)
主要通貨リストを後述していますので、参考にしてみてください。

#ビットコイン/USドル
symbol = 'XXBTZUSD'
start_date = datetime(2022, 11, 30)
end_date = datetime(2023, 11, 30)
historical_data = fetch_historical_data(symbol, start_date, end_date)
print(historical_data)

こんな感じでデータ取れました。

通貨ペアの指定方法

通貨ペアの指定方法が独特なので表にしました。
取得したい通貨ペアの「Symbol」を上記の関数の引数にして使ってみてください。

対ドル

通貨ペア略称通貨ペア全名Symbol
BTC/USDビットコイン/米ドルXXBTZUSD
ETH/USDイーサリアム/米ドルXETHZUSD
XRP/USDリップル/米ドルXXRPZUSD
LTC/USDライトコイン/米ドルXLTCZUSD
BCH/USDビットコインキャッシュ/米ドルBCHUSD
EOS/USDイオス/米ドルEOSUSD
XLM/USDステラルーメン/米ドルXXLMZUSD
ADA/USDエイダコイン/米ドルADAUSD
XTZ/USDテゾス/米ドルXTZUSD
LINK/USDチェーンリンク/米ドルLINKUSD

対日本円

通貨ペア略称通貨ペア全名Symbol
BTC/JPYビットコイン/日本円XXBTZJPY
ETH/JPYイーサリアム/日本円XETHZJPY
XRP/JPYリップル/日本円XXRPZJPY
LTC/JPYライトコイン/日本円XLTCZJPY
BCH/JPYビットコインキャッシュ/日本円BCHJPY
EOS/JPYイオス/日本円EOSJPY
XLM/JPYステラルーメン/日本円XXLMZJPY
ADA/JPYエイダコイン/日本円ADAJPY
XTZ/JPYテゾス/日本円XTZJPY
LINK/JPYチェーンリンク/日本円LINKJPY

もっと知りたい方は公式ドキュメントを

いろいろできるみたいですので、
興味のある方は公式ドキュメントを参考にしてみてください。

公式ドキュメント

日本の取引所はどうなの?

日本の取引所でもデータ取れそうなのでチャレンジしてみます。
当たり前ですが、日本語でドキュメントが用意されているので安心(笑)

自動売買とかもできそうだから、遊んでみようかな。

コインチェック公式ドキュメント

コインチェックの口座開設はこちらからできます。
Coincheck

コインチェック