Order publishing
SimバージョンとRealバージョンをを別に実装している。OrderExecutorの統一は今後の課題。Saifuの更新とClientの失敗時のリカバリー処理が統一できなかった。
Symbol | Code | Description | Formula |
---|
POAssetInfo | N/A | Bought asset info | N/A |
A | N/A | All base asset name | N/A |
Na | N/A | All time slot id of certain base asset | N/A |
qall | N/A | Over all investment quantity | qall=∑aA∑iNa( ap aqi(1+ aciB))+ Qq |
Qq | N/A | Quote asset quantity | N/A |
全投資額(qall)の計算
qall: 全投資額。支払った手数料も含む。ただし、通貨の価格は現在価格とする。理由はROIの正規化を現在価格で行っているため。
qall=a∈A∑i∈Na∑( ap aqi(1+ aciB))+ Qq 各Assetごとの購入量・売却量(Δ aq)の計算
Portfolio optimizationの結果、アセットとそのタイムスロットごとに次が分かる
Symbol | Code | Description | Fomula |
---|
axi | N/A | Current holding rate of asset a, timeslot i | N/A |
axi⋆ | N/A | Optimal holding rate of asset a, timeslot i | N/A |
ax⋆ | N/A | Optimal holding rate of new timeslot | N/A |
ここからアセットaについて購入量 aqBが決まる。注意: aqBは投資額ではなく取得する必要のあるBaseAssetの量。
タイムスロットiにおいて修正が必要なBaseAssetの量Δ aqiは
Δ aqi= aqi⋆− aqi= ap(1+ aciB) axi⋆qall− ap(1+ aciB) axiqall Note: Δ aqi>0はBaseAssetの保有量を増やす(買い増し)、Δ aqi<0は保有量を減らすこと(売却)を意味する。
新規購入となる新しいBaseAssetの量Δ aqnewは
Δ aqnew= ap(1+ aciB) ax⋆qall したがってAsset a全体での保有量の修正量Δ aqは
Δ aq=i∈Na∑(Δ aqi)+Δ aqnew Note: Δ aq>0の場合はAsset aを購入、Δ aq<0の場合は売却する。
Order処理
Asset aごとに修正量Δ aqをから売却・購入Orderを発行する。
OrderPubish
Δ aq,a∈{A,Δ aq<0}である売却分を最初にオーダーする。
もし、売却予定のΔ aqi よりもWallet内の残高が少ない場合は、Wallet内の残高を全て売却する。売却に失敗した場合は、POAssetInfoを更新しない。
Δ aq,a∈{A,Δ aq>0}である購入分をオーダーする。Δ aqが大きいものから順にオーダーを発行する。購入する資産がなくなったところでオーダーはストップする。もし、購入予定のBaseAssetの量を賄うQuoteAsset量が足りない場合は、現状保有するQuoteAsset量で購入できる最大のBaseAsset量のOrderを発行する。また、precision fit後に1e−7 以下の値になった場合は、Order量0としてこれ以上買えないと判断。ここでBuy orderの発行はストップする。購入に失敗した場合はPOAssetInfoを更新しない。
Note: このときROI( ar^)が大きなものからOrderを発行することも検討したが、ROIは同一アセットのタイムスロット全てが影響する。