Kontrak niaga hadapan berterusan untuk tujuan pengujian balik

Penulis:Kebaikan, Dicipta: 2019-03-18 10:48:28, Dikemas kini:

Gambaran ringkas mengenai kontrak niaga hadapan

Futures adalah bentuk kontrak yang dibuat antara dua pihak untuk membeli atau menjual sejumlah aset asas pada tarikh tertentu di masa depan. Tarikh ini dikenali sebagai penghantaran atau tamat tempoh. Apabila tarikh ini dicapai, pembeli mesti menyerahkan dasar fizikal (atau setara tunai) kepada penjual untuk harga yang dipersetujui pada tarikh pembentukan kontrak.

Dalam amalan, niaga hadapan didagangkan di bursa (berbeza dengan perdagangan Over The Counter - OTC) untuk kuantiti dan kualiti asas yang standard. Harga ditandakan untuk pasaran setiap hari. niaga hadapan sangat cair dan digunakan secara meluas untuk tujuan spekulatif. Walaupun niaga hadapan sering digunakan untuk melindungi harga barangan pertanian atau perindustrian, kontrak niaga hadapan boleh dibentuk pada mana-mana dasar ketara atau tidak ketara seperti indeks saham, kadar faedah nilai pertukaran asing.

Senarai terperinci semua kod simbol yang digunakan untuk kontrak niaga hadapan di pelbagai bursa boleh didapati di laman web CSI Data: Futures Factsheet.

Perbezaan utama antara kontrak niaga hadapan dan pemilikan ekuiti adalah hakikat bahawa kontrak niaga hadapan mempunyai tetingkap ketersediaan yang terhad berdasarkan tarikh tamat tempoh. Pada satu masa akan ada pelbagai kontrak niaga hadapan pada asas yang sama dengan tarikh tamat tempoh yang berbeza. Kontrak dengan tarikh tamat tempoh terdekat dikenali sebagai kontrak dekat. Masalah yang kita hadapi sebagai peniaga kuantitatif adalah bahawa pada bila-bila masa kita mempunyai pilihan beberapa kontrak untuk berdagang. Oleh itu kita berurusan dengan satu set siri masa yang bertindih dan bukan aliran berterusan seperti dalam kes ekuiti atau pertukaran asing.

Matlamat artikel ini adalah untuk menggariskan pelbagai pendekatan untuk membina aliran kontrak yang berterusan dari set siri berbilang ini dan untuk menyoroti pertukaran yang berkaitan dengan setiap teknik.

Membentuk Kontrak Masa Depan Berterusan

Kesukaran utama dengan cuba untuk menjana kontrak berterusan dari kontrak asas dengan penghantaran yang berbeza adalah bahawa kontrak tidak sering berdagang pada harga yang sama. Oleh itu, situasi timbul di mana mereka tidak menyediakan pemasangan yang lancar dari satu ke yang lain. Ini disebabkan oleh kesan contango dan backwardation. Terdapat pelbagai pendekatan untuk menangani masalah ini, yang kita bincangkan sekarang.

Pendekatan Umum

Malangnya tidak ada satu kaedah standard untuk menggabungkan kontrak niaga hadapan bersama-sama dalam industri kewangan. Pada akhirnya kaedah yang dipilih akan bergantung kepada strategi yang menggunakan kontrak dan kaedah pelaksanaan.

Kembali/Ke hadapan (Panama) Penyesuaian

Kaedah ini meringankan jurang di antara pelbagai kontrak dengan mengalihkan setiap kontrak sedemikian rupa sehingga penghantaran individu bergabung dengan cara yang lancar dengan kontrak bersebelahan.

Masalah utama dengan kaedah Panama termasuk pengenalan kecenderungan bias, yang akan memperkenalkan pergeseran harga yang besar. Ini boleh membawa kepada data negatif untuk kontrak yang cukup sejarah. Di samping itu terdapat kehilangan perbezaan harga relatif kerana pergeseran nilai mutlak. Ini bermakna pulangan rumit untuk dikira (atau hanya tidak betul).

Penyesuaian Proporsi

Pendekatan Penyesuaian Proporsionaliti adalah sama dengan metodologi penyesuaian untuk mengendalikan pembahagian stok dalam ekuiti. Daripada mengambil pergeseran mutlak dalam kontrak berturut-turut, nisbah harga penyelesaian (tutup) yang lebih lama dengan harga terbuka yang lebih baru digunakan untuk menyesuaikan harga kontrak sejarah secara proporsional. Ini membolehkan aliran berterusan tanpa gangguan pengiraan pulangan peratusan.

Masalah utama dengan penyesuaian proporsional adalah bahawa mana-mana strategi perdagangan yang bergantung pada tahap harga mutlak juga harus disesuaikan dengan cara yang sama untuk melaksanakan isyarat yang betul. Ini adalah proses yang bermasalah dan terdedah kepada kesilapan. Oleh itu, aliran berterusan jenis ini sering hanya berguna untuk analisis statistik ringkasan, berbanding dengan penyelidikan backtesting langsung.

Rollover/Seri kekal

Intipati pendekatan ini adalah untuk mewujudkan kontrak yang berterusan kontrak berturut-turut dengan mengambil bahagian berat secara linear setiap kontrak dalam beberapa hari untuk memastikan peralihan yang lebih lancar di antara masing-masing.

Sebagai contoh, pertimbangkan lima hari penyelarasan. Harga pada hari 1, P1, sama dengan 80% daripada harga kontrak jauh (F1) dan 20% daripada harga kontrak dekat (N1). Begitu juga, pada hari 2, harga adalah P2=0.6×F2+0.4×N2. Pada hari 5, kita mempunyai P5=0.0×F5+1.0×N5=N5 dan kontrak kemudian hanya menjadi kesinambungan harga dekat. Oleh itu, selepas lima hari kontrak dengan lancar beralih dari jauh ke dekat.

Masalah dengan kaedah rollover adalah bahawa ia memerlukan perdagangan pada semua lima hari, yang boleh meningkatkan kos transaksi.

Terdapat pendekatan lain yang kurang biasa untuk masalah ini tetapi kami akan mengelakkan mereka di sini.

Pembentukan Roll-Return dalam Python dan Panda

Selebihnya artikel akan menumpukan pada pelaksanaan kaedah siri kekal kerana ini adalah yang paling sesuai untuk backtesting.

Kami akan menyambung kontrak niaga hadapan minyak mentah WTI dekat dan jauh (simbol CL) untuk menghasilkan siri harga yang berterusan. Pada masa penulisan (Januari 2014), kontrak dekat adalah CLF2014 (Januari) dan kontrak jauh adalah CLG2014 (Februari).

Untuk menjalankan muat turun data niaga hadapan saya telah menggunakan pemalam Quandl. Pastikan anda menetapkan persekitaran maya Python yang betul pada sistem anda dan memasang pakej Quandl dengan menaip berikut ke terminal:

import datetime
import numpy as np
import pandas as pd
import Quandl

Kerja utama dilakukan dalam fungsi futures_rollover_weights. Ia memerlukan tarikh permulaan (tarikh pertama kontrak berhampiran), kamus tarikh penyelesaian kontrak (tarikh tamat tempoh), simbol kontrak dan bilangan hari untuk membalikkan kontrak (default kepada lima).

def futures_rollover_weights(start_date, expiry_dates, contracts, rollover_days=5):
    """This constructs a pandas DataFrame that contains weights (between 0.0 and 1.0)
    of contract positions to hold in order to carry out a rollover of rollover_days
    prior to the expiration of the earliest contract. The matrix can then be
    'multiplied' with another DataFrame containing the settle prices of each
    contract in order to produce a continuous time series futures contract."""

    # Construct a sequence of dates beginning from the earliest contract start
    # date to the end date of the final contract
    dates = pd.date_range(start_date, expiry_dates[-1], freq='B')

    # Create the 'roll weights' DataFrame that will store the multipliers for
    # each contract (between 0.0 and 1.0)
    roll_weights = pd.DataFrame(np.zeros((len(dates), len(contracts))),
                                index=dates, columns=contracts)
    prev_date = roll_weights.index[0]

    # Loop through each contract and create the specific weightings for
    # each contract depending upon the settlement date and rollover_days
    for i, (item, ex_date) in enumerate(expiry_dates.iteritems()):
        if i < len(expiry_dates) - 1:
            roll_weights.ix[prev_date:ex_date - pd.offsets.BDay(), item] = 1
            roll_rng = pd.date_range(end=ex_date - pd.offsets.BDay(),
                                     periods=rollover_days + 1, freq='B')

            # Create a sequence of roll weights (i.e. [0.0,0.2,...,0.8,1.0]
            # and use these to adjust the weightings of each future
            decay_weights = np.linspace(0, 1, rollover_days + 1)
            roll_weights.ix[roll_rng, item] = 1 - decay_weights
            roll_weights.ix[roll_rng, expiry_dates.index[i+1]] = decay_weights
        else:
            roll_weights.ix[prev_date:, item] = 1
        prev_date = ex_date
    return roll_weights

Sekarang bahawa matriks berat telah dihasilkan, adalah mungkin untuk menerapkan ini kepada siri masa individu. fungsi utama memuat turun kontrak dekat dan jauh, mewujudkan satu DataFrame untuk kedua-dua, membina rollover berat matriks dan kemudian akhirnya menghasilkan siri berterusan kedua-dua harga, dengan betul ditimbang:

if __name__ == "__main__":
    # Download the current Front and Back (near and far) futures contracts
    # for WTI Crude, traded on NYMEX, from Quandl.com. You will need to 
    # adjust the contracts to reflect your current near/far contracts 
    # depending upon the point at which you read this!
    wti_near = Quandl.get("OFDP/FUTURE_CLF2014")
    wti_far = Quandl.get("OFDP/FUTURE_CLG2014")
    wti = pd.DataFrame({'CLF2014': wti_near['Settle'],
                        'CLG2014': wti_far['Settle']}, index=wti_far.index)

    # Create the dictionary of expiry dates for each contract
    expiry_dates = pd.Series({'CLF2014': datetime.datetime(2013, 12, 19),
                              'CLG2014': datetime.datetime(2014, 2, 21)}).order()

    # Obtain the rollover weighting matrix/DataFrame
    weights = futures_rollover_weights(wti_near.index[0], expiry_dates, wti.columns)

    # Construct the continuous future of the WTI CL contracts
    wti_cts = (wti * weights).sum(1).dropna()

    # Output the merged series of contract settle prices
    wti_cts.tail(60)

Keluaran adalah seperti berikut:

2013-10-14 102.230 2013-10-15 101.240 2013-10-16 102.330 2013-10-17 100.620 2013-10-18 100.990 2013-10-21 99.760 2013-10-22 98.470 2013-10-23 97.000 2013-10-24 97.240 2013-10-25 97.950 ... ... 2013-12-24 99.220 2013-12-26 99.550 2013-12-27 100.320 2013-12-30 99.290 2013-12-31 98.420 2014-01-02 95.440 2014-01-03 93.960 2014-01-06 93.430 2014-01-07 93.670 2014-01-08 92.330 Panjang: 60, djenis: terapung64

Ia boleh dilihat bahawa siri ini kini berterusan di kedua-dua kontrak. Langkah seterusnya adalah untuk menjalankan ini untuk beberapa penghantaran di pelbagai tahun, bergantung kepada keperluan backtesting anda.


Lebih lanjut