Komoditas "futures and spots" Arbitrage Chart Berdasarkan Data Fundamental FMZ

Penulis:Kebaikan, Dibuat: 2020-06-17 10:59:26, Diperbarui: 2023-11-01 20:28:10

img

Ringkasan

Beberapa orang mungkin tidak terbiasa dengan kata arbitrage, tetapi arbitrage sangat umum dalam kehidupan nyata. Misalnya, pemilik toko kelontong membeli sebotol air mineral dari pasar grosir seharga 0,5 yuan, kemudian menjualnya di toko seharga 1 yuan, dan akhirnya mendapatkan perbedaan 0,5 yuan. Proses ini sebenarnya mirip dengan arbitrase. Arbitrage di pasar keuangan mirip dengan prinsip ini, kecuali bahwa ada banyak bentuk arbitrase.

Apa itu arbitrase

Di pasar berjangka komoditas, secara teori, harga kontrak Apple yang dikirimkan pada bulan Mei dikurangi harga kontrak Apple yang dikirimkan pada bulan Oktober, hasilnya harus mendekati 0 atau stabil dalam kisaran harga tertentu.

Tapi dalam hal apapun, perbedaan harga akhirnya akan kembali ke kisaran harga tertentu, maka jika perbedaan harga lebih besar dari kisaran ini, jual pendek kontrak Mei, dan beli panjang kontrak Oktober pada saat yang sama, pendek perbedaan untuk membuat keuntungan; jika perbedaan harga kurang dari kisaran ini, membeli kontrak Mei panjang, pada saat yang sama menjual kontrak Oktober pendek, membuat keuntungan dari membeli panjang penyebaran. Ini adalah arbitrage intertemporal melalui pembelian dan penjualan varietas yang sama tetapi bulan pengiriman yang berbeda.

Selain arbitrage intertemporal, ada arbitrage lintas pasar seperti membeli kedelai dari negara-negara pengekspor sambil menjual kedelai dari negara-negara pengimpor, atau menjual kedelai dari negara-negara pengekspor dan mengimpor kedelai dari negara-negara pengimpor; membeli bahan baku hulu, bijih besi, dan menjual hiasan baja hulu, atau menjual bijih besi hulu sambil membeli arbitrage rebar hulu, dll.

Apa itu futures and spots arbitrage

Meskipun metode arbitrage di atas secara harfiah arbitrage, mereka tidak murni arbitrage. mereka pada dasarnya spekulasi berisiko. Cara spekulasi ini adalah untuk menghasilkan keuntungan dengan membeli panjang atau menjual pendek spread harga. Meskipun spread telah stabil untuk sebagian besar waktu, mungkin ada situasi pasar bahwa spread harga tidak kembali untuk waktu yang lama.

Prinsip inti dari futures and spots arbitrage adalah bahwa komoditas yang sama hanya dapat memiliki satu harga pada titik waktu yang sama. Futures akan menjadi spot ketika waktu pengiriman tercapai, sehingga pengembalian harga akan dipaksa ketika waktu pengiriman kontrak dekat. Ini benar-benar berbeda dari arbitrage intertemporal. Arbitrage intertemporal adalah kontrak dengan dua bulan pengiriman yang berbeda. Ketika kedaluwarsa, itu menjadi spot dua bulan yang berbeda. Atau bisa menjadi dua harga.

  • Spread = Harga Futures - Harga Spot

Fitur terbesar dari futures and spots arbitrage adalah bahwa tidak ada risiko secara teori, terutama berdasarkan spread negara untuk menghitung rentang keuntungan. Jika spread terlalu besar, Anda dapat long spot dan short futures pada saat yang sama, menunggu spread kembali ke nol, Anda dapat menutup posisi di kedua sisi futures dan spot, dan mendapatkan keuntungan dari spread. Ada dua metode utama: double close position arbitrage dan contract delivery arbitrage.

Komoditas futures dan spot saluran arbitrase

Dengan kata lain, tautan yang paling rumit adalah perdagangan spot komoditas, yang melibatkan serangkaian masalah seperti kwitansi gudang, perpajakan, dan sebagainya. Pertama-tama, perusahaan yang terkait dengan ruang lingkup investasi diperlukan. Jika itu adalah akun futures arbitrage pengiriman kontrak, itu harus menjadi orang hukum perusahaan. Jika arbitrage posisi dekat ganda diperlukan, saluran penjualan yang andal diperlukan. Ada banyak situs web perdagangan spot online.

Perlu dicatat bahwa transaksi spot biasanya memiliki pajak nilai tambah sebesar 17% hingga 20%, jadi jika ini adalah arbitrage posisi close ganda, Anda perlu short futures 1,2 hingga 1,25 kali setelah membeli spot. Dalam kasus arbitrage pengiriman kontrak, Anda perlu short proporsi yang sama dari futures setelah membeli spot, dan Anda juga perlu mempertimbangkan biaya biaya transaksi, transportasi, dan gudang. Tentu saja, premis dari semua ini adalah bahwa spread harga saat ini cukup besar dan ada batas yang cukup.

Selain itu, karena adanya emas (T + D) di Bursa Emas Shanghai, arbitrage saat ini dalam periode emas tidak hanya bisa menjadi arbitrage positif, tetapi juga operasi reverse arbitrage tanpa leasing emas.

Cara memperoleh data spot dan spread

Ada banyak jenis data spot dan spread online, yang sebagian besar disajikan dalam bentuk tabel, yang jelas tidak cocok untuk menganalisis dan menilai pasar.FMZ.COMHanya perlu memanggil fungsi untuk mendapatkan harga spot dan spread dari setiap varietas, dan mendukung data historis dari 2016 hingga saat ini.

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

Hasil pengembalian

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

Pelaksanaan grafik spot dan spread

Mari kita gunakan platform FMZ untuk mengukur dan mewujudkan harga spot dan harga spread dalam bentuk grafik.FMZ.COM), klik Dashboard, dan klik Strategy Library + New Strategy. Pilih Python di menu drop-down di sudut kiri atas dan isi nama strategi.

Langkah 1: Menulis kerangka strategi

# 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

Kerangka strategi memiliki dua fungsi, yaitu:mainfungsi adalah pintu masuk dari strategi,mainfungsi adalah pra-pengolahan sebelum perdagangan, program akan mulai darimainfungsi, dan kemudian masuk ke mode loop tak terbatas, berulang kali menjalankanonTickFungsi,onTickfungsi adalah fungsi utama dari strategi, terutama mengeksekusi kode inti.

Langkah 2: Menambahkan fungsi grafik

# 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

Dalam strategi ini, total 2 grafik telah dibuat dan disusun berdampingan.cfgAdi sebelah kiri adalah grafik saat ini, termasuk harga futures dan harga spot, dancfgBdi sebelah kanan adalah grafik spread. Kemudian hubungi FMZ platform built-in Python line drawing library untuk membuat objek grafik. Akhirnya data dalam grafik diperbarui secara real time dionTick function.

Langkah 3: Dapatkan data

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

Secara total, kita perlu mendapatkan tiga jenis data: harga berjangka, harga spot, dan harga spread.SetContractTypefungsi untuk langsung berlangganan simbol berjangka, dan kemudian menggunakanGetRecordsUntuk harga spot dan spread, Anda dapat menggunakan metode yang diperkenalkan sebelumnya, menggunakanGetDatafungsi untuk memanggil kode data dasar, dan mengembalikan data kamus yang berisi timestamp.

Tampilan Bagan

img img img

Dapatkan kode strategi lengkap

# 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

Strategi lengkap telah diposting di platform FMZ (FMZ.COM) strategi kotak, dapat digunakan langsung dengan mengklik tautan di bawah ini.

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

Akhir

Arbitrage tidak terlalu rumit seperti yang dibayangkan. Hal ini tidak memerlukan terlalu banyak pengetahuan tentang teori keuangan, juga tidak memerlukan model matematika atau statistik yang terlalu rumit. Arbitrage pada dasarnya adalah untuk membuat keuntungan dari harga yang tidak masuk akal untuk pengembalian yang wajar. Kondisi pasar berubah setiap tahun. Bagi pedagang, yang terbaik adalah tidak menyalin data historis ke masa kini, tetapi untuk menggabungkan data saat ini untuk mempelajari apakah spread harga wajar.


Berkaitan

Lebih banyak