O recurso está a ser carregado... Carregamento...

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

Commodity “futures and spots” Arbitrage Chart Based on FMZ Fundamental Data

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 on-line, a maioria dos quais são apresentados na forma de tabelas, o que obviamente não é adequado para analisar e julgar o mercado. A plataforma de negociação de futuros de commodities FMZ Quant (FMZ.COM) tem dados fundamentais embutidos, incluindo dados spot e dados spread.

# 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 preços ao instante e preços de spread na forma de gráficos. Primeiro, registre-se e entre no site da FMZ (FMZ.COM), clique em Dashboard e clique em Biblioteca de Estratégia + Nova Estratégia. 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

Commodity “futures and spots” Arbitrage Chart Based on FMZ Fundamental Data Commodity “futures and spots” Arbitrage Chart Based on FMZ Fundamental Data Commodity “futures and spots” Arbitrage Chart Based on FMZ Fundamental Data

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 no quadrado de estratégia da plataforma FMZ (FMZ.COM), podendo ser utilizada diretamente 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.


Relacionado

Mais informações