トライアングル・ヘッジ.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}]
})
初期交換口座の情報とティッカーの表示:
[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)
交換するUSDT
とBTC
取引所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
契約タイプ:
[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
契約型:
[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
契約型:
[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]}]
})
初期交換口座の情報とティッカーの表示:
[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)
交換するUSDT
とBTC
取引所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
契約タイプ:
[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
契約型:
[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
契約型:
[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,非常に小さく,口座変更によって計算された利益と損失は,基本的には価格差によって計算されたものと同じです.この調査文書は,三角型ヘッジでどのくらいの差をヘッジできるかを計算するために使用できます.