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:
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.Sell
Die 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.Buy
Weil der Austausch verbrauchtBTC
USDT beim Kauf, und der Austausch B erhielt USDT beim Verkauf, muss der AustauschUSDT
mit BTC, um die von Börse A verbrauchten BTC auszugleichen, d. h. Börse C führtexchanges[2].Buy(price, amount)
, und der AustauschUSDT
mitBTC
. 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.Buy
Sicherungsoperation, 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:
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:
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:
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+feeC
Zumindest, 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.
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:
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.Sell
Die 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.Buy
Weil der Austausch verbrauchtBTC
USDT beim Kauf, und der Austausch B erhielt USDT beim Verkauf, muss der AustauschUSDT
mit BTC, um die von Börse A verbrauchten BTC auszugleichen, d. h. Börse C führtexchanges[2].Buy(price, amount)
, und der AustauschUSDT
mitBTC
. 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.Buy
Sicherungsoperation, 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:
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:
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:
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+feeC
Die 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.