Gráfico de arbitragem de commodities "futures and spots" Baseado em dados fundamentais da FMZ

Autora:Bem-estar, Criado: 2020-06-17 10:59:26, Atualizado: 2023-11-01 20:28:10

img

Resumo

Algumas pessoas podem não estar familiarizadas com a palavra arbitrage, mas arbitrage é muito comum na vida real. Por exemplo, o proprietário de uma loja de conveniência compra uma garrafa de água mineral no mercado atacadista por 0,5 yuan, depois a vende na loja por 1 yuan e finalmente ganha uma diferença de 0,5 yuan. Este processo é na verdade semelhante à arbitragem. A arbitragem nos mercados financeiros é semelhante a este princípio, exceto que há muitas formas de arbitragem.

O que é arbitragem

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.

O que é futures and spots arbitragem

Embora os métodos de arbitragem acima sejam literalmente arbitragem, eles não são puramente arbitragem. eles são essencialmente especulações de risco. Esta forma de especulação é fazer lucro comprando longo ou vendendo curto os spreads de preço. Embora o spread tenha se estabilizado na maior parte do tempo, pode haver uma situação de mercado em que o spread de preço não retorne por um longo tempo.

O princípio básico da arbitragem futures and spots é que a mesma mercadoria só pode ter um preço no mesmo momento. Os futuros se tornarão um ponto quando o tempo de entrega for atingido, então um retorno de preço será forçado quando o tempo de entrega do contrato estiver próximo. Isso é completamente diferente da arbitragem intertemporal. A arbitragem intertemporal é um contrato com dois meses de entrega diferentes. Quando expira, torna-se o ponto de dois meses diferentes. Ou pode ser dois preços.

  • Preço do contrato de crédito com prazo de vencimento

A maior característica da arbitragem de futures and spots é que não há risco em teoria, principalmente com base no spread do estado para calcular a faixa de lucro. Se o spread for muito grande, você pode longar o spot e curtir os futuros ao mesmo tempo, esperar que o spread retorne a zero, você pode fechar a posição em ambos os lados dos futuros e spot, e ganhar lucro com o spread.

Mercadorias futures e spot canal de arbitragem

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.

Como obter dados spot e spread

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
     }
}

Implementação de gráficos spot e spread

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 Dashboard e clique em Strategy Library + New Strategy. Selecione Python no menu suspenso no canto superior esquerdo e preencha o nome da estratégia.

Passo 1: Escrever o quadro estratégico

# 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:mainA função é a entrada da estratégia, amainA função é o pré-processamento antes da negociação, o programa vai começar a partir domainfunção, e, em seguida, entrar no modo de loop infinito, executar repetidamente oonTickFunção, oonTickFunção é a função principal da estratégia, principalmente executar o código do núcleo.

Passo 2: Adicionar função de gráfico

# 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, ecfgBEm seguida, ligue para a biblioteca de desenho de linha em Python da plataforma FMZ para criar um objeto de gráfico.onTick function.

Passo 3: Obter dados

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.SetContractTypeA função para subscrever diretamente o símbolo de futuros e, em seguida, usar oGetRecordsPara os preços do ponto e do spread, pode utilizar o método introduzido anteriormente, utilizar oGetDatafunção para chamar o código de dados fundamentais, e retornar os dados do dicionário que contém o carimbo horário.

Exibição do gráfico

img img img

Obter o código completo da estratégia

# 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

Fim

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.


Relacionados

Mais.