Die Ressourcen sind geladen. Beförderung...

Nutzung des Forschungsumfelds zur Analyse der Einzelheiten der dreieckigen Absicherung und der Auswirkungen der Abwicklungsgebühren auf die abgesicherten Preisdifferenzen

Schriftsteller:FMZ~Lydia, Erstellt: 2022-12-29 09:46:17, Aktualisiert: 2024-12-17 20:48:26

img

Nutzung des Forschungsumfelds zur Analyse der Einzelheiten der dreieckigen Absicherung und der Auswirkungen der Abwicklungsgebühren auf die abgesicherten Preisdifferenzen

Forschungsversion ohne Anpassung der Bearbeitungsgebühren

Dreieckssicherung.ipynb

In [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}]
})

Anzeige der ursprünglichen Wechselkontoinformationen und Tickers:

  • Handelspaar in der Börse A ist: ETH_BTC
  • Handelspaar in der Börse B ist: ETH_USDT
  • Handelspaar in Exchange C ist: BTC_USDT

In [2]:

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

Ausgeschaltet[2]: { Saldo: 1, FrozenBalance: 0, Lagerbestände: 10, FrozenStocks: 0 }

In [3]:

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

Ausgeschaltet[3]: { Saldo: 10.000, FrozenBalance: 0, Lagerbestände: 1, FrozenStocks: 0 }

In [4]:

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

Ausgeschaltet[4]: { Saldo: 10.000, FrozenBalance: 0, Lagerbestände: 1, FrozenStocks: 0 }

In [5]:

var initSumBTC = accA.Balance + accC.Stocks
initSumBTC

Ausgeschaltet[5]: 2.

In [6]:

var initSumETH = accA.Stocks + accB.Stocks
initSumETH

Ausgeschaltet[6]: 11 Jahre

In [7]:

var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT

Aus[7]: 20000

Es kann gesehen werden, dass die anfängliche Gesamtzahl von BTC 2, die Gesamtzahl von ETH 11 und die Gesamtzahl von USDT 20000 ist.

In [8]:

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

Außen[8]: (Zeit: 1554831960000) Hoch: 0,03396501. Niedrig: 0,03396499, Verkaufen: 0,03396501. Kaufen: 0.03396499, Letzter: 0,033965, Volumen: 4696,555, Offener Interesse: 0 }

In [9]:

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

Ausgeschaltet[9]: (Zeit: 1554831960000) Hoch: 175.08000001. Niedrig: 175,07999999, Verkauf: 175.08000001, Kaufen: 175.07999999, Zuletzt: 175,08. Volumen: 20730.37, Offener Interesse: 0 }

In [10]:

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

Ausgeschaltet[10]: (Zeit: 1554831960000) Hoch: 5161.90000001, Niedrig: 5161.89999999, Verkaufen: 5161.90000001, Kaufen: 5161.89999999, Zuletzt: 5161,9. Volumen: 2109.9292, Offener Interesse: 0 }

Es kann gesehen werden, dass der Gegenstand von Exchange A, Exchange B und der Transaktion ETH ist, dh Exchange A / B kann indirekte Absicherungsgeschäfte durchführen, aber sie können nicht direkt absichern, da die Preiswährungen unterschiedlich sind. Nehmen wir an, dass die Börse A eine Kaufoperation vonexchanges[0].Buy(price, amount), und der von der Gegenpartei verkaufte Preis wird beim Kauf als Auftragspreis verwendet, d. h.tickerA.SellDie Börse B führt eine Verkaufsaktion zur Absicherung durch, d. h.exchanges[1].Sell(price, amount), und der Preis, den die Gegenpartei kaufen möchte, wird als Auftragspreis beim Verkauf verwendet, d. h.tickerB.BuyWeil der Austausch verbrauchtBTCUSDT beim Kauf, und der Austausch B erhielt USDT beim Verkauf, muss der AustauschUSDTmit BTC, um die von Börse A verbrauchten BTC auszugleichen, d. h. Börse C führtexchanges[2].Buy(price, amount), und der AustauschUSDTmitBTC. Um zu kaufen, muss die Börse C den Verkaufspreis der Gegenpartei sehen, d.h.tickerC.Sell. Der Kaufpreis von A muss niedriger sein als der Verkaufspreis von B, dann kann Exchange C BTC zurückkaufen, die von Exchange A mit weniger USDT verbraucht wurde. Es ist also folgendermaßen:

In [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

Ausgeschaltet[11]: 0,000047266535449966285

Offensichtlich ist der Kaufpreis der Börse A höher als der der Börse B und der der Börse C, und die Absicherung ist offensichtlich ein Geldverlust. Die andere Absicherungsrichtung ist die gleiche. Exchange A führt die ETH-Verkaufsoperation aus, Exchange B führt die ETH-Kaufoperation aus und Exchange C verkauft BTC für USDT. Die Erzielung der Währung ist immer ausgeglichen und nur USDT steigt oder sinkt (d. h. die verdiente Differenz).

In [12]:

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

Ausgeschaltet: 0,000047246531444007644

Lassen Sie uns einetickerA.Buy - tickerB.Sell / tickerC.BuySicherungsoperation, um herauszufinden, wie sich jeder der Werte ändert.

In [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.

Aus dem Spiel[13]: { Saldo: 1,03389706, FrozenBalance: 0, Lagerbestände: 9, FrozenStocks: 0

In [14]:

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

Ausgeschaltet[1]: {Id: 1, Preis: 0,03396499, Betrag: 1, DealAmount: 1, Durchschnittlicher Preis: 0,03396499, Typ: 1, Abstand: 0, Status: 1, Vertragstyp: ETH_BTC_Huobi }

In [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

Ausgeschaltet[1]: 0,00006792998000000001

In [16]:

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

Ausgeschaltet [1]: { Saldo: 9824,56983998 FrozenBalance: 0, Lagerbestände: 2, FrozenStocks: 0

In [17]:

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

Ausgeschaltet [1]: {Id: 1, Preis: 175.08000001, Betrag: 1, DealAmount: 1, Durchschnittlicher Preis: 175.08000001, Typ: 0, Abwanderung: 0, Status: 1, Vertragstyp: ETH_USDT_OKEX }

In [18]:

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

Ausgeschaltet[1]: 0,00006783548693698057

In [19]:

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

Ausgeschaltet[1]: { Saldo: 10174.12327555, FrozenBalance: 0, Lagerbestände: 0,9662. FrozenStocks: 0

In [20]:

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

Ausgeschaltet[1]: {Id: 1, Preis: 5161.89999999, Betrag: 0,0338 DealAmount: 0,0338 und Durchschnittlicher Preis: 5161.89999999, Typ: 1, Abstand: 0, Status: 1, Vertragstyp: BTC_USDT_OKEX }

In [21]:

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

Außen [1]: 0,00006759999999986903

Berechnung der Gesamtvermögenswerte nach Absicherung:

In [22]:

var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC

Außen [1]: 2.00009706

In [23]:

var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH

Außen [1]: 11 Jahre

In [24]:

var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT

Ausgeschieden[24]: 19998.69311553

In [25]:

nowSumBTC - initSumBTC

Ausgeschaltet[25]: 0,00009705999999987114

In [26]:

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

Ausgeschaltet[1]: 0,5010140139983642

In [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.

Ausgeschaltet[1]: - 0,8058704560025944 - 0,80587045600

In [28]:

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

Ausgeschaltet[28]: - 0,8058703331189396

Wie wir sehen können, beträgt die Preisdifferenz bei der Absicherung diffA2B: 0,000047246531444007644. Die Gebühren für die drei Absicherungen, umgerechnet in BTC, sind: feeA + feeB + feeC.

In [29]:

feeA + feeB + feeC

Ausgeschaltet[29]: 0,0002033654669368496

Es kann festgestellt werden, daß für eine solche Dreieckssicherung die Preisunterschiede größer sein müssen alsfeeA+feeB+feeCZumindest, was bedeutet, kein Verlust, kein Gewinn, und um einen Gewinn zu erzielen muss der Preisunterschied größer sein. Derzeit beträgt der Verlust durch Kontovergleichsberechnung und Preisdifferenzberechnung etwa -0,8058704560025944. Ich habe eine Version geändert, so dass die durch den Parameter der Bearbeitungsgebühren berechneten Bearbeitungsgebühren genau dem Preisunterschiedgewinn des Marktes entsprechen, der mit diesem Vergleichsmodell bewertet wurde.

Es ist zu sehen, dass unter der Standardbedingung der Bearbeitungsgebühren (2 ‰ standardmäßig), wenn die Absicherungsdifferenz 0,000047246531444007644 BTC beträgt, die Absicherung ein Verlust darstellt und der Verlust etwa -0,8058704560025944 beträgt.

Forschungsversion der Anpassung der Bearbeitungsgebühren

Dreieckssicherung (Anpassung der Bearbeitungsgebühren).ipynb

In [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]}]
})

Anzeige der ursprünglichen Wechselkontoinformationen und des Tickers:

  • Handelspaar in der Börse A ist: ETH_BTC
  • Handelspaar in der Börse B ist: ETH_USDT
  • Handelspaar in Exchange C ist: BTC_USDT

In [2]:

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

Ausgeschaltet[2]: { Saldo: 1, FrozenBalance: 0, Lagerbestände: 10, FrozenStocks: 0 }

In [3]:

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

Ausgeschaltet[3]: { Saldo: 10.000, FrozenBalance: 0, Lagerbestände: 1, FrozenStocks: 0 }

In [4]:

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

Ausgeschaltet[4]: { Saldo: 10.000, FrozenBalance: 0, Lagerbestände: 1, FrozenStocks: 0 }

In [5]:

var initSumBTC = accA.Balance + accC.Stocks
initSumBTC

Ausgeschaltet[5]: 2.

In [6]:

var initSumETH = accA.Stocks + accB.Stocks
initSumETH

Ausgeschaltet[6]: 11 Jahre

In [7]:

var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT

Aus[7]: 20000

Es kann gesehen werden, dass die anfängliche Gesamtzahl von BTC 2, die Gesamtzahl von ETH 11 und die Gesamtzahl von USDT 20000 ist.

In [8]:

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

Außen[8]: (Zeit: 1554831960000) Hoch: 0,03396501. Niedrig: 0,03396499, Verkaufen: 0,03396501. Kaufen: 0.03396499, Letzter: 0,033965, Volumen: 4696,555, Offener Interesse: 0 }

In [9]:

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

Ausgeschaltet[9]: (Zeit: 1554831960000) Hoch: 175.08000001. Niedrig: 175,07999999, Verkauf: 175.08000001, Kaufen: 175.07999999, Zuletzt: 175,08. Volumen: 20730.37, Offener Interesse: 0 }

In [10]:

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

Ausgeschaltet[10]: (Zeit: 1554831960000) Hoch: 5161.90000001, Niedrig: 5161.89999999, Verkaufen: 5161.90000001, Kaufen: 5161.89999999, Zuletzt: 5161,9. Volumen: 2109.9292, Offener Interesse: 0 }

Es kann gesehen werden, dass der Gegenstand von Exchange A, Exchange B und der Transaktion ETH ist, dh Exchange A / B kann indirekte Absicherungsgeschäfte durchführen, aber sie können nicht direkt absichern, da die Preiswährungen unterschiedlich sind. Nehmen wir an, dass die Börse A eine Kaufoperation vonexchanges[0].Buy(price, amount), und der von der Gegenpartei verkaufte Preis wird beim Kauf als Auftragspreis verwendet, d. h.tickerA.SellDie Börse B führt eine Verkaufsaktion zur Absicherung durch, d. h.exchanges[1].Sell(price, amount), und der Preis, den die Gegenpartei kaufen möchte, wird als Auftragspreis beim Verkauf verwendet, d. h.tickerB.BuyWeil der Austausch verbrauchtBTCUSDT beim Kauf, und der Austausch B erhielt USDT beim Verkauf, muss der AustauschUSDTmit BTC, um die von Börse A verbrauchten BTC auszugleichen, d. h. Börse C führtexchanges[2].Buy(price, amount), und der AustauschUSDTmitBTC. Um zu kaufen, muss die Börse C den Verkaufspreis der Gegenpartei sehen, d.h.tickerC.Sell. Der Kaufpreis von A muss niedriger sein als der Verkaufspreis von B, dann kann Exchange C BTC zurückkaufen, die von Exchange A mit weniger USDT verbraucht wurde. Es ist also folgendermaßen:

In [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

Ausgeschaltet[11]: 0,000047266535449966285

Offensichtlich ist der Kaufpreis der Börse A höher als der der Börse B und der der Börse C, und die Absicherung ist offensichtlich ein Geldverlust. Die andere Absicherungsrichtung ist die gleiche. Exchange A führt die ETH-Verkaufsoperation aus, Exchange B führt die ETH-Kaufoperation aus und Exchange C verkauft BTC für USDT. Die Erzielung der Währung ist immer ausgeglichen und nur USDT steigt oder sinkt (d. h. die verdiente Differenz).

In [12]:

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

Ausgeschaltet: 0,000047246531444007644

Lassen Sie uns einetickerA.Buy - tickerB.Sell / tickerC.BuySicherungsoperation, um herauszufinden, wie sich jeder der Werte ändert.

In [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.

Ausgeschieden[13]: { Saldo: 1,0339514, FrozenBalance: 0, Lagerbestände: 9, FrozenStocks: 0 }

In [14]:

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

Ausgeschaltet[1]: {Id: 1, Preis: 0,03396499, Betrag: 1, DealAmount: 1, Durchschnittlicher Preis: 0,03396499, Typ: 1, Abstand: 0, Status: 1, Vertragstyp: ETH_BTC_Huobi }

In [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

Ausgeschaltet[15]: 0,000013585996

In [16]:

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

Ausgeschaltet [1]: { Saldo: 9824.84996798, FrozenBalance: 0, Lagerbestände: 2, FrozenStocks: 0

In [17]:

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

Ausgeschaltet [1]: {Id: 1, Preis: 175.08000001, Betrag: 1, DealAmount: 1, Durchschnittlicher Preis: 175.08000001, Typ: 0, Abwanderung: 0, Status: 1, Vertragstyp: ETH_USDT_OKEX }

In [18]:

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

Ausgeschaltet[1]: 0,000013567097387396117

In [19]:

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

Ausgeschaltet[1]: { Saldo: 10174.91841463, FrozenBalance: 0, Die Lagerbestände: 0,9661. FrozenStocks: 0 }

In [20]:

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

Ausgeschaltet[1]: {Id: 1, Preis: 5161.89999999, Betrag: 0,0339, DealAmount: 0,0339, Durchschnittlicher Preis: 5161.89999999, Typ: 1, Abstand: 0, Status: 1, Vertragstyp: BTC_USDT_OKEX }

In [21]:

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

Außen [1]: 0,000013559999999973732

Berechnen Sie die Gesamtvermögenswerte nach der Absicherung.

In [22]:

var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC

Außen [1]: 2.0000514000000003

In [23]:

var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH

Außen [1]: 11 Jahre

In [24]:

var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT

Ausgeschaltet[1]: 19999.76838261

In [25]:

nowSumBTC - initSumBTC

Ausgeschaltet[25]: 0,000051400000000256796

In [26]:

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

Ausgeschaltet[1]: 0,26532166000081153

In [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.

Ausgeschaltet[1]: 0.0337042700011807

In [28]:

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

Ausgeschaltet[28]: - Das ist nicht wahr. - Nein.

Es kann festgestellt werden, daß die Preisdifferenz während der AbsicherungdiffA2B: 0,000047246531444007644. Die Bearbeitungsgebühr für die drei Absicherungen wird in BTC umgerechnet:feeA+feeB+feeC.

In [29]:

feeA + feeB + feeC

Ausgeschaltet[29]: 0,00004071309338736985

Es ist zu sehen, daß in der Backtest-Konfiguration die Handling-Gebühr auf"fee":[0.04,0.04], d.h. 0,04%.feeA+feeB+feeCDie Berechnung des Gewinns und Verlusts ist sehr gering, nur 0,03372495390449328, und der Gewinn und Verlust, der durch Kontoänderung berechnet wird, ist grundsätzlich derselbe wie der durch Preisdifferenz berechnet.


Verwandt

Mehr