研究環境を利用して,三角型ヘッジの詳細と,ヘッジ可能な価格差に対する処理手数料の影響を分析する.

作者: リン・ハーンリディア作成日:2022年12月29日 09:46:17 更新日:2023年9月20日 09:55:09

img

研究環境を利用して,三角型ヘッジの詳細と,ヘッジ可能な価格差に対する処理手数料の影響を分析する.

処理手数料の調整なしの研究版

トライアングル・ヘッジ.ipynb

[1] において

var fmz = require("fmz")                           // Import the talib, TA, and plot libraries automatically after import.
var task = fmz.VCtx({
start: '2019-04-09 17:49:00',
end: '2019-04-09 18:00:00',
period: '1m',
exchanges: [{"eid":"Huobi","currency":"ETH_BTC", "balance":1, "stocks":10},{"eid":"OKEX","currency":"ETH_USDT","balance":10000,"stocks":1}, {"eid":"OKEX","currency":"BTC_USDT","balance":10000,"stocks":1}]
})

初期交換口座の情報とティッカーの表示:

  • 取引所Aの取引ペアは: ETH_BTC
  • 取引所Bの取引対は: ETH_USDT
  • 取引所Cの取引対は: BTC_USDT

[2] において

var accA = exchanges[0].GetAccount()
accA

アウト[2]: { 収支: 1, 凍結: 0, 収支: 10, 凍結: 0 }

[3] において

var accB = exchanges[1].GetAccount()
accB

アウト[3]: { 収支: 10000 凍結 収支: 0 ストック: 1 凍結 ストック: 0 }

[4] において

var accC = exchanges[2].GetAccount()
accC

アウト[4]: { 収支: 10,000,凍結 収支: 0, ストック: 1, 凍結 ストック: 0 }

[5] において

var initSumBTC = accA.Balance + accC.Stocks
initSumBTC

アウト[5]: 2 について

[6] において

var initSumETH = accA.Stocks + accB.Stocks
initSumETH

アウト[6]: 11 について

[7]:

var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT

アウト[7]: 20000

BTC の総数は 2 で,ETH の総数は 11 で,USDT の総数は 20000 です.

[8] で:

var tickerA = exchanges[0].GetTicker()
tickerA

アウト[8]: { 時間: 1554831960000,} 高度:0.03396501 0.03396499 低かった 0.03396501 販売する 0.03396499 購入する 最後の0.033965です 総数: 4696.555 オープン・インテレスト: 0 }

[9]:

var tickerB = exchanges[1].GetTicker()
tickerB

アウト[9]: { 時間: 1554831960000,} 高さ: 175.08000001, 175.07999999, 低かった 売る: 175.08000001, 175.07999999, 購入する 最後の175.08 巻:20730.37 オープン・インテレスト: 0 }

[10] で:

var tickerC = exchanges[2].GetTicker()
tickerC

アウト[10]: { 時間: 1554831960000, 高さ: 5161.90000001 5161.89999999 低かった 売る 5161.90000001 5161.89999999 購入する 最後の5161.9 総数: 2109.9292 オープン・インテレスト: 0 }

Exchange A, Exchange Bと取引の対象はETHであることがわかります.つまり,Exchange A/Bは間接的なヘージング操作を行うことができますが,価格設定通貨が異なるため直接ヘージングすることはできません.Exchange Aの価格設定通貨はBTCであり,Exchange Bの通貨はUSDTです. 取引所Aが購入操作を実行すると仮定します.exchanges[0].Buy(price, amount)取引相手が販売した価格が購入時の注文価格として使用されます.tickerA.Sell取引所Bは,ヘッジのために売却操作を行います.exchanges[1].Sell(price, amount)取引相手が購入したい価格が販売時の注文価格として使用されます.tickerB.Buy交換が消費されるからですBTC交換Aは,交換Aが購入するときに,交換Bが販売するときに,交換Aが交換Aが購入するときに,交換Aが交換Aが購入するときに,交換Bが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するUSDT取引所Aが消費するBTCを補うため,つまり取引所Cが実行するexchanges[2].Buy(price, amount)交換するUSDTBTC取引所Cは,取引相手の販売価格を見る必要があります.tickerC.Sell交換Aの購入価格が交換Bの販売価格よりも低い必要があります. その後,交換Cは,交換Aが消費したBTCをUSDTより少ない金額で買い戻します. では次の通りです

[11] で:

var diffB2A = tickerA.Sell - tickerB.Buy / tickerC.Sell    // diffB2A means that Exchange B sells ETH coins and Exchange A buys ETH coins, which is logically equivalent to the transfer of ETH from Exchange B to Exchange A.
diffB2A

アウト[11]: 0.000047266535449966285 について

取引所Bと取引所Cよりも高いので ヘッジは明らかに損です 他のヘジング方向は同じである.エクスチェンジAはETHの売却操作を実行し,エクスチェンジBはETHの購入操作を実行し,エクスチェンジCはBTCをUSDTで販売する.通貨の達成は常にバランスで,USDTだけが増加または減少する (すなわち,稼いだ差).

[12] で:

var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
diffA2B

アウト[12]: 0.000047246531444007644 について

実験をしてみましょう.tickerA.Buy - tickerB.Sell / tickerC.Buy各値がどのように変化するかを知るためのヘージング操作です.

[13]では:

var idA = exchanges[0].Sell(tickerA.Buy, 1)
var nowAccA = exchanges[0].GetAccount()
nowAccA       // We can see that the fee is deducted from the BTC.

アウト[13]: {残高: 1,03389706} フローズン バランス: 0 ストック: 9 フローズンストック:

[14] では:

var orderA = exchanges[0].GetOrder(idA)
orderA

アウト[14]: { ID: 1 ] チェックリスト 価格:0.03396499 価格:0.03396499 価格:0.03396499 価格:0.03396499 価格:0.03396499 額: 1 取引金額: 1 平均価格:0.03396499 タイプ: 1 オフセット: 0 状況: 1 契約タイプ: ETH_BTC_Huobi }

[15] について

var feeRatioA = 0.002      // The default fee for backtesting is 0.2%, i.e. 0.002.
var feeA = orderA.DealAmount * orderA.AvgPrice * feeRatioA   // Exchange A trading fees, BTC denominated.
feeA

アウト[15]: 0.00006792998000000001 について

[16]:

var idB = exchanges[1].Buy(tickerB.Sell, 1)
var nowAccB = exchanges[1].GetAccount()
nowAccB

アウト[16]: {残高: 9824.56983998} フローズン バランス: 0 ストック: 2個 フローズンストック: 0 }

[17]:

var orderB = exchanges[1].GetOrder(idB)
orderB      // We can see that the fee is deducted from the USDT.

アウト[17]: { アイデンティティ: 1, 価格:175.08000001 額: 1 取引金額: 1 平均価格: 175.08000001, タイプ: 0 オフセット: 0 状況: 1 契約型: ETH_USDT_OKEX }

[18]:

var feeRatioB = 0.002
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last    // B exchange fees, converted to BTC denomination.
feeB

アウト[18]: 0.00006783548693698057

[19]:

var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
var nowAccC = exchanges[2].GetAccount()
nowAccC

アウト[19]: {残高: 10174.12327555} フローズン バランス: 0 ストック: 0.9662 フローズンストック:

[20]:

var orderC = exchanges[2].GetOrder(idC)
orderC     // We can see that the fee is deducted from the USDT.

アウト[20]: { アイデンティティ: 1, 価格: 5161.89999999, 額:0.0338 取引金額: 0.0338 平均価格: 5161.89999999, タイプ: 1 オフセット: 0 状況: 1 契約型: BTC_USDT_OKEX }

[21]では:

var feeRatioC = 0.002
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last      // Fees for C exchange transactions, BTC denominated.
feeC

アウト[21]: 0.0000675999999999986903

総資産情報 (ヘッジ後の) を計算する:

[22]:

var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC

アウト[22]: 2.00009706

[23]:

var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH

アウト[23]: 11 について

[24]:

var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT

アウト[24]: 19998.69311553

[25]では:

nowSumBTC - initSumBTC

出場[25]: 0.00009705999999987114

[26] で:

tickerC.Buy * (nowSumBTC - initSumBTC)    // Excess BTC converted to USDT

アウト[26]: 0.5010140139983642 について

[27]:

nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT    // Profit and loss are calculated based on the movement of the account assets and both are denominated in USDT.

アウト[27]: -0.8058704560025944 -0.8058704560025944 -0.80587045

[28]では:

(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy     // Profit and loss based on price difference, denominated in USDT.

出場[28]: -0.8058703331189396 -0.8058703331189396 -0.8058703331189396 -0.8058703331189396 -0.805870333 -0.8089396 -0.8089396 -0.8089396 -0.8058703331189396 -0.8089396 -0.8089396 -0.8089396 -

見た通り,ヘージング時の価格差は diffA2B: 0.000047246531444007644です. この3つのヘッジの費用は,BTCに変換すると, feeA + feeB + feeCです.

[29]では:

feeA + feeB + feeC

出場[29]: 0.0002033654669368496 について

価格差は,このような三角型ヘッジで,feeA+feeB+feeC利益を得るためには 価格差よりも大きい必要があります. 現在,口座比較計算と価格差計算によって,それは損失です.損失は約0.8058704560025944です. 操作手数料パラメータで計算された処理手数料が,この比較観察モデルでテストされた市場の価格差利益に正確に等しいようにバージョンを修正しました.

処理料のデフォルト条件 (デフォルトで2‰) で,ヘージング差が0.000047246531444007644 BTCである場合,ヘージングは損失であり,損失は約-0.8058704560025944であることがわかります.

処理手数料の調整に関する研究版

トライアングラー・ヘージング (処理手数料の調整) ipynb

[1] において

var fmz = require("fmz")                           // Import talib, TA, plot libraries automatically after introduction.
var task = fmz.VCtx({
start: '2019-04-09 17:49:00',
end: '2019-04-09 18:00:00',
period: '1m',
exchanges: [{"eid":"Huobi","currency":"ETH_BTC", "balance":1, "stocks":10,"fee":[0.04,0.04]},{"eid":"OKEX","currency":"ETH_USDT","balance":10000,"stocks":1,"fee":[0.04,0.04]}, {"eid":"OKEX","currency":"BTC_USDT","balance":10000,"stocks":1,"fee":[0.04,0.04]}]
})

初期交換口座の情報とティッカーの表示:

  • 取引所Aの取引ペアは: ETH_BTC
  • 取引所Bの取引対は: ETH_USDT
  • 取引所Cの取引対は: BTC_USDT

[2] において

var accA = exchanges[0].GetAccount()
accA

アウト[2]: { 収支: 1, 凍結: 0, 収支: 10, 凍結: 0 }

[3] において

var accB = exchanges[1].GetAccount()
accB

アウト[3]: { 収支: 10000 凍結 収支: 0 ストック: 1 凍結 ストック: 0 }

[4] において

var accC = exchanges[2].GetAccount()
accC

アウト[4]: { 収支: 10,000,凍結 収支: 0, ストック: 1, 凍結 ストック: 0 }

[5] において

var initSumBTC = accA.Balance + accC.Stocks
initSumBTC

アウト[5]: 2 について

[6] において

var initSumETH = accA.Stocks + accB.Stocks
initSumETH

アウト[6]: 11 について

[7]:

var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT

アウト[7]: 20000

BTC の総数は 2 で,ETH の総数は 11 で,USDT の総数は 20000 です.

[8] で:

var tickerA = exchanges[0].GetTicker()
tickerA

アウト[8]: { 時間: 1554831960000,} 高度:0.03396501 0.03396499 低かった 0.03396501 販売する 0.03396499 購入する 最後の0.033965です 総数: 4696.555 オープン・インテレスト: 0 }

[9]:

var tickerB = exchanges[1].GetTicker()
tickerB

アウト[9]: { 時間: 1554831960000,} 高さ: 175.08000001, 175.07999999, 低かった 売る: 175.08000001, 175.07999999, 購入する 最後の175.08 巻:20730.37 オープン・インテレスト: 0 }

[10] で:

var tickerC = exchanges[2].GetTicker()
tickerC

アウト[10]: { 時間: 1554831960000, 高さ: 5161.90000001 5161.89999999 低かった 売る 5161.90000001 5161.89999999 購入する 最後の5161.9 総数: 2109.9292 オープン・インテレスト: 0 }

Exchange A, Exchange Bと取引の対象はETHであることがわかります.つまり,Exchange A/Bは間接的なヘージング操作を行うことができますが,価格設定通貨が異なるため直接ヘージングすることはできません.Exchange Aの価格設定通貨はBTCであり,Exchange Bの通貨はUSDTです. 取引所Aが購入操作を実行すると仮定します.exchanges[0].Buy(price, amount)取引相手が販売した価格が購入時の注文価格として使用されます.tickerA.Sell取引所Bは,ヘッジのために売却操作を行います.exchanges[1].Sell(price, amount)取引相手が購入したい価格が販売時の注文価格として使用されます.tickerB.Buy交換が消費されるからですBTC交換Aは,交換Aが購入するときに,交換Bが販売するときに,交換Aが交換Aが購入するときに,交換Aが交換Aが購入するときに,交換Bが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するときに,交換Aが購入するUSDT取引所Aが消費するBTCを補うため,つまり取引所Cが実行するexchanges[2].Buy(price, amount)交換するUSDTBTC取引所Cは,取引相手の販売価格を見る必要があります.tickerC.Sell交換Aの購入価格が交換Bの販売価格よりも低い必要があります. その後,交換Cは,交換Aが消費したBTCをUSDTより少ない金額で買い戻します. では次の通りです

[11] で:

var diffB2A = tickerA.Sell - tickerB.Buy / tickerC.Sell    // DiffB2A means that Exchange B sells ETH coins and Exchange A buys ETH coins, which is logically equivalent to the transfer of ETH from Exchange B to Exchange A.
diffB2A

アウト[11]: 0.000047266535449966285 について

取引所Bと取引所Cよりも高いので ヘッジは明らかに損です 他のヘジング方向は同じである.エクスチェンジAはETHの売却操作を実行し,エクスチェンジBはETHの購入操作を実行し,エクスチェンジCはBTCをUSDTで販売する.通貨の達成は常にバランスで,USDTだけが増加または減少する (すなわち,稼いだ差).

[12] で:

var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
diffA2B

アウト[12]: 0.000047246531444007644 について

実験をしてみましょう.tickerA.Buy - tickerB.Sell / tickerC.Buy各値がどのように変化するかを知るためのヘージング操作です.

[13]では:

var idA = exchanges[0].Sell(tickerA.Buy, 1)
var nowAccA = exchanges[0].GetAccount()
nowAccA       // We can see that the handling fee is deducted from the BTC.

アウト[13]: {残高: 1,0339514, フローズン バランス: 0 ストック: 9個 フローズンストック: 0 }

[14] では:

var orderA = exchanges[0].GetOrder(idA)
orderA

アウト[14]: { ID: 1 ] チェックリスト 価格:0.03396499 価格:0.03396499 価格:0.03396499 価格:0.03396499 価格:0.03396499 額: 1 取引金額: 1 平均価格:0.03396499 タイプ: 1 オフセット: 0 状況: 1 契約タイプ: ETH_BTC_Huobi }

[15] について

var feeRatioA = 0.0004      // The default handling fee for backtesting is 0.2%, i.e. 0.002.
var feeA = orderA.DealAmount * orderA.AvgPrice * feeRatioA   // Exchange A trading handling fees, BTC denominated.
feeA

アウト[15]: 0.000013585996

[16]:

var idB = exchanges[1].Buy(tickerB.Sell, 1)
var nowAccB = exchanges[1].GetAccount()
nowAccB

出場[16]: {残高: 9824.84996798} フローズン バランス: 0 ストック: 2個 フローズンストック: 0 }

[17]:

var orderB = exchanges[1].GetOrder(idB)
orderB      // We can see that the handling fee is deducted from the USDT.

アウト[17]: { アイデンティティ: 1, 価格:175.08000001 額: 1 取引金額: 1 平均価格: 175.08000001, タイプ: 0 オフセット: 0 状況: 1 契約型: ETH_USDT_OKEX }

[18]:

var feeRatioB = 0.0004
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last    // Exchange B handling fees, converted to BTC denomination.
feeB

アウト[18]: 0.000013567097387396117

[19]:

var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
var nowAccC = exchanges[2].GetAccount()
nowAccC

アウト[19]: {残高: 10174.91841463, フローズン バランス: 0 ストック: 0.9661 フローズンストック:

[20]:

var orderC = exchanges[2].GetOrder(idC)
orderC     // We can see that the handling fee is deducted from the USDT.

アウト[20]: { アイデンティティ: 1, 価格: 5161.89999999, 額:0.0339 取引金額: 0.0339 平均価格: 5161.89999999, タイプ: 1 オフセット: 0 状況: 1 契約型: BTC_USDT_OKEX }

[21]では:

var feeRatioC = 0.0004
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last      // Exchange C trading handling fees, BTC denominated.
feeC

アウト[21]: 0.00001355999999999973732 税金について

負債の負債の負債と負債の負債の負債の負債の負債の負債

[22]:

var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC

アウト[22]: 2.0000514000000003

[23]:

var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH

アウト[23]: 11 について

[24]:

var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT

アウト[24]: 19999.76838261

[25]では:

nowSumBTC - initSumBTC

出場[25]: 0.00005140000000000256796 について

[26] で:

tickerC.Buy * (nowSumBTC - initSumBTC)    // The extra BTC is converted to USDT.

アウト[26]: 0.26532166000081153 について

[27]:

nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT    // Profit and loss is calculated based on the changes of the account assets and is denominated in USDT.

アウト[27]: 0.0337042700011807

[28]では:

(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy     // Profit and loss based on price difference, denominated in USDT.

出場[28]: 0.03372495390449328

価格差はdiffA2B: 0.000047246531444007644 について この3つのヘッジに対する処理料金は,以下のように BTC に変換されます.feeA+feeB+feeC.

[29]では:

feeA + feeB + feeC

出場[29]: 0.00004071309338736985

バックテストの設定では,処理料が"fee":[0.04,0.04]0.04%です この時点でfeeA+feeB+feeCこの調査文書は,基本的には,ヘッジ時の価格差 diffA2B に近い.最後に,計算された利益と損失は,0.03372495390449328,わずか0.03372495390449328,非常に小さく,口座変更によって計算された利益と損失は,基本的には価格差によって計算されたものと同じです.この調査文書は,三角型ヘッジでどのくらいの差をヘッジできるかを計算するために使用できます.


関連性

もっと