Algumas pessoas podem não estar familiarizadas com a palavra
No mercado de futuros de commodities, em teoria, o preço do contrato da Apple entregue em maio menos o preço do contrato da Apple entregue em outubro, o resultado deve ser próximo de 0 ou estável dentro de uma certa faixa de preços.
Mas, em qualquer caso, a diferença de preço irá eventualmente retornar a uma certa faixa de preços, então, se a diferença de preço for maior do que esta faixa, venda curta o contrato de maio, e comprar longo o contrato de outubro ao mesmo tempo, curto a diferença para fazer um lucro; se a diferença de preço é menor do que esta faixa, comprar longo contrato de maio, ao mesmo tempo vender curto contrato de outubro, fazer um lucro de comprar longo o spread.
Além da arbitragem intertemporal, existem arbitragens entre os mercados, tais como a compra de soja dos países exportadores enquanto vendem soja dos países importadores, ou a venda de soja dos países exportadores e a importação de soja dos países importadores; a compra de matérias-primas a montante, minério de ferro e a venda de fio acabado a jusante do aço, ou a venda da matéria-prima a montante do minério de ferro enquanto compram arbitragem de barras de reforço acabadas a jusante, etc.
Embora os métodos de arbitragem acima sejam literalmente
O princípio básico da arbitragem
A maior característica da arbitragem de
Para simplificar, o link mais complicado é a negociação spot de commodities, que envolve uma série de questões como recibos de armazém, tributação e assim por diante. Em primeiro lugar, uma empresa relacionada ao escopo do investimento é necessária. Se for uma conta de futuros de arbitragem de entrega de contrato, deve ser uma pessoa jurídica corporativa. Se for necessária arbitragem de posição dupla, é necessário um canal de vendas confiável.
Deve-se notar que as transações spot geralmente têm um imposto sobre o valor agregado de 17% a 20%, por isso, se for uma arbitragem de posição fechada dupla, você precisa curto de futuros 1,2 a 1,25 vezes após a compra de spot. No caso da arbitragem de entrega de contrato, você precisa curto da mesma proporção de futuros após a compra do local, e você também precisa considerar os custos de taxas de transação, transporte e armazéns.
Além disso, devido à existência de ouro (T + D) na Bolsa de Ouro de Xangai, a atual arbitragem no período do ouro não só pode ser arbitragem positiva, mas também operações de arbitragem reversa sem leasing de ouro.
Existem muitos tipos de dados spot e spread online, a maioria dos quais são apresentados sob a forma de tabelas, o que obviamente não é adequado para analisar e julgar o mercado.FMZ.COMA função "Spread" é uma função que permite obter o preço do spot e do spread de cada variedade e suportar dados históricos de 2016 até o presente.
# Backtest configuration
'''backtest
start: 2020-06-01 00:00:00
end: 2020-06-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''
# Strategy entry
def main():
while True:
ret = exchange.GetData("GDP") # Calling GDP data
Log(ret) # Print data
Sleep(1000 * 60 * 60 * 24 * 30)
Retorno do resultado
{
"Quarterly": "Q1 2006",
"GDP": {
"Absolute Value (100 million yuan)": 47078.9,
"YoY Growth": 0.125
},
"primary industry": {
"Absolute Value (100 million yuan)": 3012.7,
"YoY Growth": 0.044
},
"Tertiary Industry": {
"Absolute Value (100 million yuan)": 22647.4,
"YoY Growth": 0.131
},
"Secondary industry": {
"Absolute Value (100 million yuan)": 21418.7,
"YoY Growth": 0.131
}
}
Vamos usar a plataforma FMZ para quantificar e realizar os preços spot e os preços spread na forma de gráficos.FMZ.COM), clique em
# Strategy main function
def onTick():
pass
# Strategy entrance
def main():
while True: # Enter loop mode
onTick() # execution strategy main function
Sleep(1000 * 60 * 60 * 24) # Strategy sleep for one day
O quadro estratégico tem duas funções:main
A função é a entrada da estratégia, amain
A função é o pré-processamento antes da negociação, o programa vai começar a partir domain
função, e, em seguida, entrar no modo de loop infinito, executar repetidamente oonTick
Função, oonTick
Função é a função principal da estratégia, principalmente executar o código do núcleo.
# Global variables
# Futures and Spots chart
cfgA = {
"extension": {
"layout":'single',
"col": 6,
"height": "500px",
},
"title": {
"text": "futures and spots chart"
},
"xAxis": {
"type": "datetime"
},
"series": [{
"name": "Futures Price",
"data": [],
}, {
"name": "Spot Price",
"data": [],
}
]
}
# Spread chart
cfgB = {
"extension": {
"layout":'single',
"col": 6,
"height": "500px",
},
"title": {
"text": "Spread chart"
},
"xAxis": {
"type": "datetime"
},
"series": [{
"name": "Spread Price",
"data": [],
}]
}
chart = Chart([cfgA, cfgB]) # Create a chart object
# Strategy main function
def onTick():
chart.add(0, []) # draw chart
chart.add(1, []) # draw chart
chart.add(2, []) # draw chart
chart.update([cfgA, cfgB]) # update chart
# Strategy entrance
def main():
LogReset() # Clear the previous log information before running
chart.reset() # Clear the previous chart information before running
while True: # Enter loop mode
onTick() # execution strategy main function
Sleep(1000 * 60 * 60 * 24) # Strategy sleep for one day
Nesta estratégia, foram criados um total de 2 gráficos que estão dispostos lado a lado.cfgA
à esquerda, um gráfico atual, incluindo os preços dos futuros e os preços ao instante, ecfgB
Em seguida, ligue para a biblioteca de desenho de linha em Python da plataforma FMZ para criar um objeto de gráfico.onTick
function.
last_spot_price = 0 # Save the last valid spot price
last_spread_price = 0 # Save the last valid spread price
def onTick():
global last_spread_price, last_spot_price # import global variables
exchange.SetContractType("i888") # Subscribe to futures varieties
futures = _C(exchange.GetRecords)[-1] # Get the latest K line data
futures_ts = futures.Time # Get the latest K-line futures timestamp
futures_price = futures.Close # Get the latest K-line closing price
spot = exchange.GetData("SPOTPRICE") # Get spot data
spot_ts = spot.Time # Get spot timestamp
if 'iron ore' in spot.Data:
spot_price = spot.Data['iron ore']
last_spot_price = spot_price
else:
spot_price = last_spot_price
spread = exchange.GetData("spread") # Get spread data
spread_ts = spread.Time # Get spread timestamp
if 'iron ore' in spread.Data:
spread_price = spread.Data['iron ore']
last_spread_price = spread_price
else:
spread_price = last_spread_price
No total, precisamos obter três tipos de dados: preço de futuros, preço spot e preço de spread.SetContractType
A função para subscrever diretamente o símbolo de futuros e, em seguida, usar oGetRecords
Para os preços do ponto e do spread, pode utilizar o método introduzido anteriormente, utilizar oGetData
função para chamar o código de dados fundamentais, e retornar os dados do dicionário que contém o carimbo horário.
# fmz@b72930603791887d7452f25f23a13bde
'''backtest
start: 2017-01-01 00:00:00
end: 2020-06-01 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''
# Global variables
# Futures and Spots chart
cfgA = {
"extension": {
"layout":'single',
"col": 6,
"height": "500px",
},
"title": {
"text": "futures and spots chart"
},
"xAxis": {
"type": "datetime"
},
"series": [{
"name": "Futures Price",
"data": [],
}, {
"name": "Spot Price",
"data": [],
}
]
}
# spread chart
cfgB = {
"extension": {
"layout":'single',
"col": 6,
"height": "500px",
},
"title": {
"text": "spread chart"
},
"xAxis": {
"type": "datetime"
},
"series": [{
"name": "spread Price",
"data": [],
}]
}
last_spot_price = 0 # Save the last valid spot price
last_spread_price = 0 # Save the last valid spread price
chart = Chart([cfgA, cfgB]) # Create a chart object
def onTick():
global last_spread_price, last_spot_price # import global variables
exchange.SetContractType("i888") # Subscribe to futures varieties
futures = _C(exchange.GetRecords)[-1] # Get the latest candlestick data
futures_ts = futures.Time # Get the latest K-line futures timestamp
futures_price = futures.Close # Get the latest K-line closing price
Log('Future price:', futures_ts, futures_price)
spot = exchange.GetData("SPOTPRICE") # Get spot data
spot_ts = spot.Time # Get spot timestamp
if 'iron ore' in spot.Data:
spot_price = spot.Data['iron ore']
last_spot_price = spot_price
else:
spot_price = last_spot_price
Log('Spot price:', spot_ts, spot_price)
spread = exchange.GetData("spread") # Get spread data
spread_ts = spread.Time # Get spread timestamp
if 'iron ore' in spread.Data:
spread_price = spread.Data['iron ore']
last_spread_price = spread_price
else:
spread_price = last_spread_price
Log('spread price:', spread_ts, spread_price)
chart.add(0, [futures_ts, futures_price]) # draw chart
chart.add(1, [spot_ts, spot_price]) # draw chart
chart.add(2, [spread_ts, spread_price]) # draw chart
chart.update([cfgA, cfgB]) # update chart
Log('---------')
# Strategy entrance
def main():
LogReset() # Clear the previous log information before running
chart.reset() # Clear the previous chart information before running
while True: # Enter loop mode
onTick() # execution strategy main function
Sleep(1000 * 60 * 60 * 24) # Strategy sleep for one day
A estratégia completa foi publicada na plataforma FMZ (FMZ.COM) estratégia, pode ser utilizado directamente clicando no link abaixo.
https://www.fmz.com/strategy/211941
A arbitragem não é tão complicada quanto imaginado. Não requer muito conhecimento de teoria financeira, nem requer modelos matemáticos ou estatísticos muito complicados. A arbitragem é essencialmente para obter lucro de um preço irracional para um retorno razoável. As condições do mercado mudam a cada ano. Para os comerciantes, é melhor não copiar dados históricos para o presente, mas combinar os dados atuais para estudar se o spread de preço é razoável.