Kontrak berjangka terus menerus untuk tujuan backtesting

Penulis:Kebaikan, Dibuat: 2019-03-18 10:48:28, Diperbarui:

Gambaran Singkat Kontrak Berjangka

Futures adalah bentuk kontrak yang dibuat antara dua pihak untuk membeli atau menjual sejumlah aset dasar pada tanggal tertentu di masa depan. Tanggal ini dikenal sebagai pengiriman atau kedaluwarsa. Ketika tanggal ini tercapai pembeli harus memberikan dasar fisik (atau setara uang tunai) kepada penjual untuk harga yang disepakati pada tanggal pembentukan kontrak.

Dalam praktiknya, futures diperdagangkan di bursa (berbeda dengan Over The Counter - OTC trading) untuk kuantitas dan kualitas dasar yang terstandarisasi. Harga ditandai untuk pasar setiap hari. Futures sangat likuid dan banyak digunakan untuk tujuan spekulatif. Sementara futures sering digunakan untuk melindungi harga barang pertanian atau industri, kontrak futures dapat dibentuk pada dasar yang nyata atau tidak nyata seperti indeks saham, suku bunga nilai tukar asing.

Daftar terperinci dari semua kode simbol yang digunakan untuk kontrak berjangka di berbagai bursa dapat ditemukan di situs CSI Data: Futures Factsheet.

Perbedaan utama antara kontrak berjangka dan kepemilikan ekuitas adalah fakta bahwa kontrak berjangka memiliki jendela ketersediaan yang terbatas berdasarkan tanggal kedaluwarsa. Pada satu saat akan ada berbagai kontrak berjangka pada dasar yang sama semuanya dengan tanggal kedaluwarsa yang bervariasi. Kontrak dengan tanggal kedaluwarsa terdekat dikenal sebagai kontrak dekat. Masalah yang kita hadapi sebagai pedagang kuantitatif adalah bahwa pada setiap titik waktu kita memiliki pilihan dari beberapa kontrak untuk berdagang. Dengan demikian kita berurusan dengan satu set rangkaian waktu yang tumpang tindih daripada aliran berkelanjutan seperti dalam kasus ekuitas atau valuta asing.

Tujuan dari artikel ini adalah untuk menguraikan berbagai pendekatan untuk membangun aliran kontrak berkelanjutan dari serangkaian seri ganda ini dan untuk menyoroti kompromi yang terkait dengan setiap teknik.

Membentuk Kontrak Masa Depan Berkelanjutan

Kesulitan utama dengan mencoba untuk menghasilkan kontrak berkelanjutan dari kontrak yang mendasari dengan pengiriman yang bervariasi adalah bahwa kontrak tidak sering diperdagangkan dengan harga yang sama. Dengan demikian timbul situasi di mana mereka tidak memberikan pemasangan yang mulus dari satu ke yang lain. Ini disebabkan oleh efek contango dan backwardation. Ada berbagai pendekatan untuk mengatasi masalah ini, yang sekarang kita bahas.

Pendekatan Umum

Sayangnya tidak ada satu metode standar untuk bergabung kontrak berjangka bersama-sama dalam industri keuangan. Pada akhirnya metode yang dipilih akan sangat tergantung pada strategi yang menggunakan kontrak dan metode eksekusi.

Kembali/Ke depan (Panama) Penyesuaian

Metode ini meringankan kesenjangan di antara beberapa kontrak dengan mengalihkan setiap kontrak sehingga pengiriman individu bergabung dengan cara yang mulus dengan kontrak yang berdekatan.

Masalah utama dengan metode Panama termasuk pengenalan bias tren, yang akan memperkenalkan pergeseran besar pada harga. Ini dapat menyebabkan data negatif untuk kontrak yang cukup historis. Selain itu ada hilangnya perbedaan harga relatif karena pergeseran nilai absolut. Ini berarti bahwa pengembalian rumit untuk dihitung (atau hanya tidak benar).

Penyesuaian Proporsi

Pendekatan Penyesuaian Proporsionalitas mirip dengan metodologi penyesuaian penanganan pembagian saham dalam ekuitas. Alih-alih mengambil pergeseran mutlak dalam kontrak berturut-turut, rasio harga penyelesaian (tutup) yang lebih tua terhadap harga terbuka yang lebih baru digunakan untuk menyesuaikan harga kontrak historis secara proporsional. Hal ini memungkinkan aliran berkelanjutan tanpa gangguan dalam perhitungan persentase pengembalian.

Masalah utama dengan penyesuaian proporsional adalah bahwa setiap strategi perdagangan yang bergantung pada tingkat harga absolut juga harus disesuaikan dengan cara yang sama untuk mengeksekusi sinyal yang benar. Ini adalah proses yang bermasalah dan rentan terhadap kesalahan.

Rollover/Perpetual Series

Inti dari pendekatan ini adalah untuk menciptakan kontrak berkelanjutan dari kontrak berturut-turut dengan mengambil proporsi tertimbang secara linier dari setiap kontrak selama beberapa hari untuk memastikan transisi yang lebih lancar antara masing-masing.

Sebagai contoh, pertimbangkan lima hari perataan. Harga pada hari 1, P1, sama dengan 80% dari harga kontrak jauh (F1) dan 20% dari harga kontrak dekat (N1). Demikian pula, pada hari 2, harga adalah P2=0.6×F2+0.4×N2. Pada hari 5, kita memiliki P5=0.0×F5+1.0×N5=N5 dan kontrak kemudian hanya menjadi kelanjutan dari harga dekat. Dengan demikian, setelah lima hari kontrak dengan lancar beralih dari jauh ke dekat.

Masalah dengan metode rollover adalah bahwa hal itu membutuhkan perdagangan pada lima hari, yang dapat meningkatkan biaya transaksi.

Ada pendekatan lain yang kurang umum untuk masalah ini tetapi kami akan menghindari mereka di sini.

Formasi Roll-Return di Python dan Panda

Sisa artikel ini akan berkonsentrasi pada penerapan metode seri abadi karena ini paling cocok untuk backtesting.

Kami akan menyambung kontrak berjangka minyak mentah WTI near dan far (simbol CL) untuk menghasilkan rangkaian harga yang berkelanjutan. Pada saat penulisan (Januari 2014), kontrak dekat adalah CLF2014 (Januari) dan kontrak jauh adalah CLG2014 (Februari).

Untuk melakukan unduhan data futures saya telah menggunakan plugin Quandl. Pastikan untuk mengatur lingkungan virtual Python yang benar pada sistem Anda dan menginstal paket Quandl dengan mengetikkan hal berikut ke terminal:

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

Pekerjaan utama dilakukan dalam fungsi futures_rollover_weights. Ini membutuhkan tanggal awal (tanggal pertama kontrak dekat), kamus tanggal penyelesaian kontrak (tanggal kedaluwarsa), simbol kontrak dan jumlah hari untuk membalikkan kontrak (defaulting menjadi lima). Komentar di bawah ini menjelaskan kode:

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 bahwa matriks bobot telah diproduksi, adalah mungkin untuk menerapkan ini untuk seri waktu individu. fungsi utama men-download kontrak dekat dan jauh, menciptakan DataFrame tunggal untuk keduanya, membangun rollover bobot matriks dan kemudian akhirnya menghasilkan serangkaian terus-menerus dari kedua harga, tepat dibobot:

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)

Hasilnya adalah sebagai 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 Aku tidak tahu. Aku tidak tahu. 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: float64

Hal ini dapat dilihat bahwa seri sekarang terus menerus di kedua kontrak. langkah berikutnya adalah untuk melakukan ini untuk beberapa pengiriman di berbagai tahun, tergantung pada kebutuhan backtesting Anda.


Lebih banyak