Einige Leute sind vielleicht nicht mit dem Wort
Auf dem Rohstoff-Futures-Markt sollte der Preis des im Mai gelieferten Apple-Kontrakts minus der im Oktober gelieferten Apple-Kontraktpreis theoretisch nahe bei 0 oder innerhalb einer bestimmten Preisklasse stabil sein.
Aber in jedem Fall wird die Preisdifferenz schließlich zu einer bestimmten Preisspanne zurückkehren, dann, wenn die Preisdifferenz größer ist als diese Bandbreite, verkaufen Sie kurz den Mai-Kontrakt und kaufen Sie lang den Oktober-Kontrakt zur gleichen Zeit, kurz die Differenz, um einen Gewinn zu erzielen; wenn die Preisdifferenz kleiner ist als diese Bandbreite, kaufen Sie langen Mai-Kontrakt, verkaufen Sie gleichzeitig kurzen Oktober-Kontrakt, machen Sie einen Gewinn, indem Sie langen Spread kaufen. Dies ist die intertemporale Arbitrage durch Kauf und Verkauf der gleichen Vielfalt, aber verschiedene Liefermonate.
Neben der zeitlichen Arbitrage gibt es auch marktübergreifende Arbitrage wie den Kauf von Sojabohnen aus Ausfuhrländern, während Sojabohnen aus Einfuhrländern verkauft werden, oder den Verkauf von Sojabohnen aus Ausfuhrländern und der Einfuhr von Sojabohnen aus Einfuhrländern; den Kauf von Rohstoffen, Eisenerz und den Verkauf von Fertigdraht nachgelagerten Stahls oder den Verkauf des Rohstoffs Eisenerz nachgelagerten Rohstoffs, während der Kauf von Fertigstahlarbitrage nachgelagerten Stahls usw.
Obwohl die obigen Arbitrage-Methoden wörtlich
Das Kernprinzip von
Das größte Merkmal von
Um es einfach auszudrücken, ist der komplizierteste Zusammenhang der Spothandel mit Rohstoffen, der eine Reihe von Problemen wie Lagerquittungen, Besteuerung usw. beinhaltet. Zunächst einmal ist ein Unternehmen erforderlich, das mit dem Investitionsumfang zusammenhängt. Wenn es sich um ein Contract Delivery-Arbitrage-Futures-Konto handelt, muss es eine juristische Person sein.
Es sollte beachtet werden, dass Spot-Transaktionen in der Regel eine Mehrwertsteuer von 17% bis 20% haben, also wenn es sich um eine doppelte Schließposition Arbitrage handelt, müssen Sie Futures 1,2 bis 1,25 Mal nach dem Kauf von Spot kurzlegen. Im Falle von Contract Delivery Arbitrage müssen Sie den gleichen Anteil an Futures nach dem Kauf des Spot kurzlegen und müssen auch die Kosten für Transaktionsgebühren, Transport und Lager berücksichtigen.
Darüber hinaus kann aufgrund der Existenz von Gold (T + D) an der Shanghai Gold Exchange die aktuelle Arbitrage in der Goldperiode nicht nur eine positive Arbitrage sein, sondern auch umgekehrte Arbitrage-Operationen ohne Goldleasing.
Es gibt viele Arten von Spot- und Spread-Daten online, von denen die meisten in Form von Tabellen dargestellt werden, die offensichtlich nicht geeignet sind, um den Markt zu analysieren und zu beurteilen.FMZ.COM) hat integrierte Rohstoff-Futures-Fundamentaldaten, einschließlich Spot-Daten und Spread-Daten.
# 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)
Ergebnis zurück
{
"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
}
}
Lassen Sie uns die FMZ-Plattform nutzen, um Spot- und Spread-Preise in Form von Charts zu quantifizieren und zu realisieren.FMZ.COM), klicken Sie auf
# 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
Der Strategie-Rahmen hat zwei Funktionen:main
Die Funktion ist der Eingang zur Strategie, diemain
Die Funktion ist die Vorverarbeitung vor dem Handel, das Programm wird von dermain
Funktion, und dann geben Sie den endlosen Loop-Modus, wiederholt ausführen dieonTick
Funktion, dieonTick
Funktion ist die Hauptfunktion der Strategie, hauptsächlich den Kerncode ausführen.
# 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
In dieser Strategie wurden insgesamt 2 Diagramme erstellt, die nebeneinander angeordnet sind.cfgA
Links ist ein aktuelles Diagramm mit Futures- und Spotkursen undcfgB
Auf der rechten Seite befindet sich ein Spread-Chart. Dann rufen Sie die FMZ-Plattform, die integrierte Python-Linienzeichnungsbibliothek, an, um ein Chartobjekt zu erstellen.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
Wir müssen insgesamt drei Arten von Daten erhalten: Futures-Preis, Spot-Preis und Spread-Preis.SetContractType
Funktion, um das Futures-Symbol direkt zu abonnieren und dann dieGetRecords
Für die Preise von Spot und Spread können Sie die zuvor eingeführte Methode verwenden.GetData
Funktion, um den Grunddatencode aufzurufen und die Wörterbuchdaten zurückzugeben, die den Zeitstempel enthalten.
# 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
Die vollständige Strategie wurde auf der FMZ-Plattform veröffentlicht (FMZ.COM) Strategie-Feld, kann direkt über den folgenden Link genutzt werden.
https://www.fmz.com/strategy/211941
Arbitrage ist nicht so kompliziert, wie man sich vorstellt. Es erfordert nicht zu viel Kenntnisse der Finanztheorie, noch erfordert es zu komplizierte mathematische oder statistische Modelle. Arbitrage ist im Wesentlichen, um einen Gewinn von einem unzumutbaren Preis zu einer angemessenen Rendite zu machen. Die Marktbedingungen ändern sich jedes Jahr. Für Händler ist es am besten, historische Daten nicht in die Gegenwart zu kopieren, sondern die aktuellen Daten zu kombinieren, um zu untersuchen, ob der Preis-Spread angemessen ist.