コンテンツにスキップ
このページの翻訳は LLM によって生成されています。誤りに気づいた場合は GitHub で issue を開いてお知らせください。

無期限先物:借入手数料

Saiの無期限先物コントラクトの借入処理には、主に次の役割があります。

  • レバレッジポジションの借入手数料の計算と累積。
  • 通貨ペアと借入グループの未決済建玉、OIの追跡。
  • 設定済みの範囲を守るためのエクスポージャー制限。

本書は借入グループの構造、状態更新、新規作成から決済・清算までの手数料計算を説明します。


  1. BorrowingData

    • 用途: ペアとグループの料率と累積手数料を保存します。
    • フィールド:
      • fee_per_block:ブロック当たりの基本料率。
      • acc_fee_long:ロングの累積手数料。
      • acc_fee_short:ショートの累積手数料。
      • acc_last_updated_block:直近の更新ブロック。
      • fee_exponent:OIの偏りに対する計算の感度。
  2. BorrowingPairGroup

    • 用途: ペアの借入グループ所属履歴を記録します。
    • フィールド:
      • group_index:借入グループID。
      • block:所属を設定したブロック。
      • initial_acc_fee_long:ロングの初期累積手数料。
      • initial_acc_fee_short:ショートの初期累積手数料。
      • prev_group_acc_fee_long:旧グループのロング累積手数料。
      • prev_group_acc_fee_short:旧グループのショート累積手数料。
      • pair_acc_fee_long:グループ変更時のペアのロング累積手数料。
      • pair_acc_fee_short:グループ変更時のペアのショート累積手数料。
  3. OpenInterest

    • 用途: ペアとグループの未決済建玉、ポジションサイズ総額を追跡します。
    • フィールド:
      • long:ロングOI総額。
      • short:ショートOI総額。
      • max:許容OI上限。
  4. BorrowingInitialAccFees

    • 用途: 新規作成時の初期累積手数料を記録します。
    • フィールド:
      • acc_pair_fee:新規作成時のペア累積手数料。
      • acc_group_fee:新規作成時のグループ累積手数料。
      • block:新規作成ブロック。
  • PAIRS:ペアごとの BorrowingData。
  • PAIR_GROUPS:ペアごとの BorrowingPairGroup 履歴一覧。
  • PAIR_OIS:ペアごとの OpenInterest。
  • GROUPS:借入グループごとの BorrowingData。
  • GROUP_OIS:グループごとの OpenInterest。
  • INITIAL_ACC_FEES:取引ごとの BorrowingInitialAccFees。

借入グループは共通の借入パラメーターを使う通貨ペアの集合です。次により手数料とエクスポージャーを管理しやすくします。

  • 一括調整: 複数ペアの借入手数料を同時に更新します。
  • 共通上限: グループ内の累積OIをまとめて管理します。
  • 手数料調整: 相場に応じて、グループ内の全ペアを同時に更新します。
  • リスク制限: OIを集計し、グループ全体のリスクを許容範囲に保ちます。
  • 履歴管理: 所属変更を記録し、保有中の手数料を正確に計算します。

set_borrowing_group_params でグループを作成・更新します。

  • 主なパラメーター:

    • fee_per_block:ブロック当たりの基本借入料率。
    • fee_exponent:OIの偏りに応じた料率の指数。
    • max_oi:グループのOI上限。
    • current_block:更新用の現在ブロック。
  • 処理:

    1. fee_exponent が1%から300%の範囲内か検証します。
    2. set_group_pending_acc_fees で current_block まで手数料を同期します。
    3. GROUPS のパラメーターを更新します。
    4. GROUP_OIS の max_oi を設定します。

set_borrowing_pair_params でペアを新グループに移す場合:

  • 主なパラメーター:

    • group_index:ペアに割り当てる新グループのインデックス。
  • 処理:

    1. set_group_pending_acc_fees で旧・新グループの手数料を同期します。
    2. update_group_oi でペアのOIを旧グループから引き、新グループに加えます。
    3. 手数料とブロックを記録した BorrowingPairGroup を PAIR_GROUPS に追加します。
    4. PAIRS のペア固有パラメーターを更新します。

新規注文や決済のたびにOIを再計算します。

  • 主な関数:

    • update_pair_oi:PAIR_OIS のペア単位OIを更新。
    • update_group_oi:GROUP_OIS のグループ単位OIを更新。
  • 処理:

    • 新規注文: 方向に応じて long または short OIを増やします。
    • 決済: 該当方向のOIを減らします。

手数料は時間とともに増え、OIの偏りの影響を受けます。

  • 計算式:

    delta = fee_per_block * (current_block - acc_last_updated_block) * (net_oi / max_oi) ^ fee_exponent
    • fee_per_block:ブロック当たりの基本料率。
    • current_block - acc_last_updated_block:前回更新からのブロック数。
    • net_oi:long と short OIの差の絶対値。
    • max_oi:ペアまたはグループのOI上限。
    • fee_exponent:偏りが大きいほど指数的に料率を増やす指数。
  • 方向別の累積:

    • OIが多い側だけに累積し、市場の均衡を促します。

新規作成時:

  • 関数: handle_trade_borrowing
    • 同期: set_pair_pending_acc_fees と set_group_pending_acc_fees で手数料を更新。
    • OI: update_pair_oi と update_group_oi で更新。
    • 初期記録: reset_trade_borrowing_fees で新規作成時の累積値を記録。

既存の取引を決済する場合:

  • 関数: handle_trade_borrowing
    • 現在のブロックまで手数料を同期します。
    • ペアとグループの該当方向のOIを減らします。
  • 借入手数料計算:
    • get_trade_borrowing_fees が決済時の累積値と新規作成時の INITIAL_ACC_FEES の差を計算します。
    • 保有中のグループ変更も反映します。

保有中にペアが移動した場合:

  • 要件: 旧・新グループ両方の手数料を反映します。
  • 方法:
    • get_borrowing_pair_group_acc_fees_deltas で移行ごとの差分を取得します。
    • 各期間でペア差分とグループ差分の大きい方を合計します。

借入手数料を含む清算価格の計算:

  • 関数: get_trade_liquidation_price_with_fees
    • 決済・トリガー手数料と get_trade_borrowing_fees の借入手数料を含みます。
    • 全手数料控除後の清算価格を計算します。

取引と借入処理の関係:

  1. 新規注文

    • 利用者が取引を作成します。
    • システムは handle_trade_borrowing で手数料を同期し、OIを更新します。
    • 初期累積値を INITIAL_ACC_FEES に保存します。
  2. 保有中

    • 時間とともに手数料が累積します。別の取引などのイベントで更新が発動するまで、ストレージには反映しません。
  3. 決済

    • 利用者が既存の取引を決済します。
    • handle_trade_borrowing で手数料とOIを更新します。
    • get_trade_borrowing_fees で総額を計算します。
    • 決済・借入手数料を差し引いて完了します。
  4. パラメーター更新

    • 管理者がペアやグループを更新します。
    • 現在のブロックまで手数料を同期します。
    • 所属変更があればOIも更新します。

用途: 新規注文・決済時の借入処理をまとめます。

処理:

  1. set_pair_pending_acc_fees と set_group_pending_acc_fees を呼び出します。
  2. update_pair_oi と update_group_oi でOIを更新します。
  3. 新規取引では、現在値を INITIAL_ACC_FEES に保存します。

用途: 決済時の借入手数料総額を計算します。

処理:

  1. INITIAL_ACC_FEES を読み込みます。
  2. get_direction_borrowing_pair_pending_acc_fees と get_direction_borrowing_group_pending_acc_fees で現在値を求めます。
  3. 所属変更期間に get_borrowing_pair_group_acc_fees_deltas を適用します。
  4. (Current Acc Fees - Initial Acc Fees) * (Trade Collateral * Leverage) で総額を計算します。

用途: 前回更新から現在のブロックまでの追加手数料を計算します。

処理:

  1. ロング・ショートのどちらが多いか判定します。
  2. 公式で新しい手数料差分を計算します。
  3. acc_fee_long または acc_fee_short に加えます。

用途: 新規作成時の借入関連手数料を記録します。

処理:

  • ペアとグループの現在の BorrowingData とブロックを INITIAL_ACC_FEES に保存します。

ペアXのロング保有中に、グループAからグループBに移る例です。

ブロックイベント記録内容
100グループAで新規注文ペアとAの累積値を INITIAL_ACC_FEES に保存
150AからBに移行Aを150まで更新し、OIをBに移して PAIR_GROUPS に履歴を記録
200グループBで決済ペアXとBを200まで更新し、A・Bの各期間の手数料を計算

最初の50ブロックを捨てることはありません。get_trade_borrowing_fees は移行履歴を使い、各期間に正しいペア・グループ差分を適用します。


借入処理は、取引の全期間で手数料累積、OI追跡、エクスポージャー管理を連携させます。

  • 借入グループ: 複数ペアの上限と料率をまとめて管理。
  • 累積手数料: 時間、偏り、パラメーターに応じて更新。
  • OI: ペア・グループ両単位で追跡し、リスクを管理。
  • 取引の流れ:
    • 新規時に初期値を設定。
    • 決済時に借入手数料総額とOIを更新。

これらにより、保有中のOIや所属グループの変化を手数料に反映できます。