Komoditi "berjangka dan tempat" Carta Arbitraj Berdasarkan Data Dasar FMZ

Penulis:Kebaikan, Dicipta: 2020-06-17 10:59:26, Dikemas kini: 2023-11-01 20:28:10

img

Ringkasan

Beberapa orang mungkin tidak biasa dengan perkataan arbitrage, tetapi arbitrage sangat biasa dalam kehidupan sebenar. Sebagai contoh, pemilik kedai kemudahan membeli sebotol air mineral dari pasaran borong dengan harga 0.5 yuan, kemudian menjualnya di kedai dengan harga 1 yuan, dan akhirnya memperoleh perbezaan 0.5 yuan. Proses ini sebenarnya serupa dengan arbitrage. Arbitrage di pasaran kewangan adalah serupa dengan prinsip ini, kecuali terdapat banyak bentuk arbitrage.

Apakah arbitrage?

Dalam pasaran niaga hadapan komoditi, secara teori, harga kontrak Apple yang disampaikan pada bulan Mei dikurangkan daripada harga kontrak Apple yang disampaikan pada bulan Oktober, hasilnya harus hampir 0 atau stabil dalam julat harga tertentu. Tetapi sebenarnya, disebabkan oleh cuaca, penawaran dan permintaan pasaran dan faktor lain, harga kontrak jangka pendek dan jangka panjang akan dipengaruhi dalam tahap yang berbeza dalam tempoh masa, dan perbezaan harga juga akan turun naik dengan ketara.

Tetapi dalam apa jua kes, perbezaan harga akhirnya akan kembali ke julat harga tertentu, maka jika perbezaan harga lebih besar daripada julat ini, jual pendek kontrak Mei, dan beli panjang kontrak Oktober pada masa yang sama, pendek perbezaan untuk membuat keuntungan; jika perbezaan harga adalah kurang daripada julat ini, beli panjang kontrak Mei, pada masa yang sama menjual kontrak Oktober pendek, membuat keuntungan membeli panjang penyebaran. Ini adalah arbitraj intertemporal melalui membeli dan menjual pelbagai yang sama tetapi bulan penghantaran yang berbeza.

Selain arbitraj intertemporal, terdapat arbitraj rentas pasaran seperti membeli soya dari negara pengeksport sambil menjual soya dari negara pengimport, atau menjual soya dari negara pengeksport dan mengimport soya dari negara pengimport; membeli bahan mentah hulu, bijih besi, dan menjual benang siap hulu Baja, atau menjual bijih besi bahan mentah hulu sambil membeli arbitraj rebar siap hulu, dan lain-lain.

Apakah masa hadapan dan tempat arbitrage

Walaupun kaedah arbitraj di atas secara harfiah adalah arbitraj, mereka bukan semata-mata arbitraj. mereka pada dasarnya adalah spekulasi berisiko. Cara spekulasi ini adalah untuk membuat keuntungan dengan membeli panjang atau menjual pendek penyebaran harga. Walaupun spread telah stabil untuk kebanyakan masa, mungkin ada situasi pasaran yang penyebaran harga tidak kembali untuk masa yang lama.

Prinsip teras arbitraj futures and spots adalah bahawa komoditi yang sama hanya boleh mempunyai satu harga pada masa yang sama. Futures akan menjadi tempat apabila masa penghantaran dicapai, jadi pulangan harga akan dipaksa apabila masa penghantaran kontrak hampir. Ini sama sekali berbeza dengan arbitraj intertemporal. Arbitraj intertemporal adalah kontrak dengan dua bulan penghantaran yang berbeza. Apabila tamat tempoh, ia menjadi tempat dua bulan yang berbeza. Atau ia boleh menjadi dua harga.

  • Spread = Harga niaga hadapan - Harga spot

Ciri terbesar arbitraj futures and spots adalah bahawa tidak ada risiko secara teori, terutamanya berdasarkan keadaan spread untuk mengira julat keuntungan. Jika spread terlalu besar, anda boleh panjangkan spot dan pendekkan niaga hadapan pada masa yang sama, tunggu sehingga spread kembali kepada sifar, anda boleh menutup kedudukan di kedua-dua sisi niaga hadapan dan spot, dan memperoleh keuntungan dari spread. Terdapat dua kaedah utama: posisi dekat ganda arbitraj dan penghantaran kontrak arbitraj.

Komoditi masa hadapan dan spot saluran arbitrase

Dengan kata lain, pautan yang paling rumit adalah perdagangan spot komoditi, yang melibatkan satu siri isu seperti resit gudang, cukai dan sebagainya. Pertama sekali, syarikat yang berkaitan dengan skop pelaburan diperlukan. Jika ia adalah akaun niaga hadapan arbitraj penghantaran kontrak, ia mestilah orang perundangan korporat. Jika arbitraj kedudukan tertutup berganda diperlukan, saluran jualan yang boleh dipercayai diperlukan. Terdapat banyak laman web perdagangan spot dalam talian.

Perlu diperhatikan bahawa transaksi spot biasanya mempunyai cukai nilai tambah sebanyak 17% hingga 20%, jadi jika ia adalah arbitraj kedudukan tertutup berganda, anda perlu short niaga hadapan 1.2 hingga 1.25 kali selepas membeli spot. Dalam kes arbitraj penghantaran kontrak, anda perlu short proporsi yang sama niaga hadapan selepas membeli spot, dan anda juga perlu mempertimbangkan kos yuran transaksi, pengangkutan, dan gudang.

Di samping itu, kerana adanya emas (T + D) di Bursa Emas Shanghai, arbitraj semasa dalam tempoh emas tidak hanya boleh menjadi arbitraj positif, tetapi juga operasi arbitraj terbalik tanpa sewa emas. Perdagangan ditangguhkan emas spot (T + D) di Bursa Emas Shanghai bukan sahaja mudah untuk berdagang, tetapi juga mempunyai jumlah transaksi dan kedudukan yang besar, dan kecairan sangat sesuai untuk masa depan dan tempat arbitraj.

Bagaimana untuk mendapatkan data spot dan spread

Terdapat banyak jenis data spot dan spread dalam talian, yang kebanyakannya dibentangkan dalam bentuk jadual, yang jelas tidak sesuai untuk menganalisis dan menilai pasaran.FMZ.COMHanya perlu memanggil fungsi untuk mendapatkan harga spot dan penyebaran setiap jenis, dan menyokong data sejarah dari 2016 hingga kini.

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

{
     "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 carta spot dan spread

Mari kita gunakan platform FMZ untuk mengukur dan merealisasikan harga spot dan harga spread dalam bentuk carta.FMZ.COM), klik Dashboard, dan klik Perpustakaan Strategi + Strategi Baru. Pilih Python dalam 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

Rangka strategi mempunyai dua fungsi, iaitumainfungsi adalah pintu masuk kepada strategi,mainfungsi adalah pra-pemprosesan sebelum perdagangan, program ini akan bermula darimainfungsi, dan kemudian masukkan mod gelung tanpa akhir, berulang kali menjalankanonTickfungsi,onTickfungsi adalah fungsi utama strategi, terutamanya melaksanakan kod teras.

Langkah 2: Menambah fungsi carta

# 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, sejumlah 2 carta telah dicipta dan diletakkan bersebelahan.cfgAdi sebelah kiri adalah carta semasa, termasuk harga niaga hadapan dan harga spot, dancfgBpada sebelah kanan adalah carta penyebaran. Kemudian memanggil platform FMZ yang dibina dalam perpustakaan lukisan garis Python untuk membuat objek carta. Akhirnya data dalam carta dikemas kini dalam masa nyata 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 keseluruhan, kita perlu mendapatkan tiga jenis data: harga niaga hadapan, harga spot, dan harga penyebaran.SetContractTypefungsi untuk melanggan secara langsung kepada simbol niaga hadapan, dan kemudian menggunakanGetRecordsUntuk harga spot dan spread, anda boleh menggunakan kaedah yang diperkenalkan sebelum ini, gunakanGetDatafungsi untuk memanggil kod data asas, dan mengembalikan data kamus yang mengandungi timestamp.

Paparan Carta

img img img

Dapatkan kod 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 dipaparkan di platform FMZ (FMZ.COM) strategi kotak, ia boleh digunakan secara langsung dengan mengklik pautan di bawah.

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

Akhir

Arbitraj tidak begitu rumit seperti yang dibayangkan. Ia tidak memerlukan terlalu banyak pengetahuan mengenai teori kewangan, juga tidak memerlukan model matematik atau statistik yang terlalu rumit. Arbitraj pada dasarnya adalah untuk membuat keuntungan dari harga yang tidak munasabah kepada pulangan yang munasabah. Keadaan pasaran berubah setiap tahun. Bagi peniaga, yang terbaik adalah tidak menyalin data sejarah ke masa kini, tetapi menggabungkan data semasa untuk mengkaji sama ada penyebaran harga adalah munasabah.


Berkaitan

Lebih lanjut