Некоторые люди могут быть не знакомы со словом
На рынке товарных фьючерсов, теоретически, цена контракта 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), нажмите
# 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
Функция - это основная функция стратегии. В основном выполнять основной код.
# 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.
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
Функция для вызова кода основных данных и возвращения словарных данных, содержащих часовую метку.
# 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
Арбитраж не так сложен, как представляется. Он не требует слишком больших знаний финансовой теории, а также не требует слишком сложных математических или статистических моделей. Арбитраж по существу заключается в получении прибыли от необоснованной цены до разумной доходности. Условия рынка меняются каждый год. Для трейдеров лучше не копировать исторические данные в настоящее время, а комбинировать текущие данные, чтобы изучить, является ли спред цен разумным.