Таблица арбитража товарных фьючерсов и спотов на основе фундаментальных данных FMZ

Автор:Доброта, Создано: 2020-06-17 10:59:26, Обновлено: 2023-11-01 20:28:10

img

Резюме

Некоторые люди могут быть не знакомы со словом арбитраж, но арбитраж очень распространен в реальной жизни. Например, владелец удобного магазина покупает бутылку минеральной воды с оптового рынка за 0,5 юана, затем продает ее в магазине за 1 юань, и, наконец, зарабатывает разницу в 0,5 юана. Этот процесс на самом деле похож на арбитраж. Арбитраж на финансовых рынках похож на этот принцип, за исключением того, что существует много форм арбитража.

Что такое арбитраж

На рынке товарных фьючерсов, теоретически, цена контракта Apple, поставленного в мае минус цена контракта Apple, поставленного в октябре, должна быть близкой к нулю или стабильной в пределах определенного ценового диапазона.

Но в любом случае, разница в цене в конечном итоге вернется к определенному диапазону цен, тогда, если разница в цене больше этого диапазона, продать короткий майский контракт, и купить длинный октябрьский контракт в то же время, короткий разницу, чтобы получить прибыль; если разница в цене меньше этого диапазона, купить длинный майский контракт, в то же время продать короткий октябрьский контракт, получить прибыль от покупки длинного спреда. Это межвременный арбитраж путем покупки и продажи одного и того же сорта, но разных месяцев доставки.

Кроме межвременного арбитража, существует межрыночный арбитраж, такой как покупка сои из стран-экспортеров при продаже сои из стран-импортеров, или продажа сои из стран-экспортеров и импорт сои из стран-импортеров; покупка сырья, железной руды вверх по течению и продажа готовой нитки вниз по течению Сталь, или продажа сырья вверх по течению железной руды при покупке арбитража готовой арматуры вниз по течению и т.д.

Что такое фьючерсы и споты арбитраж

Хотя вышеуказанные методы арбитража буквально арбитраж, они не являются чисто арбитражом. они по сути являются рискованными спекуляциями. Этот способ спекуляции заключается в получении прибыли путем покупки длинных или продажи коротких спредов цены. Хотя спред стабилизировался в течение большей части времени, может возникнуть ситуация на рынке, когда спред цены не возвращается в течение длительного времени.

Основной принцип арбитража фьючерсов и спотов заключается в том, что один и тот же товар может иметь только одну цену в один и тот же момент времени. Фьючерсы станут местом, когда время доставки достигнуто, поэтому возврат цены будет вынужден, когда время доставки контракта близко. Это совершенно отличается от межвременного арбитража. Интервременный арбитраж - это контракт с двумя разными месяцами доставки. Когда он истекает, он становится местом двух разных месяцев.

  • Спрод = цена фьючерсов - цена спота

Самая большая особенность арбитража фьючерсов и спотов заключается в том, что в теории нет риска, в основном основываясь на состоянии спрэда для расчета диапазона прибыли. Если спред слишком большой, вы можете одновременно длиться на споте и коротко продавать фьючерсы, ждать, пока спред вернется к нулю, вы можете закрыть позицию по обе стороны фьючерсов и спота и получить прибыль от спрэда. Существует два основных метода: двойная закрытая позиция арбитраж и доставка контракта арбитраж.

Рыночные фьючерсы и споты арбитражный канал

Проще говоря, наиболее сложным звеном является спотовая торговля товарами, которая включает в себя ряд вопросов, таких как складские квитанции, налогообложение и так далее. Прежде всего, нужна компания, связанная с объемом инвестиций. Если это фьючерсный счет арбитража доставки контрактов, это должно быть юридическое лицо. Если необходима двойная арбитража закрытых позиций, необходим надежный канал продаж. Существует много веб-сайтов спотовой торговли в Интернете.

Следует отметить, что спотовые сделки обычно имеют налог на добавленную стоимость от 17% до 20%, поэтому если это двойной арбитраж закрытой позиции, вам нужно коротко фьючерсы от 1,2 до 1,25 раз после покупки спота. В случае арбитража контракта доставки, вам нужно коротко столько же фьючерсов после покупки спота, и вы также должны учитывать расходы на сборы за транзакции, транспортировку и склады. Конечно, предпосылкой всего этого является то, что текущий спред цен достаточно велик и есть достаточно границ.

Кроме того, из-за наличия золота (T + D) на Шанхайской золотой бирже текущий арбитраж в золотое время может быть не только положительным арбитражем, но и операцией обратного арбитража без лизинга золота.

Как получить данные о спотовых и спредах

В Интернете существует множество типов спотовых и спредовых данных, большинство из которых представлены в виде таблиц, которые, очевидно, не подходят для анализа и оценки рынка.FMZ.COMДля получения оптовой цены на товарные фьючерсы (SPD) используются фундаментальные данные, включая данные спота и данные спреда.

# 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)

Возврат результата

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

Внедрение спотовых и спредовых графиков

Давайте воспользуемся платформой FMZ для количественного определения и реализации спотовых цен и спредов в виде графиков.FMZ.COM), нажмите Dashboard и нажмите Strategy Library + New Strategy. Выберите Python в выпадающем меню в левом верхнем углу и введите название стратегии.

Шаг 1: Составление стратегии

# 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

Стратегическая рамка имеет две функции:mainФункция является входом в стратегию,mainФункция - это предварительная обработка перед торговлей, программа начнет сmainфункция, а затем ввести бесконечный режим петли, неоднократно выполнятьonTickФункция,onTickФункция - это основная функция стратегии. В основном выполнять основной код.

Шаг 2: Добавление функции графика

# 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

В рамках этой стратегии созданы в общей сложности 2 диаграммы, расположенные бок о бок.cfgAслева - текущий график, включающий цены на фьючерсы и спотовые цены, иcfgBНа правой стороне расположен диаграмма распространения. Затем вызвать платформу FMZ встроенный в Python библиотека чертежей линий для создания объекта диаграмма. Наконец, данные в диаграмме обновляются в режиме реального времени вonTick function.

Шаг 3: Получить данные

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

В общей сложности, нам нужно получить три вида данных: цена фьючерса, спотовая цена и цена спреда.SetContractTypeФункция для прямого подписки на символ фьючерса, а затем использоватьGetRecordsДля цен спота и спреда вы можете использовать метод, представленный ранее, использоватьGetDataФункция для вызова кода основных данных и возвращения словарных данных, содержащих часовую метку.

Дисплей диаграммы

img img img

Получите полный код стратегии

# 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

Полная стратегия опубликована на платформе FMZ (FMZ.COM) можно использовать непосредственно по ссылке ниже.

https://www.fmz.com/strategy/211941

Конец

Арбитраж не так сложен, как представляется. Он не требует слишком больших знаний финансовой теории, а также не требует слишком сложных математических или статистических моделей. Арбитраж по существу заключается в получении прибыли от необоснованной цены до разумной доходности. Условия рынка меняются каждый год. Для трейдеров лучше не копировать исторические данные в настоящее время, а комбинировать текущие данные, чтобы изучить, является ли спред цен разумным.


Связанные

Больше