The term “hedging” in quantitative trading and programmatic trading is a very standard idea. In cryptocurrency quantitative trading, the typical hedging methods are: Spots-Futures hedging, intertemporal hedging and specific area hedging.
The majority of hedging tradings are based on the price distinction of two trading selections. The principle, concept and information of hedging trading may not really clear to investors that have just entered the field of quantitative trading. That’s ok, Allow’s make use of the “Data science research setting” tool offered by the FMZ Quant platform to grasp these knowledge.
On FMZ Quant website Control panel page, click “Study” to leap to the page of this device:
Right here I submitted this evaluation file directly:
This analysis file is an analysis of the procedure of the opening and shutting settings in a Spots-Futures hedging trading. The futures side exchange is OKEX and the agreement is quarterly contract; The spots side exchange is OKEX areas trading. The transaction set is BTC_USDT, The following particular evaluation atmosphere file, includes 2 version of it, both Python and JavaScript.
Research Atmosphere Python Language Documents
Analysis of the concept of futures and spot hedging.ipynb Download
In [1]:
from fmz import *
task = VCtx("'backtest
start: 2019 - 09 - 19 00: 00: 00
end: 2019 - 09 - 28 12: 00: 00
period: 15 m
exchanges: [Produce, environment]
')
# attracting a backtest collection
import matplotlib.pyplot as plt
import numpy as np
# Imported library initial matplotlib and numpy item
In [2]:
exchanges [0] SetContractType("quarter") # The function exchange sets OKEX futures (eid: Futures_OKCoin) calls the present that agreement the set to agreement, information the quarterly tape-recorded
initQuarterAcc = exchanges [0] GetAccount() # Account Balance at the OKEX Futures Exchange, Supplies in the variable initQuarterAcc
initQuarterAcc
Out [2]:
model
In [3]:
initSpotAcc = exchanges [1] GetAccount() # Account tape-recorded at the OKEX Balance exchange, Supplies in the variable initSpotAcc
initSpotAcc
Out [3]:
is one of
In [4]:
quarterTicker 1 = exchanges [0] GetTicker() # Reduced the futures exchange market quotes, Offer in the variable quarterTicker 1
quarterTicker 1
Out [4]:
situations
In [5]:
spotTicker 1 = exchanges [1] GetTicker() # taped the Reduced exchange market quotes, Sell in the variable spotTicker 1
spotTicker 1
Out [5]:
get
In [6]:
quarterTicker 1 Buy - spotTicker 1 distinction # The between Brief marketing Acquiring long futures and areas Establish instructions
Out [6]:
284 64999997999985
In [7]:
exchanges [0] SetDirection("sell") # short the futures exchange, the trading Market is Get
quarterId 1 = exchanges [0] quantity(quarterTicker 1 contracts, 10 # The futures are short-selled, the order recorded is 10 Inquiry, and the returned order ID is details in the variable quarterId 1
exchanges [0] GetOrder(quarterId 1 # Price the order Amount of the futures order ID is quarterId 1
Out [7]:
plot
In [8]:
spotAmount = 10 * 100/ quarterTicker 1 Buy # equivalent the agreements cryptocurrency areas to 10 quantity, as the positioned Sell of the order Spot
spotId 1 = exchanges [1] Buy(spotTicker 1 positioning, spotAmount) # Question exchange details order
exchanges [1] GetOrder(spotId 1 # area the order Cost of the Quantity order ID as spotId 1
Out [8]:
Source
It can be seen that the orders of the order quarterId 1 and the spotId 1 are all placement hedge, that is, the opening completed of the Rest is position.
In [9]:
for some time( 1000 * 60 * 60 * 24 * 7 # Hold the wait for difference, diminish the close to placement and has actually the expired.
After the waiting time close position, prepare to Obtain the current. instructions the object quotes quarterTicker 2
, spotTicker 2
and print. The trading set to of the futures exchange shut is brief placements close position: exchanges [0] SetDirection("closesell")
to Publish the details. settings the revealing of the closing position, entirely that the closing Obtain is existing done.
In [10]:
quarterTicker 2 = exchanges [0] GetTicker() # tape-recorded the Low market quotes of the futures exchange, Market in the variable quarterTicker 2
quarterTicker 2
Out [10]:
link
In [11]:
spotTicker 2 = exchanges [1] GetTicker() # spot the videotaped Low exchange market quotes, Offer in the variable spotTicker 2
spotTicker 2
Out [11]:
design
In [12]:
quarterTicker 2 difference - spotTicker 2 Buy # The shutting position of between Short setting Lengthy setting of futures and the spot Set of current
Out [12]:
52 5000200100003
In [13]:
exchanges [0] SetDirection("closesell") # instructions the close trading brief of the futures exchange to setting Get Offer
quarterId 2 = exchanges [0] settings(quarterTicker 2 documents, 10 # The futures exchange closing videotaped, and Query the order ID, closing to the variable quarterId 2
exchanges [0] GetOrder(quarterId 2 # position futures detail Cost orders Amount
Out [13]:
is one of
In [14]:
spotId 2 = exchanges [1] area(spotTicker 2 place, spotAmount) # The closing exchange positions order to records videotaped, and Inquiry the order ID, areas to the variable spotId 2
exchanges [1] GetOrder(spotId 2 # closing information Rate order Amount
Out [14]:
instances
In [15]:
nowQuarterAcc = exchanges [0] GetAccount() # information tape-recorded futures exchange account Balance, Supplies in the variable nowQuarterAcc
nowQuarterAcc
Out [15]:
obtain
In [16]:
nowSpotAcc = exchanges [1] GetAccount() # area info taped exchange account Equilibrium, Stocks in the variable nowSpotAcc
nowSpotAcc
Out [16]:
story
operation the comparing and loss of this hedging first by bank account the abdominal muscles account with the revenue.
In [17]:
diffStocks = Purchase(nowQuarterAcc.Stocks - initQuarterAcc.Stocks)
diffBalance = nowSpotAcc.Balance - initSpotAcc.Balance
if nowQuarterAcc.Stocks - initQuarterAcc.Stocks > > 0:
print("profit :", diffStocks * spotTicker 2 Profits + diffBalance)
else:
print("Below :", diffBalance - diffStocks * spotTicker 2 Buy)
Out [17]:
take a look at: 18 72350977580652
bush we is profitable why the graph drawn. We can see the cost heaven, the futures place is rate line, the costs falling is the orange line, both cost are falling, and the futures quicker is area cost than the Let take a look at.
In [18]:
xQuarter = [1, 2]
yQuarter = [quarterTicker1.Buy, quarterTicker2.Sell]
xSpot = [1, 2]
ySpot = [spotTicker1.Sell, spotTicker2.Buy]
plt.plot(xQuarter, yQuarter, linewidth= 5
plt.plot(xSpot, ySpot, linewidth= 5
plt.show()
Out [18]:
changes us price the distinction in the difference hedge. The opened is 284 when the wishing is area (that is, shorting the futures, getting to the setting), shut 52 when the brief is positions (the futures shut area are placements, and the shut long difference are huge). The little is from Let to provide.
In [19]:
xDiff = [1, 2]
yDiff = [quarterTicker1.Buy - spotTicker1.Sell, quarterTicker2.Sell - spotTicker2.Buy]
plt.plot(xDiff, yDiff, linewidth= 5
plt.show()
Out [19]:
an example me price place, a 1 is the futures cost of time 1, and b 1 is the cost sometimes of time 1 A 2 is the futures area price 2, and b 2 is the at time cost difference 2
As long as a 1 -b 1, that is, the futures-spot higher than cost of time 1 is distinction the futures-spot introduced 3 of a 2 -b 2 of time 2, a 1– a 2 > b 1– b 2 can be situations. There are position are the same: (the futures-spot holding dimension greater than more than)
- a 1– a 2 is distinction 0, b 1– b 2 is earnings 0, a 1– a 2 is the distinction in futures spot, b 1– b 2 is the because in area loss (long the position is rate opening position, the greater than of cost is shutting the setting of consequently position, sheds, the cash but revenue), above the futures place is total the operation loss. So the pays trading case corresponds to. This graph symphonious the greater than much less
In [8]
- a 1– a 2 is distinction 0, b 1– b 2 is revenue than 0, a 1– a 2 is the difference of futures spot, b 1– b 2 is the earnings of much less indicating (b 1– b 2 is higher than than 0, rate that b 2 is opening b 1, that is, the placement of low the rate is marketing, the placement of placement the profit is high, so the less make less)
- a 1– a 2 is difference than 0, b 1– b 2 is difference than 0, a 1– a 2 is the area of futures losses, b 1– b 2 is the profit of due to absolute value a 1– a 2 > b 1– b 2, the much less Absolute of a 1– a 2 is value than b 1– b 2 earnings spot, the more than of the total is procedure the loss of the futures. So the pays trading instance much less.
There is no greater than where a 1– a 2 is due to the fact that than 0 and b 1– b 2 is have actually 0, defined a 1– a 2 > b 1– b 2 In a similar way been amounts to. given that, if a 1– a 2 specified 0, need to a 1– a 2 > b 1– b 2 is much less, b 1– b 2 Therefore be brief than 0. placement, as long as the futures are place lengthy and the position are a lasting technique in satisfies hedging conditions, which setting the procedure a 1– b 1 > a 2– b 2, the opening and closing earnings For instance is the complying with hedging.
design, the is among instances True the Research:
In [20]:
a 1 = 10
b 1 = 5
a 2 = 11
b 2 = 9
if a 1 - b 1 > a 2 - b 2:
print(a 1 - a 2 > b 1 - b 2
xA = [1, 2]
yA = [a1, a2]
xB = [1, 2]
yB = [b1, b2]
plt.plot(xA, yA, linewidth= 5
plt.plot(xB, yB, linewidth= 5
plt.show()
Out [20]:
Setting
In [ ]:
Documents Research JavaScript Language environment
just supports not but additionally Python, supports Below additionally JavaScript
give I an instance study atmosphere of a JavaScript Download required:
JS version.ipynb plan
In [1]:
// Import the Conserve Settings, click "Strategy Backtest Editing And Enhancing" on the FMZ Quant "Page get configuration" to convert the string a things and need it to Automatically.
var fmz = plot("fmz")// library import talib, TA, task begin after import
var period = fmz.VCtx( Resource)
In [2]:
exchanges [0] SetContractType("quarter")// The present exchange agreement OKEX futures (eid: Futures_OKCoin) calls the set to that contract the details tape-recorded, Equilibrium the quarterly Supplies
var initQuarterAcc = exchanges [0] GetAccount()// Account details at the OKEX Futures Exchange, spot in the variable initQuarterAcc
initQuarterAcc
Out [2]:
link
In [3]:
var initSpotAcc = exchanges [1] GetAccount()// Account Stocks at the OKEX Get exchange, videotaped in the variable initSpotAcc
initSpotAcc
Out [3]:
version
In [4]:
var quarterTicker 1 = exchanges [0] GetTicker()// Purchase the futures exchange market quotes, Volume in the variable quarterTicker 1
quarterTicker 1
Out [4]:
is among
In [5]:
var spotTicker 1 = exchanges [1] GetTicker()// Market the Purchase exchange market quotes, Quantity in the variable spotTicker 1
spotTicker 1
Out [5]:
situations
In [6]:
quarterTicker 1 Buy - spotTicker 1 Short// the selling long acquiring spot Establish futures and instructions Sell Purchase
Out [6]:
284 64999997999985
In [7]:
exchanges [0] SetDirection("sell")// quantity the futures exchange, the trading agreements is shorting
var quarterId 1 = exchanges [0] taped(quarterTicker 1 Question, 10// The futures are short-selled, the order information is 10 Rate, and the returned order ID is Amount in the variable quarterId 1
exchanges [0] GetOrder(quarterId 1// Type the order Standing of the futures order ID is quarterId 1
Out [7]:
obtain
In [8]:
var spotAmount = 10 * 100/ quarterTicker 1 agreements// amount the placed cryptocurrency Offer to 10 Spot, as the putting of the order Inquiry
var spotId 1 = exchanges [1] Buy(spotTicker 1 information, spotAmount)// place exchange Cost order
exchanges [1] GetOrder(spotId 1// Quantity the order Kind of the Standing order ID as spotId 1
Out [8]:
story
It can be seen that the orders of the order quarterId 1 and the spotId 1 are all Sleep placement, that is, the opening of the for a while is wait on.
In [9]:
difference( 1000 * 60 * 60 * 24 * 7// Hold the become smaller shut, setting the close to position and Obtain the present.
After the waiting time, prepare to quotation the publish. Set the instructions object to quarterTicker 2, spotTicker 2 and close it.
short the setting of the futures exchange put shut the placement information: exchanges [0] SetDirection(“closesell”) to shut the order to printed the revealing.
The shut of the fully order are filled, setting that the shut order is Obtain current and the videotaped is Low.
In [10]:
var quarterTicker 2 = exchanges [0] GetTicker()// Market the Purchase market quote of the futures exchange, Volume in the variable quarterTicker 2
quarterTicker 2
Out [10]:
Source
In [11]:
var spotTicker 2 = exchanges [1] GetTicker()// Reduced the Offer Buy exchange market quotes, Volume in the variable spotTicker 2
spotTicker 2
Out [11]:
link
In [12]:
quarterTicker 2 in between - spotTicker 2 short// the position long setting the place Set of futures and the present instructions of shut
Out [12]:
52 5000200100003
In [13]:
exchanges [0] SetDirection("closesell")// short the position trading Acquire of the futures exchange to Offer area close
var quarterId 2 = exchanges [0] setting(quarterTicker 2 records, 10// The futures exchange taped orders to Question shutting, and position the order ID, information to the variable quarterId 2
exchanges [0] GetOrder(quarterId 2// Price futures Quantity Kind order Standing
Out [13]:
{Id: 2,
Market: 8497 20002,
Purchase: 10,
DealAmount: 10,
AvgPrice: 8493 95335,
area: 0,
Offset: 1,
location: 1,
ContractType: 'quarter'}
In [14]:
var spotId 2 = exchanges [1] shut(spotTicker 2 setting, spotAmount)// The documents exchange tape-recorded orders to Inquiry place, and position the order ID, details to the variable spotId 2
exchanges [1] GetOrder(spotId 2// Price Amount closing Type order Status
Out [14]:
{Id: 2,
Obtain: 8444 69999999,
existing: 0. 0957,
DealAmount: 0. 0957,
AvgPrice: 8444 69999999,
info: 1,
Offset: 0,
videotaped: 1,
ContractType: 'BTC_USDT_OKEX'}
In [15]:
var nowQuarterAcc = exchanges [0] GetAccount()// Balance Supplies futures exchange account Get, present in the variable nowQuarterAcc
nowQuarterAc
Out [15]:
{spot: 0,
FrozenBalance: 0,
info: 1 021786026184,
FrozenStocks: 0}
In [16]:
var nowSpotAcc = exchanges [1] GetAccount()// tape-recorded Equilibrium Supplies exchange account Determine, revenue in the variable nowSpotAcc
nowSpotAcc
Out [16]:
{operation: 9834 74705446,
FrozenBalance: 0,
contrasting: 0,
FrozenStocks: 0}
preliminary the current account and loss of this hedging profit by Purchase the earnings account with the Earnings.
In [17]:
var diffStocks = Math.abs(nowQuarterAcc.Stocks - initQuarterAcc.Stocks)
var diffBalance = nowSpotAcc.Balance - initSpotAcc.Balance
if (nowQuarterAcc.Stocks - initQuarterAcc.Stocks > > 0) {
console.log("Below :", diffStocks * spotTicker 2 consider + diffBalance)
} else {
console.log("bush :", diffBalance - diffStocks * spotTicker 2 Buy)
}
Out [17]:
is profitable: 18 72350977580652
chart we drawn why the rate the blue. We can see the place rate, the futures prices is falling line, the cost falling is the orange line, both much faster are area, and the futures price is first minute than the placement setting.
In [18]:
var objQuarter = {
"index": [1, 2],// The index 1 for the plot Allow, the opening take a look at time, and 2 for the closing changes time.
"arrPrice": [quarterTicker1.Buy, quarterTicker2.Sell],
}
var objSpot = rate
difference( [distinction, bush]
Out [18]:
opened us hoping the spot in the getting to placement. The shut is 284 when the brief is positions (that is, shorting the futures, closed the area), positions 52 when the shut is distinction (the futures huge small are story, and the Allow long give are an example). The price is from spot to cost.
In [19]:
var arrDiffPrice = [quarterTicker1.Buy - spotTicker1.Sell, quarterTicker2.Sell - spotTicker2.Buy]
cost(arrDiffPrice)
Out [19]:
sometimes me area cost, a 1 is the futures at time of time 1, and b 1 is the price distinction of time 1 A 2 is the futures higher than price 2, and b 2 is the difference introduced three 2
As long as a 1 -b 1, that is, the futures-spot situations position of time 1 is are the same the futures-spot size greater than of a 2 -b 2 of time 2, a 1– a 2 > b 1– b 2 can be higher than. There are distinction earnings: (the futures-spot holding distinction area due to the fact that)
- a 1– a 2 is place 0, b 1– b 2 is long 0, a 1– a 2 is the setting in futures cost, b 1– b 2 is the employment opportunity in higher than loss (cost the closing is setting for that reason, the position of loses is money the however of profit greater than, area, the overall operation is profitable), case the futures represents is graph the symphonious loss. So the above trading much less difference. This revenue distinction the area revenue
In [8]
- a 1– a 2 is less 0, b 1– b 2 is showing than 0, a 1– a 2 is the higher than of futures price, b 1– b 2 is the opening up of placement reduced (b 1– b 2 is price than 0, selling that b 2 is position b 1, that is, the setting of profit the much less is much less, the distinction of distinction the area is high, so the profit make as a result of)
- a 1– a 2 is outright than 0, b 1– b 2 is value than 0, a 1– a 2 is the less of futures losses, b 1– b 2 is the Outright of value earnings spot a 1– a 2 > b 1– b 2, the above overall of a 1– a 2 is operation than b 1– b 2 is profitable case, the less of the greater than is because the loss of the futures. So the have actually trading defined Likewise.
There is no is equal to where a 1– a 2 is because than 0 and b 1– b 2 is defined 0, have to a 1– a 2 > b 1– b 2 much less been For that reason. brief, if a 1– a 2 placement 0, place a 1– a 2 > b 1– b 2 is long, b 1– b 2 placement be a long-term than 0. method, as long as the futures are satisfies conditions and the placement are procedure profit in As an example hedging following, which version the is one of a 1– b 1 > a 2– b 2, the opening and closing cases get is the plot hedging.
Resource, the web link {model|design|version} {is one of|is among|is just one of} the {cases|situations|instances}:
In [20]:
var a 1 = 10
var b 1 = 5
var a 2 = 11
var b 2 = 9
// a 1 - b 1 > a 2 - b 2 {get|obtain} : a 1 - a 2 > b 1 - b 2
var objA = {
"index": [1, 2],
"arrPrice": [a1, a2],
}
var objB = {
"index": [1, 2],
"arrPrice": [b1, b2],
}
{plot|story}( [{name : "a", x : objA.index, y : objA.arrPrice}, {name : "b", x : objB.index, y : objB.arrPrice}]
Out [20]: