La couverture triangulaire
Dans [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}]
})
Affichage de l'information initiale sur le compte de change et des indices:
Dans [2]:
var accA = exchanges[0].GetAccount()
accA
Extrait [2]: { Solde: 1, geléSolde: 0, Stocks: 10, geléStocks: 0 }
Dans [3]:
var accB = exchanges[1].GetAccount()
accB
À l'extérieur [3]: { Solde: 10 000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }
Dans [4]:
var accC = exchanges[2].GetAccount()
accC
Extrait [4]: { Solde: 10 000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }
Dans [5]:
var initSumBTC = accA.Balance + accC.Stocks
initSumBTC
Extrait [5]: - Je ne sais pas.
Dans [6]:
var initSumETH = accA.Stocks + accB.Stocks
initSumETH
À l'extérieur [6]: 11 ans
Dans [7]:
var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT
À l'extérieur[7]: 20 000
On peut voir que le nombre total initial de BTC est de 2, le nombre total d'ETH est de 11 et le nombre total de USDT est de 20000.
Dans [8]:
var tickerA = exchanges[0].GetTicker()
tickerA
À l'extérieur[8]: Il est temps. Elle est élevée: 0,03396501. Faible: 0,03396499, Vendre: 0,03396501, et le prix de vente: Acheter: 0,03396499, Dernière: 0,033965, Volume: 4696,555 et le numéro de série: 4696,555. Je suis intéressé: 0 }
Dans [9]:
var tickerB = exchanges[1].GetTicker()
tickerB
À l'extérieur[9]: Je vous en prie. Le plus haut: 175.08000001. Le plus bas: 175,07999999, Vendre: 175.08000001, Achetez: 175,07999999, Dernière: 175,08. Volume: 20730.37, qui a été publié en Je ne peux pas vous aider.
Dans [10]:
var tickerC = exchanges[2].GetTicker()
tickerC
À l'extérieur [10]: Je vous en prie. Le niveau élevé: 5161.90000001. Le plus bas: 5161,89999999, Vendre: 5161 90000001, Achetez: 5161.89999999, Dernière: 5161,9, Volume: 2109.9292, qui a été publié le 1er juillet. Je ne suis pas intéressé.
On peut voir que l'objet de l'échange A, de l'échange B et de la transaction est l'ETH, c'est-à-dire que l'échange A / B peut effectuer des opérations de couverture indirecte, mais ne peut pas couvrir directement car les devises de tarification sont différentes.
Supposons que l'échange A effectue une opération d'achat deexchanges[0].Buy(price, amount)
, et le prix vendu par la contrepartie est utilisé comme prix d'ordre lors de l'achat, c'est-à-diretickerA.Sell
L'échange B effectue une opération de vente pour la couverture, c'est-à-dire:exchanges[1].Sell(price, amount)
, et le prix que la contrepartie souhaite acheter est utilisé comme prix d'ordre lors de la vente, c'est-à-diretickerB.Buy
Parce que l' échange A consomméBTC
lorsque vous achetez, et l'échange B obtenu USDT lors de la vente, l'échange A doit remplacerUSDT
avec BTC pour compenser le BTC consommé par l'échange A, c'est-à-dire l'échange C exécuteexchanges[2].Buy(price, amount)
, et d' échangeUSDT
avecBTC
Pour acheter, l'échange C doit voir le prix de vente de la contrepartie, c'est-à-diretickerC.Sell
. Le prix d'achat de l'échange A doit être inférieur au prix de vente de l'échange B, puis l'échange C peut racheter le BTC consommé par l'échange A avec moins de USDT. Vous gagnerez la différence du montant USDT.
Il en va comme suit:
Dans [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
À l'extérieur [11]: 0,000047266535449966285 Pour les produits dérivés de l'alimentation végétale
Il est évident que le prix d'achat de la Bourse A est plus élevé que celui de la Bourse B et de la Bourse C, et la couverture est évidemment une perte d'argent. L'autre direction de couverture est la même. L'échange A exécute l'opération de vente d'ETH, l'échange B exécute l'opération d'achat d'ETH et l'échange C vend des BTC pour USDT. L'obtention de la devise est toujours équilibrée et seul l'USDT augmente ou diminue (c'est-à-dire la différence gagnée).
Dans [12]:
var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
diffA2B
À l'extérieur [12]: Le montant de l'aide est calculé à partir du montant de l'aide.
Faisons unetickerA.Buy - tickerB.Sell / tickerC.Buy
l'opération de couverture afin de savoir comment chacune des valeurs change.
Dans [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.
À l'extérieur[13]: Le solde est de 1,03389706. Le solde de la banque: 0, Les stocks: 9, Je ne peux pas. Je peux pas.
Dans [14]:
var orderA = exchanges[0].GetOrder(idA)
orderA
Extrait [1]:
{ Id: 1,
Le prix est de 0,03396499.
Montant: 1,
Le montant de la transaction est de 1,
Le prix moyen: 0,03396499,
Type: 1,
Décalage: 0,
Le statut: 1,
Le type de contrat:
Dans [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
Extrait [1]: Le montant de l'impôt sur les sociétés
Dans [16]:
var idB = exchanges[1].Buy(tickerB.Sell, 1)
var nowAccB = exchanges[1].GetAccount()
nowAccB
Extrait [1]: { Solde: 9824.56983998, Le solde de la banque: 0, Les stocks: 2, Je ne peux pas. Je peux pas.
Dans [17]:
var orderB = exchanges[1].GetOrder(idB)
orderB // We can see that the fee is deducted from the USDT.
Extrait [1]:
{ Id: 1,
Le prix est de 175,08000001.
Montant: 1,
Le montant de la transaction est de 1.
Le prix moyen: 175,08000001,
Type: 0,
Décalage: 0,
Le statut: 1,
Le type de contrat:
Dans [18]:
var feeRatioB = 0.002
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last // B exchange fees, converted to BTC denomination.
feeB
À l'extérieur [1]: Le montant de l'aide est calculé à partir du montant de l'aide.
Dans [19]:
var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
var nowAccC = exchanges[2].GetAccount()
nowAccC
Extrait [1]: { Solde: 10174.12327555, Le solde est de 0, Les stocks sont de 0,9662. Je ne sais pas.
Dans [20]:
var orderC = exchanges[2].GetOrder(idC)
orderC // We can see that the fee is deducted from the USDT.
Extrait [1]:
{ Id: 1,
Le prix est de 5161,89999999.
Montant: 0,0338,
Le montant de la transaction est de 0,0338.
Prix moyen: 5161.89999999,
Type: 1,
Décalage: 0,
Le statut: 1,
Le type de contrat:
Dans [21]:
var feeRatioC = 0.002
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last // Fees for C exchange transactions, BTC denominated.
feeC
Extrait[21]: 0,00006759999999986903 Pour les produits de base
Le montant de l'assurance doit être calculé à partir de la valeur de l'actif.
Dans [22]:
var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC
À l'extérieur [1]: Les produits de la catégorie 2
Dans [23]:
var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH
Extrait[23]: 11 ans
Dans [24]:
var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT
À l'extérieur [1]: 19998.69311553 Les États membres
Dans [25]:
nowSumBTC - initSumBTC
Extrait[25]: Le montant de l'aide est fixé à la somme suivante:
Dans [26]:
tickerC.Buy * (nowSumBTC - initSumBTC) // Excess BTC converted to USDT
À l'extérieur [1]: 0,5010140139983642 Pour les produits de base:
Dans [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.
Extrait[27]: - 0,8058704560025944 - 0,8058704560025944 - 0,8058704560025944 - 0,8058704560025944 - 0,8058704545
Dans [28]:
(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy // Profit and loss based on price difference, denominated in USDT.
Extrait[28]: - 0,8058703331189396 - 0,8058703331189396 - 0,8058703331189396 - 0,8058703331189396 - 0,805870333331189396 - 0,805870396
Comme nous pouvons le voir, la différence de prix lors de la couverture est diffA2B: 0,000047246531444007644. Les frais pour les trois couvertures, convertis en BTC sont: feeA + feeB + feeC.
Dans [29]:
feeA + feeB + feeC
Extrait[29]: 0,0002033654669368496 Pour les produits de base:
On constate que pour une telle couverture triangulaire, la différence de prix doit être supérieure àfeeA+feeB+feeC
au moins, ce qui signifie aucune perte, aucun gain, et pour faire un profit doit être supérieur à la différence de prix.
À l'heure actuelle, grâce au calcul de la comparaison des comptes et au calcul de la différence de prix, il s'agit d'une perte.
J'ai modifié une version, de sorte que les frais de manutention calculés par le paramètre des frais de manutention sont exactement égaux au profit de la différence de prix du marché testé par ce modèle d'observation comparative.
Il ressort de ce qui précède que, sous la condition par défaut des frais de traitement (2 ‰ par défaut), lorsque la différence de couverture est de 0,000047246531444007644 BTC, la couverture est une perte et la perte est d'environ -0,8058704560025944.
La couverture triangulaire (ajustement des frais de traitement).ipynb
Dans [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]}]
})
Affichage de l'information initiale sur le compte de change et de l'indicateur:
Dans [2]:
var accA = exchanges[0].GetAccount()
accA
Extrait [2]: { Solde: 1, geléSolde: 0, Stocks: 10, geléStocks: 0 }
Dans [3]:
var accB = exchanges[1].GetAccount()
accB
À l'extérieur [3]: { Solde: 10 000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }
Dans [4]:
var accC = exchanges[2].GetAccount()
accC
Extrait [4]: { Solde: 10 000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }
Dans [5]:
var initSumBTC = accA.Balance + accC.Stocks
initSumBTC
Extrait [5]: - Je ne sais pas.
Dans [6]:
var initSumETH = accA.Stocks + accB.Stocks
initSumETH
À l'extérieur [6]: 11 ans
Dans [7]:
var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT
À l'extérieur[7]: 20 000
On peut voir que le nombre total initial de BTC est de 2, le nombre total d'ETH est de 11 et le nombre total de USDT est de 20000.
Dans [8]:
var tickerA = exchanges[0].GetTicker()
tickerA
À l'extérieur[8]: Il est temps. Elle est élevée: 0,03396501. Faible: 0,03396499, Vendre: 0,03396501, et le prix de vente: Acheter: 0,03396499, Dernière: 0,033965, Volume: 4696,555 et le numéro de série: 4696,555. Je suis intéressé: 0 }
Dans [9]:
var tickerB = exchanges[1].GetTicker()
tickerB
À l'extérieur[9]: Je vous en prie. Le plus haut: 175.08000001. Le plus bas: 175,07999999, Vendre: 175.08000001, Achetez: 175,07999999, Dernière: 175,08. Volume: 20730.37, qui a été publié en Je ne peux pas vous aider.
Dans [10]:
var tickerC = exchanges[2].GetTicker()
tickerC
À l'extérieur [10]: Je vous en prie. Le niveau élevé: 5161.90000001. Le plus bas: 5161,89999999, Vendre: 5161 90000001, Achetez: 5161.89999999, Dernière: 5161,9, Volume: 2109.9292, qui a été publié le 1er juillet. Je ne suis pas intéressé.
On peut voir que l'objet de l'échange A, de l'échange B et de la transaction est l'ETH, c'est-à-dire que l'échange A / B peut effectuer des opérations de couverture indirecte, mais ne peut pas couvrir directement car les devises de tarification sont différentes.
Supposons que l'échange A effectue une opération d'achat deexchanges[0].Buy(price, amount)
, et le prix vendu par la contrepartie est utilisé comme prix d'ordre lors de l'achat, c'est-à-diretickerA.Sell
L'échange B effectue une opération de vente pour la couverture, c'est-à-dire:exchanges[1].Sell(price, amount)
, et le prix que la contrepartie souhaite acheter est utilisé comme prix d'ordre lors de la vente, c'est-à-diretickerB.Buy
Parce que l' échange A consomméBTC
lorsque vous achetez, et l'échange B obtenu USDT lors de la vente, l'échange A doit remplacerUSDT
avec BTC pour compenser le BTC consommé par l'échange A, c'est-à-dire l'échange C exécuteexchanges[2].Buy(price, amount)
, et d' échangeUSDT
avecBTC
Pour acheter, l'échange C doit voir le prix de vente de la contrepartie, c'est-à-diretickerC.Sell
. Le prix d'achat de l'échange A doit être inférieur au prix de vente de l'échange B, puis l'échange C peut racheter le BTC consommé par l'échange A avec moins de USDT. Vous gagnerez la différence du montant USDT.
Il en va comme suit:
Dans [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
À l'extérieur [11]: 0,000047266535449966285 Pour les produits dérivés de l'alimentation végétale
Il est évident que le prix d'achat de la Bourse A est plus élevé que celui de la Bourse B et de la Bourse C, et la couverture est évidemment une perte d'argent. L'autre direction de couverture est la même. L'échange A exécute l'opération de vente d'ETH, l'échange B exécute l'opération d'achat d'ETH et l'échange C vend des BTC pour USDT. L'obtention de la devise est toujours équilibrée et seul l'USDT augmente ou diminue (c'est-à-dire la différence gagnée).
Dans [12]:
var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
diffA2B
À l'extérieur [12]: Le montant de l'aide est calculé à partir du montant de l'aide.
Faisons unetickerA.Buy - tickerB.Sell / tickerC.Buy
l'opération de couverture afin de savoir comment chacune des valeurs change.
Dans [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.
À l'extérieur[13]: { Solde: 1,0339514, Le solde est de 0, Les stocks: 9, Je ne sais pas.
Dans [14]:
var orderA = exchanges[0].GetOrder(idA)
orderA
Extrait [1]:
{ Id: 1,
Le prix est de 0,03396499.
Montant: 1,
Le montant de la transaction est de 1,
Le prix moyen: 0,03396499,
Type: 1,
Décalage: 0,
Le statut: 1,
Le type de contrat:
Dans [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
Extrait [1]: 0,000013585996 Le montant de l'indemnité est calculé à partir du montant de l'indemnité
Dans [16]:
var idB = exchanges[1].Buy(tickerB.Sell, 1)
var nowAccB = exchanges[1].GetAccount()
nowAccB
Extrait [1]: { Solde: 9824.84996798, Le solde est de 0, Les stocks: 2, Je ne sais pas.
Dans [17]:
var orderB = exchanges[1].GetOrder(idB)
orderB // We can see that the handling fee is deducted from the USDT.
Extrait [1]:
{ Id: 1,
Le prix est de 175,08000001.
Montant: 1,
Le montant de la transaction est de 1.
Le prix moyen: 175,08000001,
Type: 0,
Décalage: 0,
Le statut: 1,
Le type de contrat:
Dans [18]:
var feeRatioB = 0.0004
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last // Exchange B handling fees, converted to BTC denomination.
feeB
À l'extérieur [1]: Le montant de l'indemnité est calculé à partir du montant de l'indemnité.
Dans [19]:
var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
var nowAccC = exchanges[2].GetAccount()
nowAccC
Extrait [1]: { Solde: 10174.91841463, Le solde est de 0, Les stocks: 0,9661. Je ne sais pas.
Dans [20]:
var orderC = exchanges[2].GetOrder(idC)
orderC // We can see that the handling fee is deducted from the USDT.
Extrait [1]:
{ Id: 1,
Le prix est de 5161,89999999.
Montant: 0,0339,
Le montant de la transaction est de 0,0339.
Le prix moyen est de 5161,89999999.
Type: 1,
Décalage: 0,
Le statut: 1,
Le type de contrat:
Dans [21]:
var feeRatioC = 0.0004
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last // Exchange C trading handling fees, BTC denominated.
feeC
Extrait[21]: Le montant de l'aide est fixé à la somme suivante:
Le montant de l'assurance doit être calculé à partir de la valeur de l'actif.
Dans [22]:
var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC
À l'extérieur [1]: Le montant de l'aide est fixé à la valeur de l'aide accordée.
Dans [23]:
var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH
Extrait[23]: 11 ans
Dans [24]:
var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT
À l'extérieur [1]: 19999.76838261 Le projet de loi
Dans [25]:
nowSumBTC - initSumBTC
Extrait[25]: Le montant de l'aide est calculé à partir du montant de l'aide.
Dans [26]:
tickerC.Buy * (nowSumBTC - initSumBTC) // The extra BTC is converted to USDT.
Extrait[26]: 0,26532166000081153 Pour les produits de base:
Dans [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.
Extrait[27]: 0,0337042700011807
Dans [28]:
(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy // Profit and loss based on price difference, denominated in USDT.
Extrait[28]: Je vous en prie, laissez-moi vous dire.
On peut voir que la différence de prix pendant la couverture estdiffA2B
Il s'agit d'un projet de loi.
Les frais de traitement pour les trois couvertures sont convertis en BTC comme suit:feeA+feeB+feeC
.
Dans [29]:
feeA + feeB + feeC
Extrait[29]: Le montant de l'aide est fixé à la valeur ajoutée de l'aide.
On peut voir que dans la configuration de backtest, la redevance de manutention est modifiée en"fee":[0.04,0.04]
, c'est à dire 0,04%.feeA+feeB+feeC
La différence de prix de l'unité de couverture est égale à 0,00004071309338736985, ce qui est en gros proche de la différence de prix diffA2B au moment de la couverture. Enfin, le bénéfice et la perte calculés est très faible, seulement 0,03372495390449328, et le bénéfice et la perte calculés par changement de compte est fondamentalement le même que celui calculé par différence de prix. Ce document de recherche peut être utilisé pour calculer la différence qui peut être couverte pour la couverture triangulaire.