無期限先物:借入手数料
Saiの無期限先物コントラクトの借入処理には、主に次の役割があります。
- レバレッジポジションの借入手数料の計算と累積。
- 通貨ペアと借入グループの未決済建玉、OIの追跡。
- 設定済みの範囲を守るためのエクスポージャー制限。
本書は借入グループの構造、状態更新、新規作成から決済・清算までの手数料計算を説明します。
主な構成要素
Section titled “主な構成要素”-
BorrowingData
- 用途: ペアとグループの料率と累積手数料を保存します。
- フィールド:
fee_per_block:ブロック当たりの基本料率。acc_fee_long:ロングの累積手数料。acc_fee_short:ショートの累積手数料。acc_last_updated_block:直近の更新ブロック。fee_exponent:OIの偏りに対する計算の感度。
-
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:グループ変更時のペアのショート累積手数料。
-
OpenInterest
- 用途: ペアとグループの未決済建玉、ポジションサイズ総額を追跡します。
- フィールド:
long:ロングOI総額。short:ショートOI総額。max:許容OI上限。
-
BorrowingInitialAccFees
- 用途: 新規作成時の初期累積手数料を記録します。
- フィールド:
acc_pair_fee:新規作成時のペア累積手数料。acc_group_fee:新規作成時のグループ累積手数料。block:新規作成ブロック。
ストレージマップ
Section titled “ストレージマップ”PAIRS:ペアごとのBorrowingData。PAIR_GROUPS:ペアごとのBorrowingPairGroup履歴一覧。PAIR_OIS:ペアごとのOpenInterest。GROUPS:借入グループごとのBorrowingData。GROUP_OIS:グループごとのOpenInterest。INITIAL_ACC_FEES:取引ごとのBorrowingInitialAccFees。
借入グループ
Section titled “借入グループ”借入グループとは?
Section titled “借入グループとは?”借入グループは共通の借入パラメーターを使う通貨ペアの集合です。次により手数料とエクスポージャーを管理しやすくします。
- 一括調整: 複数ペアの借入手数料を同時に更新します。
- 共通上限: グループ内の累積OIをまとめて管理します。
借入グループの役割
Section titled “借入グループの役割”- 手数料調整: 相場に応じて、グループ内の全ペアを同時に更新します。
- リスク制限: OIを集計し、グループ全体のリスクを許容範囲に保ちます。
- 履歴管理: 所属変更を記録し、保有中の手数料を正確に計算します。
借入グループの更新方法
Section titled “借入グループの更新方法”グループパラメーターの設定
Section titled “グループパラメーターの設定”set_borrowing_group_params でグループを作成・更新します。
-
主なパラメーター:
fee_per_block:ブロック当たりの基本借入料率。fee_exponent:OIの偏りに応じた料率の指数。max_oi:グループのOI上限。current_block:更新用の現在ブロック。
-
処理:
fee_exponentが1%から300%の範囲内か検証します。set_group_pending_acc_feesでcurrent_blockまで手数料を同期します。GROUPSのパラメーターを更新します。GROUP_OISのmax_oiを設定します。
ペアの借入グループ変更
Section titled “ペアの借入グループ変更”set_borrowing_pair_params でペアを新グループに移す場合:
-
主なパラメーター:
group_index:ペアに割り当てる新グループのインデックス。
-
処理:
set_group_pending_acc_feesで旧・新グループの手数料を同期します。update_group_oiでペアのOIを旧グループから引き、新グループに加えます。- 手数料とブロックを記録した
BorrowingPairGroupをPAIR_GROUPSに追加します。 PAIRSのペア固有パラメーターを更新します。
未決済建玉の更新
Section titled “未決済建玉の更新”新規注文や決済のたびにOIを再計算します。
-
主な関数:
update_pair_oi:PAIR_OISのペア単位OIを更新。update_group_oi:GROUP_OISのグループ単位OIを更新。
-
処理:
- 新規注文: 方向に応じて
longまたはshortOIを増やします。 - 決済: 該当方向のOIを減らします。
- 新規注文: 方向に応じて
更新の計算ロジック
Section titled “更新の計算ロジック”借入手数料の累積
Section titled “借入手数料の累積”手数料は時間とともに増え、OIの偏りの影響を受けます。
-
計算式:
delta = fee_per_block * (current_block - acc_last_updated_block) * (net_oi / max_oi) ^ fee_exponentfee_per_block:ブロック当たりの基本料率。current_block - acc_last_updated_block:前回更新からのブロック数。net_oi:longとshortOIの差の絶対値。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の差を計算します。- 保有中のグループ変更も反映します。
グループ変更への対応
Section titled “グループ変更への対応”保有中にペアが移動した場合:
- 要件: 旧・新グループ両方の手数料を反映します。
- 方法:
get_borrowing_pair_group_acc_fees_deltasで移行ごとの差分を取得します。- 各期間でペア差分とグループ差分の大きい方を合計します。
手数料込みの清算価格
Section titled “手数料込みの清算価格”借入手数料を含む清算価格の計算:
- 関数:
get_trade_liquidation_price_with_fees- 決済・トリガー手数料と
get_trade_borrowing_feesの借入手数料を含みます。 - 全手数料控除後の清算価格を計算します。
- 決済・トリガー手数料と
取引と借入処理の関係:
-
新規注文
- 利用者が取引を作成します。
- システムは
handle_trade_borrowingで手数料を同期し、OIを更新します。 - 初期累積値を
INITIAL_ACC_FEESに保存します。
-
保有中
- 時間とともに手数料が累積します。別の取引などのイベントで更新が発動するまで、ストレージには反映しません。
-
決済
- 利用者が既存の取引を決済します。
handle_trade_borrowingで手数料とOIを更新します。get_trade_borrowing_feesで総額を計算します。- 決済・借入手数料を差し引いて完了します。
-
パラメーター更新
- 管理者がペアやグループを更新します。
- 現在のブロックまで手数料を同期します。
- 所属変更があればOIも更新します。
handle_trade_borrowing
Section titled “handle_trade_borrowing”用途: 新規注文・決済時の借入処理をまとめます。
処理:
set_pair_pending_acc_feesとset_group_pending_acc_feesを呼び出します。update_pair_oiとupdate_group_oiでOIを更新します。- 新規取引では、現在値を
INITIAL_ACC_FEESに保存します。
get_trade_borrowing_fees
Section titled “get_trade_borrowing_fees”用途: 決済時の借入手数料総額を計算します。
処理:
INITIAL_ACC_FEESを読み込みます。get_direction_borrowing_pair_pending_acc_feesとget_direction_borrowing_group_pending_acc_feesで現在値を求めます。- 所属変更期間に
get_borrowing_pair_group_acc_fees_deltasを適用します。 (Current Acc Fees - Initial Acc Fees) * (Trade Collateral * Leverage)で総額を計算します。
get_borrowing_pending_acc_fees
Section titled “get_borrowing_pending_acc_fees”用途: 前回更新から現在のブロックまでの追加手数料を計算します。
処理:
- ロング・ショートのどちらが多いか判定します。
- 公式で新しい手数料差分を計算します。
acc_fee_longまたはacc_fee_shortに加えます。
reset_trade_borrowing_fees
Section titled “reset_trade_borrowing_fees”用途: 新規作成時の借入関連手数料を記録します。
処理:
- ペアとグループの現在の
BorrowingDataとブロックをINITIAL_ACC_FEESに保存します。
例:ペアの借入グループ変更
Section titled “例:ペアの借入グループ変更”ペアXのロング保有中に、グループAからグループBに移る例です。
| ブロック | イベント | 記録内容 |
|---|---|---|
| 100 | グループAで新規注文 | ペアとAの累積値を INITIAL_ACC_FEES に保存 |
| 150 | AからBに移行 | Aを150まで更新し、OIをBに移して PAIR_GROUPS に履歴を記録 |
| 200 | グループBで決済 | ペアXとBを200まで更新し、A・Bの各期間の手数料を計算 |
最初の50ブロックを捨てることはありません。get_trade_borrowing_fees は移行履歴を使い、各期間に正しいペア・グループ差分を適用します。
借入処理は、取引の全期間で手数料累積、OI追跡、エクスポージャー管理を連携させます。
- 借入グループ: 複数ペアの上限と料率をまとめて管理。
- 累積手数料: 時間、偏り、パラメーターに応じて更新。
- OI: ペア・グループ両単位で追跡し、リスクを管理。
- 取引の流れ:
- 新規時に初期値を設定。
- 決済時に借入手数料総額とOIを更新。
これらにより、保有中のOIや所属グループの変化を手数料に反映できます。