前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
参考にしたのは【Botter Advent Calendar2023】仮想通貨で月に1万円を稼ぐC級Botterになろうです。
また、取引や金融の文脈で出てくる「バランス」という言葉の意味についてもまとめました。
ポジションと残高の確認
今回は例題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を使用しましょう。
ポジションを確認
実行したのは以下のコードです。
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}")
現在はポジションを持っていないため、ポジション情報は表示されません。
ネットワークエラー等も検出されていないため「空のデータが返ってくる」ことでコードが正常に稼働していると判断できます。
残高を確認
実行したのは以下のコード。
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}")
口座には1円も入れていないので「表示されない」が正常な状態です。
code 残高情報で200000と表示されているため、コードが正常に稼働していることが分かります。
この後、テスト用に入金した0.1ETHが反映されていることも確認しました。
ccxtを使う時の注意点
今回の課題に取り組んだことで
特定のメソッドがccxtではサポートされている
→しかし、取引所ではそのメソッドがサポートされていないことがある
→エラーの原因になる
ということが分かりました。
具体的には
Kucoinではccxtのfetch_positionsメソッドは利用できず、代わりにfetch_balanceを使う必要がある
ということです。
特定のメソッドがccxtではサポートされているけれど取引所固有のAPIではサポートされていないパターンがあるのですね。これでスッキリしました。Kukoin触ってみて良かったです。しばらくは使う予定ないですが、普段と違う仕様に触れることで学びになりました。他の取引所APIも積極的に触ってみよう。
— よだか(夜鷹/yodaka) (@yodakablog) January 28, 2024
要するに
ccxtだけで全てできると考えずに、取引所のAPI仕様書もちゃんと目を通しておきなさい
ということです。
ccxtで利用可能なメソッドを確認する
今回の課題に取り組むにあたって「ccxtでKucoin用に利用可能なメソッド」を確認するコードをChatGPTに書かせていました。
例えば以下のようなコードですね。
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')
上記のコードでは、ccxtで利用可能なメソッドの一覧が取得できます。このコードを実行するとfetch_position,fetch_positionsが一覧に表示されます。
※これ自体はccxtのエラーではありません。
本当にfetchPositionsメソッドを利用できないのかどうかを検証
以下の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}")
1つ目のコードではKucoinでfetchPositionsが利用可能と出ています。
しかし2つ目のコードでfetchPositionsを使って実際に稼働させてみると、fetchPositionsメソッドではKucoinのポジション情報を獲得できないことが分かりました。
ccxtのソースコードやKucoinの公式ドキュメントを読み込んでみるともっと深く理解できる可能性はありますが、この点は緊急の課題ではないので今は保留にしておきます。
調べる必要が出てきたら、 ChatGPTに課金してDocを読み込ませて再び検証させてみても良いかもしれません。
この2箇所は一通り目を通しておきます。
参考
追記(2024/2/11):問題の解決
以下の記事で、先物取引の証拠金残高とポジションを獲得することができるようになった経緯をまとめています。
【取引や金融の文脈で出てくる「バランス」とは?】
備忘録として「バランス」についてもまとめておきます。
【取引や金融の文脈で出てくる「バランス」とは?】
「バランス」とは特定のアカウントや口座に残っている資金や資金量を指す用語。取引や金融の文脈では「残高」の意味で用いられることがある。
「バランス」=「残高」の意味で用いられる理由は歴史的な背景や言葉の使い方に起因するものがある。— よだか(夜鷹/yodaka) (@yodakablog) January 16, 2024
「バランス」とは特定のアカウントや口座に残っている資金や資金量を指す用語。
取引や金融の文脈では「残高」の意味で用いられることがある。
「バランス」=「残高」の意味で用いられる理由は歴史的な背景や言葉の使い方に起因するものがある。
1、帳簿のバランス
会計や金融において、帳簿を合わせることを「バランスを取る」と表現する。これは資産と負債が等しいことを示す。つまり、帳簿が正確であることを裏付ける。 口座残高も、この考えに基づいていて、資産(残高)と負債がバランスしていることを示す。
2、安定感と調和
「バランス」は一般的に、安定感や調和を表す言葉として使われる。口座や資産がバランスしていることは、安定しており、適切に管理されている印象を与える。
3、言語の習慣
金融や取引の分野では特定の用語が慣習的に使われており、口座残高を「バランス」と呼ぶ習慣がある。
【総括1】
口座残高を「バランス」と呼ぶのは、取引や金融の文脈での表現習慣や、資産と負債が調和しているイメージを示すための言葉選びが影響していると考えられる。
もう少しだけ解像度を上げてみましょう。
【会計原則とバランスシート】
会計原則に基づく会計の基本的な考え方では、資産は負債と資本に等しいとされる。これがバランスシートとして知られており、これは企業や個人の財務状況を示す重要な文書の一つ。この考え方に基づいて、口座や資産の残高が「バランスしている」という表現が使われる。資産(持ち物やお金)の総額は、負債(借金など)と資本(自己資本や投資)の総額に等しいはずである。
【帳簿の正確性】
会計では、帳簿が正確であることが非常に重要。帳簿が正確でない場合、企業や個人は実際の財務状況を正確に把握できない。口座残高が「バランスしている」というのは、帳簿が正確であり、財務状況が適切に管理されていることを示唆している。
【安定感と安心感】
「バランス」という言葉には、物事が安定している印象がある。口座残高がバランスしているというのは、資産や債務が調和しており、安定感があると感じられるからである。これは投資家や取引相手にとっても信頼性があると見なされる要因の一つとなる。
【取引所や銀行の慣習】
取引所や銀行などの金融機関では、口座残高を「バランス」と呼ぶのが一般的。これは、金融業界の言語慣習として定着している。
【バランス:まとめ】
総じて、「残高」という言葉が単に金額の合計を指すのに対して、「バランス」はより広い意味で、資産と負債が調和している概念や、帳簿が正確で安定している状態を指す言葉として使われている。
これまで何となく使っていた言葉の意味を明確にすることができました。
まとめ
今回はかなり回りくどいことをしましたが、個人的にはかなり重要なポイントでした。
Kucoinで取引のエッジを見つけることができたら今後も積極的に触っていきます。
ccxtと取引所固有のAPIの仕様に差がある
ということを実感したため、他の取引所のAPIもどんどん触っていきます。
例えば、積立Botを各取引所ごとに作ってみるなどの宿題はリスクも低いのでちょうど良い課題です。
今後もこの調子で自分のペースを崩さずに学習を進めていきます。
多くの物事は完全に理解すると非常にシンプルな形で表現できるようになる。
だから、いろんな言い回しでごちゃごちゃとした説明をしているうちは『まだ完全に理解できていないんだな』と思うようにしています。
経験という通して自分なりの形で理解しようとする営みが大事。人との勝負じゃないよ。
— よだか(夜鷹/yodaka) (@yodakablog) January 27, 2024
宿題
KucoinAPIの公式ドキュメント(RESTとWebsocket)を読む
1つ以上の取引所で積立Botを作る
価格情報の歪みを検知するBotを作る(済)→既にプロトタイプは作ったので発展系を作る
note公開しました!これから月一で初心者向けにnote書いていこうと思います。今回はbotって言っても何作ればいいかわからない人向けです!
「初心者の仮想通貨botterが最初に作ってみればいいbot」https://t.co/fNvJmEIKb0
— あいば (@aiba_algorithm) January 25, 2024