Anhand der FMZ-Fundamentaldaten ermittelte Kommoditäts-Futures und Spot-Arbitrage-Diagramm

Schriftsteller:Gutes, Erstellt: 2020-06-17 10:59:26, Aktualisiert: 2023-11-01 20:28:10

img

Zusammenfassung

Einige Leute sind vielleicht nicht mit dem Wort arbitrage vertraut, aber arbitrage ist im wirklichen Leben sehr verbreitet. Zum Beispiel kauft der Eigentümer eines Convenience Stores eine Flasche Mineralwasser vom Großhandelsmarkt für 0,5 Yuan, verkauft es dann im Laden für 1 Yuan und verdient schließlich eine Differenz von 0,5 Yuan. Dieser Prozess ähnelt tatsächlich der Arbitrage.

Was ist Arbitrage?

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.

Was ist Futures and spots Arbitrage

Obwohl die obigen Arbitrage-Methoden wörtlich arbitrage sind, sind sie nicht rein Arbitrage. Sie sind im Wesentlichen riskante Spekulationen. Diese Art der Spekulation besteht darin, Gewinn zu erzielen, indem man den Preis-Spread lang oder kurz kauft. Obwohl sich der Spread meistens stabilisiert hat, kann es eine Marktsituation geben, in der der Preis-Spread lange nicht zurückkehrt.

Das Kernprinzip von Futures und Spots-Arbitrage ist, dass die gleiche Ware nur einen Preis zur gleichen Zeit haben kann. Futures werden zu einem Spot, wenn die Lieferzeit erreicht ist, so dass eine Preisrendite gezwungen wird, wenn die Lieferzeit des Vertrages nahe ist. Dies unterscheidet sich völlig von der intertemporalen Arbitrage. Die intertemporalen Arbitrage ist ein Vertrag mit zwei verschiedenen Liefermonaten. Wenn er abläuft, wird er zum Spot von zwei verschiedenen Monaten. Oder es können zwei Preise sein.

  • Die Risikopositionen sind in der Tabelle 060 zu erfassen.

Das größte Merkmal von Futures and Spots Arbitrage ist, dass es in der Theorie kein Risiko gibt, hauptsächlich auf der Grundlage des Spreads des Zustands, um die Gewinnspanne zu berechnen. Wenn der Spread zu groß ist, können Sie den Spot lang halten und die Futures gleichzeitig kurzlegen, warten, bis der Spread auf Null zurückkehrt, können Sie die Position auf beiden Seiten der Futures und des Spot schließen und einen Gewinn aus dem Spread erzielen. Es gibt zwei Hauptmethoden: Double Close Position Arbitrage und Contract Delivery Arbitrage.

Rohstoffe Futures und Spot Arbitrage-Kanal

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.

Erhalt von Spot- und Spread-Daten

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

Umsetzung von Spot- und Spread-Charts

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 Dashboard und klicken Sie auf Strategiebibliothek + Neue Strategie. Wählen Sie Python im Dropdown-Menü in der oberen linken Ecke aus und füllen Sie den Namen der Strategie aus.

Schritt 1: Erstellen des Strategierahmens

# 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:mainDie Funktion ist der Eingang zur Strategie, diemainDie Funktion ist die Vorverarbeitung vor dem Handel, das Programm wird von dermainFunktion, und dann geben Sie den endlosen Loop-Modus, wiederholt ausführen dieonTickFunktion, dieonTickFunktion ist die Hauptfunktion der Strategie, hauptsächlich den Kerncode ausführen.

Schritt 2: Hinzufügen der Diagrammfunktion

# 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.cfgALinks ist ein aktuelles Diagramm mit Futures- und Spotkursen undcfgBAuf 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.

Schritt 3: Erhalten Sie Daten

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.SetContractTypeFunktion, um das Futures-Symbol direkt zu abonnieren und dann dieGetRecordsFür die Preise von Spot und Spread können Sie die zuvor eingeführte Methode verwenden.GetDataFunktion, um den Grunddatencode aufzurufen und die Wörterbuchdaten zurückzugeben, die den Zeitstempel enthalten.

Anzeige des Diagramms

img img img

Holen Sie sich den kompletten Strategiecode.

# 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

Ende

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.


Verwandt

Mehr