Skip to main content

Order publishing

SimバージョンとRealバージョンをを別に実装している。OrderExecutorの統一は今後の課題。Saifuの更新とClientの失敗時のリカバリー処理が統一できなかった。

Input

SymbolCodeDescriptionFormula
POAssetInfoN/ABought asset infoN/A
AAN/AAll base asset nameN/A
NaN_aN/AAll time slot id of certain base assetN/A
qallq_{all}N/AOver all investment quantityqall=aAiNa( ap aqi(1+ aciB))+ Qqq_{all}=\sum_a^A{\sum_i^{N_a}{(\ _ap \ _aq_i(1+\ _ac_{iB})})}+\ _{Q}q
 Qq\ _QqN/AQuote asset quantityN/A

全投資額(qallq_{all})の計算

qallq_{all}: 全投資額。支払った手数料も含む。ただし、通貨の価格は現在価格とする。理由はROIの正規化を現在価格で行っているため。

qall=aAiNa( ap aqi(1+ aciB))+ Qqq_{all}=\sum_{a\in A}{\sum_{i\in N_a}{(\ _ap \ _aq_i(1+\ _ac_{iB})})}+\ _{Q}q

各Assetごとの購入量・売却量(Δ aq\Delta \ _aq)の計算

Portfolio optimizationの結果、アセットとそのタイムスロットごとに次が分かる

SymbolCodeDescriptionFomula
 axi\ _ax_iN/ACurrent holding rate of asset aa, timeslot iiN/A
 axi\ _ax_i^\starN/AOptimal holding rate of asset aa, timeslot iiN/A
 ax\ _ax^\starN/AOptimal holding rate of new timeslotN/A

ここからアセットaaについて購入量 aqB\ _aq_{B}が決まる。注意:  aqB\ _aq_Bは投資額ではなく取得する必要のあるBaseAssetの量。

タイムスロットiiにおいて修正が必要なBaseAssetの量Δ aqi\Delta\ _aq_i

Δ aqi= aqi aqi= axiqall ap(1+ aciB) axiqall ap(1+ aciB)\Delta\ _aq_i=\ _aq_i^\star - \ _aq_i = \frac{\ _ax_i^\star q_{all}}{\ _ap(1+\ _ac_{iB})} - \frac{\ _ax_i q_{all}}{\ _ap(1+\ _ac_{iB})}

Note: Δ aqi>0\Delta\ _aq_i >0はBaseAssetの保有量を増やす(買い増し)、Δ aqi<0\Delta\ _aq_i<0は保有量を減らすこと(売却)を意味する。

新規購入となる新しいBaseAssetの量Δ aqnew\Delta\ _aq_{new}

Δ aqnew= axqall ap(1+ aciB)\Delta\ _aq_{new}=\frac{\ _ax^\star q_{all}}{\ _ap(1+\ _ac_{iB})}

したがってAsset a全体での保有量の修正量Δ aq\Delta\ _aq

Δ aq=iNa(Δ aqi)+Δ aqnew\Delta\ _aq=\sum_{i\in N_a}(\Delta\ _aq_i)+\Delta\ _aq_{new}

Note: Δ aq>0\Delta\ _aq > 0の場合はAsset aを購入、Δ aq<0\Delta\ _aq < 0の場合は売却する。

Order処理

Asset aaごとに修正量Δ aq\Delta \ _aqをから売却・購入Orderを発行する。

OrderPubish

  1. Δ aq,a{A,Δ aq<0}\Delta \ _aq, a\in \{A, \Delta\ _aq < 0\}である売却分を最初にオーダーする。

     もし、売却予定のΔ aqi\Delta\ _aq_i よりもWallet内の残高が少ない場合は、Wallet内の残高を全て売却する。売却に失敗した場合は、POAssetInfoを更新しない。

  2. Δ aq,a{A,Δ aq>0}\Delta \ _aq, a\in \{A, \Delta\ _aq > 0\}である購入分をオーダーする。Δ aq\Delta\ _aqが大きいものから順にオーダーを発行する。購入する資産がなくなったところでオーダーはストップする。もし、購入予定のBaseAssetの量を賄うQuoteAsset量が足りない場合は、現状保有するQuoteAsset量で購入できる最大のBaseAsset量のOrderを発行する。また、precision fit後に1e71e^-7 以下の値になった場合は、Order量0としてこれ以上買えないと判断。ここでBuy orderの発行はストップする。購入に失敗した場合はPOAssetInfoを更新しない。

    Note: このときROI( ar^\ _a\hat{r})が大きなものからOrderを発行することも検討したが、ROIは同一アセットのタイムスロット全てが影響する。