開発記録#02

日付

2025年1月11日

今日やること

  • 機能一覧の作成とbacklogの作成
  • Jupyterlabの環境構築
  • BYBITのAPIキーの取得とAPIを使って色々とやってみる。
  • データ取得まで

機能一覧の作成とbacklogの作成

botとはなんぞやという感じなので、取り合えず以下の要件でシンプルなbotを手始めに作ることにした。

1、BYBITのAPIを使って、1分足のデータをCSVに収集する。

2、とりあえずの売買アルゴリズムの作成

上に10%上がったら買いそこから10%上がったら利確、5%下がったら損切り
下に10%下がったら売り、そこから10 %下がったら利確、5%上がったら損切り

3、取引所での注文(BYBIT)

買い、売りシグナルが出た時に注文
・毎分、現在の値を取得する。
・シグナルが出た場合にBybitのAPIと連携して注文を行う。
利確シグナルが出た時に決済
・シグナルが出た価格を一次情報として持っておく。
・シグナルが出た一時情報の価格を元に利確シグナルの値を計算する。
・利確シグナルが出た場合にBybitのAPIと連携して決済を行う。
損切りシグナルが出た時に決済
・シグナルが出た価格を一次情報として持っておく。
・シグナルが出た一時情報の価格を元に利確シグナルの値を計算する。
・利確シグナルが出た場合にBybitのAPIと連携して決済wp行う。

→機能一覧のWBS

Jupiterlabの環境構築

元々あったjupiterlabのdocker環境を持ってきて動きそうだったら使おうと思う。

→動いた!

mysqlと後々連携したいけど、とりあえず最低限CSVを使ってやろうと思う。

BYBITのAPIを使用してみる。

BYBITのtestnetに登録

初めてtestnetというものにログインしてみたけど、mainnetとの違いがわからないし、入金しろ的なことを言われて焦りました。

BYBITのapiを使用してとりあえず動かす。

bybitに接続できているかの確認

from pybit.unified_trading import HTTP
session = HTTP(testnet=True)
print(session.get_server_time())

{'retCode': 0, 'retMsg': 'OK', 'result': {'timeSecond': '1736590663', 'timeNano': '1736590663598182798'}, 'retExtInfo': {}, 'time': 1736590663598}

dotenvを使用していろんなAPIに触ってみる。

import os
from dotenv import load_dotenv

# PyBit v5 APIクライアント (2023年現在)
# PyPIのpybitパッケージに含まれる 'pybit.v5' を使用
from pybit.unified_trading import HTTP

def main():
    # .envファイルに定義した変数を読み込む
    load_dotenv()

    # 環境変数からAPIキー・シークレットを取得
    api_key = os.getenv("BYBIT_TESTNET_API_KEY")
    api_secret = os.getenv("BYBIT_TESTNET_API_SECRET")
    print(api_key, api_secret)

    if not api_key or not api_secret:
        print(api_key, api_secret)
        raise ValueError("APIキーまたはシークレットが取得できません。 .envファイルの設定を確認してください。")

    # PyBitのv5クライアントを生成 (testnet=True でテスト環境)
    session = HTTP(
        api_key=api_key,
        api_secret=api_secret,
        testnet=True  # テスト環境に接続 (本番環境の場合は False)
    )

    # 例: 口座残高を取得してみる (v5 API)
    # accountType="UNIFIED", "CONTRACT", "SPOT" など、口座タイプに応じて指定
    response = session.get_wallet_balance(accountType="UNIFIED")
    print("Testnet Wallet Balance:", response)

    # 例: シンボル(BTCUSDT)の現在価格を取得してみる
    # Bybit v5では "/v5/market/tickers" に相当
    symbol_BTCUSDT = "BTCUSDT"
    ticker_info = session.get_tickers(category="linear", symbol=symbol_BTCUSDT)
    print(f"{symbol_BTCUSDT} Ticker Info:", ticker_info)
    symbol_ETHUSDT = "ETHUSDT"
    ticker_info = session.get_tickers(category="linear", symbol=symbol_ETHUSDT)
    print(f"{symbol_ETHUSDT} Ticker Info:", ticker_info)

if __name__ == "__main__":
    main()
Testnet Wallet Balance: {'retCode': 0, 'retMsg': 'OK', 'result': {'list': [{'totalEquity': '0', 'accountIMRate': '0', 'totalMarginBalance': '0', 'totalInitialMargin': '0', 'accountType': 'UNIFIED', 'totalAvailableBalance': '0', 'accountMMRate': '0', 'totalPerpUPL': '0', 'totalWalletBalance': '0', 'accountLTV': '0', 'totalMaintenanceMargin': '0', 'coin': []}]}, 'retExtInfo': {}, 'time': 1736591530935}
BTCUSDT Ticker Info: {'retCode': 0, 'retMsg': 'OK', 'result': {'category': 'linear', 'list': [{'symbol': 'BTCUSDT', 'lastPrice': '86000.00', 'indexPrice': '94315.52', 'markPrice': '85500.00', 'prevPrice24h': '91680.60', 'price24hPcnt': '-0.06196', 'highPrice24h': '96564.00', 'lowPrice24h': '76566.80', 'prevPrice1h': '86011.10', 'openInterest': '1072306.473', 'openInterestValue': '91682203441.50', 'turnover24h': '10646888676.4025', 'volume24h': '119129.4060', 'fundingRate': '-0.00375', 'nextFundingTime': '1736611200000', 'predictedDeliveryPrice': '', 'basisRate': '', 'deliveryFeeRate': '', 'deliveryTime': '0', 'ask1Size': '0.006', 'bid1Price': '85117.20', 'ask1Price': '86000.00', 'bid1Size': '0.001', 'basis': '', 'preOpenPrice': '', 'preQty': '', 'curPreListingPhase': ''}]}, 'retExtInfo': {}, 'time': 1736591531020}
ETHUSDT Ticker Info: {'retCode': 0, 'retMsg': 'OK', 'result': {'category': 'linear', 'list': [{'symbol': 'ETHUSDT', 'lastPrice': '3159.47', 'indexPrice': '3246.05', 'markPrice': '3218.22', 'prevPrice24h': '3205.50', 'price24hPcnt': '-0.014359', 'highPrice24h': '3400.00', 'lowPrice24h': '3062.50', 'prevPrice1h': '3286.50', 'openInterest': '384023.78', 'openInterestValue': '1235873009.27', 'turnover24h': '1071562529.5513', 'volume24h': '331193.0000', 'fundingRate': '-0.00375', 'nextFundingTime': '1736611200000', 'predictedDeliveryPrice': '', 'basisRate': '', 'deliveryFeeRate': '', 'deliveryTime': '0', 'ask1Size': '77.92', 'bid1Price': '3156.53', 'ask1Price': '3157.79', 'bid1Size': '0.01', 'basis': '', 'preOpenPrice': '', 'preQty': '', 'curPreListingPhase': ''}]}, 'retExtInfo': {}, 'time': 1736591531107}

データは取れている模様

# PyBitのv5クライアントを生成 (testnet=True でテスト環境)

この部分のクライアント生成というものがわからなくてchatgptに尋ねてみた。


PyBit(あるいは他のAPI向けライブラリ)において「クライアントを作成する」とは、
そのライブラリが提供する「API呼び出し用の機能をひとまとめにしたオブジェクト(インスタンス)」を生成することを指します。

1. クライアントとは?
APIにアクセスする際、認証情報(APIキーやシークレット)やエンドポイントのURL、通信設定などを管理し、
実際にHTTPリクエストを送るための機能をまとめたものが「クライアント」と呼ばれます。

例えば、requestsライブラリ単体でBybitのAPIを呼び出す場合:

認証用の署名を生成する
タイムスタンプやAPIキーを正しい形式でURLパラメータに入れる
その後に requests.get(...) または requests.post(...) を呼び出す
レスポンスをJSONに変換する
結果を処理する
…といった流れを手動で行う必要があります。

一方で、PyBitが提供する「クライアント」を作成すると、
認証の仕組みやパラメータのセット、署名の生成などをクライアントが代わりにやってくれるため、
こちらが呼び出すときは単純に「注文を出す」「残高を取得する」などの分かりやすいメソッド呼び出しだけで済むようになります。

クライアントを「作成」するとは、
こうした一連のやり取り(認証・署名・HTTPリクエスト等)をひとまとめにした**インスタンス(オブジェクト)**を用意し、
以降のAPI操作を行いやすくするための準備ステップだと理解してください。

APIにアクセスするためにはリクエストだったり認証だったりめんどくさいことがあるけど、それをひとまとめにやってくれるみたいだ。

とりあえず今日目標としているところまではできた。

補足

Bybit v5 APIにおける「category」の意味

Bybitのv5 APIは、「仮想通貨のどのマーケット情報を取得するか」を指定するために、category というパラメータを使います。公式ドキュメントなどでは以下のような値が例示されています。

  • spot

    スポット(現物)取引

  • linear

    USDTマージン、またはUSDCマージンのデリバティブ(先物・無期限)

    • 例: BTCUSDT, ETHUSDT など、証拠金としてUSDTを使う「リニア契約」
  • inverse

    コインマージンのデリバティブ(先物・無期限)

    • 例: BTCUSD, ETHUSD など、証拠金としてBTCやETHなどの現物コインを使う「インバース契約」
  • option

    オプション取引

    この category パラメータを指定することで、Bybit APIに対して「これはUSDT建ての無期限(リニア)に関するデータを取得したい」「スポットのBTCUSDT情報を見たい」などの命令が正しく伝わる仕組みです。

BybitのBTCUSDTのデータを毎分取得する。

機能一覧WBSでタスクとして積んでいたBYBITの1分足のデータをCSVに収集したい。

→これも完了

最近思ったこと

soraがやばい。

最新情報をチェックしよう!