Bot

仮想通貨botの開発記録#50(2024/1/28)「C級Botterへのステップ③ccxtライブラリを使ったKucoinでのポジションと残高の取得&金融の文脈で使われる『バランス』の意味」

2024年1月28日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

参考にしたのは【Botter Advent Calendar2023】仮想通貨で月に1万円を稼ぐC級Botterになろうです。

また、取引や金融の文脈で出てくる「バランス」という言葉の意味についてもまとめました。

ポジションと残高の確認

Yodaka

今回は例題2に取り組みました。

例題1:fetchOrderBookを使って任意の取引所(現物)のETH-USDT価格を取得しましょう
例題2: 今、0.01ethを任意のperpがある取引所でロングしているとします。例えば、Kucoin futuresのETH-USDTMにポジションがあるとします。
 fetchPositions fetch_balance を用いて、ロング/ショートをどの程度持っているか表示し、フリーなUSDTバランスをprintで表示させましょう。

例題 3: createOrderを用いて0.01 ethを購入し、10秒後に売却しましょう。レバは3倍とし、market orderを使用しましょう。

ポジションを確認

Yodaka

実行したのは以下のコードです。

import ccxt

# KuCoinのAPIキー、シークレットキー、取引所のログインパスワードを設定
api_key = '***'
secret_key = '***'
password = '***'

# KuCoinの取引所オブジェクトを作成し、APIキーとパスワードを設定
kucoin = ccxt.kucoin({
    'apiKey': api_key,
    'secret': secret_key,
    'password': password,
})

try:
    # アカウントの詳細情報を取得
    account_info = kucoin.private_get_accounts()

    # ポジション情報を取得
    positions = []
    for balance in account_info['data']:
        if float(balance['available']) > 0 or float(balance['frozen']) > 0:
            position = {
                'symbol': balance['currency'],
                'free': float(balance['available']),
                'used': float(balance['frozen']),
                'total': float(balance['available']) + float(balance['frozen']),
            }
            positions.append(position)

    # ポジション情報を表示
    print("ポジション情報:")
    print(positions)

except ccxt.NetworkError as e:
    print(f"ネットワークエラー: {e}")
except ccxt.ExchangeError as e:
    print(f"取引所エラー: {e}")
except Exception as e:
    print(f"エラー: {e}")
Yodaka

現在はポジションを持っていないため、ポジション情報は表示されません。

ネットワークエラー等も検出されていないため「空のデータが返ってくる」ことでコードが正常に稼働していると判断できます。

残高を確認

Yodaka

実行したのは以下のコード。

import ccxt

# KuCoinのAPIキー、シークレットキー、取引所のログインパスワードを設定
api_key = '***'
secret_key = '***'
password = '***'

# KuCoinの取引所オブジェクトを作成し、APIキーとパスワードを設定
kucoin = ccxt.kucoin({
    'apiKey': api_key,
    'secret': secret_key,
    'password': password,
})

try:
    # 残高情報を取得
    balance = kucoin.fetch_balance()

    # 取引所の全体の残高
    total_balance = balance['total']

    # 利用可能な残高
    free_balance = balance['free']

    # 使用中の残高
    used_balance = balance['used']

    print(f"取引所全体の残高: {total_balance}")
    print(f"利用可能な残高: {free_balance}")
    print(f"使用中の残高: {used_balance}")

    # 各通貨ごとの残高情報
    for currency, details in balance['info'].items():
        print(f"{currency} 残高情報: {details}")

except ccxt.NetworkError as e:
    print(f"ネットワークエラー: {e}")
except ccxt.ExchangeError as e:
    print(f"取引所エラー: {e}")
except Exception as e:
    print(f"エラー: {e}")
Yodaka

口座には1円も入れていないので「表示されない」が正常な状態です。

code 残高情報で200000と表示されているため、コードが正常に稼働していることが分かります。

この後、テスト用に入金した0.1ETHが反映されていることも確認しました。

ccxtを使う時の注意点

今回の課題に取り組んだことで

特定のメソッドがccxtではサポートされている
しかし、取引所ではそのメソッドがサポートされていないことがある
→エラーの原因になる

ということが分かりました。

具体的には

Kucoinではccxtのfetch_positionsメソッドは利用できず、代わりにfetch_balanceを使う必要がある

ということです。

要するに

ccxtだけで全てできると考えずに、取引所のAPI仕様書もちゃんと目を通しておきなさい

ということです。

ccxtで利用可能なメソッドを確認する

今回の課題に取り組むにあたって「ccxtでKucoin用に利用可能なメソッド」を確認するコードをChatGPTに書かせていました。

Yodaka

例えば以下のようなコードですね。

import ccxt

def get_exchange_info(exchange_name):
    try:
        # 取引所オブジェクトを作成
        exchange = getattr(ccxt, exchange_name)()

        # 取引所で利用可能なメソッドとエンドポイントを表示
        print(f"取引所: {exchange_name}")
        print("利用可能なメソッド:")
        for method_name in dir(exchange):
            if not method_name.startswith('_') and callable(getattr(exchange, method_name)):
                print(f"  - {method_name}")

        print("\nエンドポイント:")
        for endpoint, details in exchange.describe().get('urls', {}).items():
            print(f"  - {endpoint}: {details['info']}")

    except ccxt.NetworkError as e:
        print(f"ネットワークエラー: {e}")
    except ccxt.ExchangeError as e:
        print(f"取引所エラー: {e}")
    except Exception as e:
        print(f"エラー: {e}")

# KuCoinの取引所で利用可能なメソッドとエンドポイントを表示
get_exchange_info('kucoin')
Yodaka

上記のコードでは、ccxtで利用可能なメソッドの一覧が取得できます。このコードを実行するとfetch_position,fetch_positionsが一覧に表示されます。

※これ自体はccxtのエラーではありません。

本当にfetchPositionsメソッドを利用できないのかどうかを検証

Yodaka

以下の2つのコードを実行しました。

#任意の取引所で特定のメソッドが利用可能かどうかを確認する
import ccxt

def check_method_support(exchange_name, method_name):
    try:
        # 取引所オブジェクトを作成
        exchange = getattr(ccxt, exchange_name)()

        # メソッドが存在するか確認
        if hasattr(exchange, method_name) and callable(getattr(exchange, method_name)):
            print(f"{exchange_name} で {method_name} は利用可能です。")
        else:
            print(f"{exchange_name} で {method_name} は利用不可能です。")

    except ccxt.NetworkError as e:
        print(f"ネットワークエラー: {e}")
    except ccxt.ExchangeError as e:
        print(f"取引所エラー: {e}")
    except Exception as e:
        print(f"エラー: {e}")

# 例: KuCoinのfetchPositionsメソッドがサポートされているか確認
check_method_support('kucoin', 'fetchPositions')
#fetchPositionsを使っポジション情報を獲得する
import ccxt

# KuCoinのAPIキー、シークレットキー、取引所のログインパスワードを設定
api_key = '***'
secret_key = '***'
password = '***'

# KuCoinの取引所オブジェクトを作成し、APIキーとパスワードを設定
kucoin = ccxt.kucoin({
    'apiKey': api_key,
    'secret': secret_key,
    'password': password,
})

try:
    # ポジション情報を取得
    positions = kucoin.fetch_positions()

    # ポジション情報を表示
    print("ポジション情報:")
    print(positions)

except ccxt.NetworkError as e:
    print(f"ネットワークエラー: {e}")
except ccxt.ExchangeError as e:
    print(f"取引所エラー: {e}")
except Exception as e:
    print(f"エラー: {e}")
Yodaka

1つ目のコードではKucoinでfetchPositionsが利用可能と出ています。

しかし2つ目のコードでfetchPositionsを使って実際に稼働させてみると、fetchPositionsメソッドではKucoinのポジション情報を獲得できないことが分かりました。

ccxtのソースコードやKucoinの公式ドキュメントを読み込んでみるともっと深く理解できる可能性はありますが、この点は緊急の課題ではないので今は保留にしておきます。

調べる必要が出てきたら、 ChatGPTに課金してDocを読み込ませて再び検証させてみても良いかもしれません。

Yodaka

この2箇所は一通り目を通しておきます。

追記(2024/2/11):問題の解決

Yodaka

以下の記事で、先物取引の証拠金残高とポジションを獲得することができるようになった経緯をまとめています。

仮想通貨botの開発記録#54(2024/2/11)「C級Botterへのステップ④ccxtライブラリを使ってKucoinでのETH-USDT先物のポジションと証拠金残高を獲得するwithChatGPT4」

【取引や金融の文脈で出てくる「バランス」とは?】

Yodaka

備忘録として「バランス」についてもまとめておきます。

バランス」とは特定のアカウントや口座に残っている資金や資金量を指す用語。

取引や金融の文脈では「残高」の意味で用いられることがある。

「バランス」=「残高」の意味で用いられる理由は歴史的な背景や言葉の使い方に起因するものがある。

1、帳簿のバランス

会計や金融において、帳簿を合わせることを「バランスを取る」と表現する。これは資産と負債が等しいことを示す。つまり、帳簿が正確であることを裏付ける。 口座残高も、この考えに基づいていて、資産(残高)と負債がバランスしていることを示す。

2、安定感と調和

「バランス」は一般的に、安定感や調和を表す言葉として使われる。口座や資産がバランスしていることは、安定しており、適切に管理されている印象を与える。

3、言語の習慣

金融や取引の分野では特定の用語が慣習的に使われており、口座残高を「バランス」と呼ぶ習慣がある。

【総括1】

口座残高を「バランス」と呼ぶのは、取引や金融の文脈での表現習慣や、資産と負債が調和しているイメージを示すための言葉選びが影響していると考えられる。

Yodaka

もう少しだけ解像度を上げてみましょう。

【会計原則とバランスシート】

会計原則に基づく会計の基本的な考え方では、資産は負債と資本に等しいとされる。これがバランスシートとして知られており、これは企業や個人の財務状況を示す重要な文書の一つ。この考え方に基づいて、口座や資産の残高が「バランスしている」という表現が使われる。資産(持ち物やお金)の総額は、負債(借金など)と資本(自己資本や投資)の総額に等しいはずである。

【帳簿の正確性】

会計では、帳簿が正確であることが非常に重要。帳簿が正確でない場合、企業や個人は実際の財務状況を正確に把握できない。口座残高が「バランスしている」というのは、帳簿が正確であり、財務状況が適切に管理されていることを示唆している。

【安定感と安心感】

「バランス」という言葉には、物事が安定している印象がある。口座残高がバランスしているというのは、資産や債務が調和しており、安定感があると感じられるからである。これは投資家や取引相手にとっても信頼性があると見なされる要因の一つとなる。

【取引所や銀行の慣習】

取引所や銀行などの金融機関では、口座残高を「バランス」と呼ぶのが一般的。これは、金融業界の言語慣習として定着している。

【バランス:まとめ】

総じて、「残高」という言葉が単に金額の合計を指すのに対して、「バランス」はより広い意味で、資産と負債が調和している概念や、帳簿が正確で安定している状態を指す言葉として使われている。

Yodaka

これまで何となく使っていた言葉の意味を明確にすることができました。

まとめ

今回はかなり回りくどいことをしましたが、個人的にはかなり重要なポイントでした。

Kucoinで取引のエッジを見つけることができたら今後も積極的に触っていきます。

ccxtと取引所固有のAPIの仕様に差がある

ということを実感したため、他の取引所のAPIもどんどん触っていきます。

例えば、積立Botを各取引所ごとに作ってみるなどの宿題はリスクも低いのでちょうど良い課題です。

今後もこの調子で自分のペースを崩さずに学習を進めていきます。

宿題

KucoinAPIの公式ドキュメント(RESTとWebsocket)を読む
1つ以上の取引所で積立Botを作
価格情報の歪みを検知するBotを作る(済)→既にプロトタイプは作ったので発展系を作る

-Bot