
Para editor portal QuantStart menulis
materi tentang apa yang harus Anda ketahui ketika Anda mulai mengembangkan sistem Anda sendiri untuk menguji strategi perdagangan. Kami membahas beberapa masalah yang diangkat dalam artikel sebelumnya di blog, jadi kali ini kami menyiapkan pencabutan ulang yang disesuaikan dari tesis tentang masalah apa yang dihadapi pengembang, apa perbedaan antara backtests dari berbagai jenis, dan apa pro dan kontra mereka.
Apa itu Backtester?
Backtest adalah penerapan aturan strategi perdagangan untuk sekumpulan data historis tentang harga instrumen keuangan. Inti dari pendekatan ini adalah bahwa jika kita mengembangkan mekanisme untuk menentukan saat memasuki dan keluar dari suatu posisi (beli / jual), misalnya, saham dari portofolio tertentu, dan menerapkan aturan yang dihasilkan pada data historis, ini akan memberikan gambaran tentang produktivitas strategi perdagangan “di masa lalu ".
Seseorang pernah berkata bahwa "semua model salah, tetapi ada yang berguna." Ungkapan ini bagus untuk pengujian ulang. Sistem untuk pengujian historis dari strategi keuangan membantu menentukan apakah layak menerapkan seperangkat aturan yang ada pada perdagangan nyata. Jika kita tahu bagaimana sebuah strategi dapat berperilaku di masa lalu, itu akan membantu menyaring strategi yang buruk tanpa perlu kerugian finansial yang nyata.
Masalahnya adalah bahwa hasil backtesting tidak ada hubungannya dengan hasil perdagangan nyata di bursa. Ini hanya model realitas. Model yang sering mengandung banyak asumsi.
Ada dua jenis utama backtester - for-loop dan event-driven.
Ketika mengembangkan sistem seperti itu, selalu ada kebutuhan untuk kompromi antara akurasi dan kompleksitas implementasi. Kedua jenis backtester ini mewakili berbagai pilihan untuk kompromi semacam itu.
Tantangan Backtesting
Menguji data historis membawa banyak kesulitan. Semuanya terhubung dengan fakta bahwa keseluruhan proses hanyalah simulasi dari kenyataan. Berikut ini beberapa di antaranya:
- Pengujian dalam sampel - masalah muncul saat menggunakan data yang sama untuk model perdagangan pelatihan dan untuk pengujian lebih lanjut. Dalam hal ini, produktivitas yang ditunjukkan terdepresiasi secara signifikan - karena hasilnya dicapai pada sistem data yang diketahui sebelumnya. Pada kenyataannya, data yang paling sering akan berbeda secara signifikan dari pelatihan. Sebenarnya, ini adalah bentuk pelatihan ulang.
- Kesalahan Survivor - indeks saham (misalnya, S & P500) ditandai dengan proses pencatatan dan penghapusan pencatatan ketika saham tertentu dan instrumen keuangan muncul atau dikeluarkan dari mereka. Jika perubahan ini tidak diperhitungkan selama pengujian ulang, maka strategi yang tidak memperhitungkan saham perusahaan yang dikeluarkan dari indeks karena kapitalisasi rendah dapat dianggap berhasil. Untuk menghindari masalah seperti itu, saat menjalankan tes ulang dalam periode waktu yang lama, Anda perlu menggunakan data yang tidak tunduk pada kesalahan survivor.
- Kesalahan prediksi (bias lihat-depan) - data dari masa depan juga dapat mempengaruhi hasil backtest. Sebagai contoh, perhatikan kasus ketika indeks regresi linier dihitung pada interval waktu tertentu. Jika indikator ini kemudian digunakan dalam sampel yang sama, ternyata data dari masa depan menembus ke dalamnya, yang berarti bahwa produktivitas strategi yang dihasilkan terdepresiasi secara signifikan. Backtester yang berorientasi pada peristiwa membantu menyelesaikan masalah ini.
- Perubahan dalam kondisi pasar - parameter pasar keuangan tidak stasioner. Ini berarti bahwa proses yang menghasilkan pergerakan harga saham tidak bergantung pada parameter yang konstan dari waktu ke waktu. Fakta ini menyulitkan generalisasi model parameter (banyak strategi perdagangan adalah kasus khusus dari strategi tersebut), yang mengarah pada fakta bahwa efektivitas strategi pada data historis jauh lebih baik daripada dalam perdagangan nyata.
- Biaya transaksi - banyak backtester siklik tidak memperhitungkan bahkan informasi paling mendasar tentang biaya transaksi, seperti berbagai biaya dan ongkos. Seringkali, para penulis makalah ilmiah berdosa yang memilih untuk tidak tunduk pada hal-hal sepele seperti itu. Menemukan strategi yang sangat menguntungkan dalam kondisi ideal tanpa biaya sangat mudah. Masalahnya adalah bahwa ketika berdagang dalam kondisi nyata, strategi seperti itu bisa sangat tidak menguntungkan. Sangat penting untuk memperhitungkan spread, situasi pasar, berbagai biaya, kelesuan (dalam transaksi dengan aset yang sangat fluktuatif, harga transaksi yang sebenarnya mungkin sedikit berbeda dari yang diharapkan ketika menempatkan aplikasi - baik dalam arah yang menguntungkan maupun yang negatif).
Ada juga masalah lain yang tidak sering dibahas, tetapi tetap sangat penting untuk menciptakan backtester yang berkualitas. Diantaranya adalah:
- Data OHLC adalah informasi tentang harga pembukaan, harga tertinggi dari instrumen keuangan selama sesi perdagangan, nilai terendah dan harga penutupan periode perdagangan (grafik buka-tinggi-rendah-tutup, OHLC). Biasanya diimpor dari sumber seperti Yahoo Finance. Dalam hal ini, bisa jadi kombinasi dari berbagai umpan data. Ini berarti bahwa mendapatkan nilai ekstrem (termasuk harga Tinggi dan Rendah) untuk sistem perdagangan waktu nyata akan sulit. Ini juga perlu diperhitungkan dalam model perdagangan.
- Batasan kapasitif - Backtesting menggoda untuk menggunakan persediaan uang tanpa batas. Pada kenyataannya, jumlah dana yang tersedia untuk perdagangan selalu terbatas (seperti jumlah dana pinjaman yang dimungkinkan untuk perdagangan margin). Penting juga untuk tidak melupakan volume perdagangan harian rata-rata (ADV), terutama untuk stok rendah likuiditas, ketika ada risiko tinggi bahwa sistem perdagangan akan menyebabkan perubahan nyata dalam harga. Efek pasar ini juga harus dipertimbangkan.
- Pemilihan patokan - perlu untuk menjawab pertanyaan apakah patokan dipilih secara tepat dengan mana strategi yang diuji akan dibandingkan. Misalnya, jika Anda berdagang komoditas berjangka yang netral dengan indeks S & P500, apakah layak menggunakan indeks ini sebagai patokan? Sangat mungkin bahwa sekeranjang dana komoditas lain akan menjadi pilihan yang lebih tepat.
- Ketegaran - jika Anda mengubah waktu mulai strategi selama backtest, seberapa banyak ini mempengaruhi hasilnya? Untuk strategi jangka panjang, waktu mulai pekerjaan mereka seharusnya tidak memengaruhi produktivitas secara serius - tidak masalah jika tes ulang dimulai pada hari Senin atau Kamis. Jika terlalu sensitif terhadap kondisi awal, ini berarti bahwa tidak ada cara untuk memprediksi kemungkinan produktivitasnya pada awal perdagangan nyata.
- Pelatihan ulang dan variasi - kami telah menyentuh masalah pelatihan ulang di atas, tetapi ini adalah masalah yang lebih luas yang melekat dalam semua metode pembelajaran mesin yang diawasi. Masalah ini hanya dapat diselesaikan dengan menggunakan teknik cross-validasi secara cermat. Dan bahkan dalam kasus ini, seseorang harus sangat berhati-hati ketika mengadaptasi strategi dengan noise dalam set data uji.
- Toleransi psikologis - psikologi sering diabaikan ketika membuat sistem perdagangan otomatis, karena pengaruhnya harus diminimalkan oleh algoritma. Namun, orang tetap manusia, bahkan ketika mereka berdagang bukan dengan tangan, tetapi dengan bantuan robot. Akibatnya, ini dapat mempengaruhi hasil. Sebagai contoh, jika selama tes mundur penarikan setoran 50% tampaknya risiko yang dapat diterima, maka pada kenyataannya kehilangan setengah nilai aset ternyata menjadi pengalaman yang jauh lebih traumatis. Tidak mudah untuk menolak tindakan yang tidak direncanakan dalam situasi seperti itu.
Itu semua dengan masalah pengujian sejarah, sekarang kita beralih ke deskripsi sistem itu sendiri untuk pengujian semacam itu.
Dua jenis penguji punggung
Pertama, pertimbangkan sistem siklik. Ini adalah jenis backtester paling sederhana yang paling sering dijelaskan dalam berbagai posting blog keuangan.
Ulangi Backtest
Mereka bekerja seperti ini - sistem hanya berulang melalui setiap hari perdagangan (atau bar OHLC), membuat perhitungan terkait dengan harga aset yang diinginkan (misalnya, menghitung harga penutupan rata-rata bergerak), dan kemudian melakukan operasi yang sesuai (memasuki posisi panjang atau pendek). Iterasi lebih lanjut berlanjut. Dalam prosesnya, informasi tentang kinerja disimpan untuk membangun grafik (kurva ekuitas) sebagai hasilnya.
Ini adalah seperti apa pseudocode dari suatu algoritma seperti:
for each trading bar: do_something_with_prices(); buy_sell_or_hold_something(); next_bar();PythonCopy
Seperti yang Anda lihat, sistem ini sangat sederhana, yang membuat penguji balik seperti itu merupakan pilihan yang sangat baik untuk mendapatkan perkiraan pertama tentang prospek sistem perdagangan.
Pro
Cyclic backtester sangat mudah diimplementasikan menggunakan hampir semua bahasa pemrograman, dan melakukannya dengan cepat. Ini berguna ketika Anda ingin menguji efek dari berbagai parameter.
Cons
Kerugian utama adalah hasil yang tidak realistis. Seringkali dalam backtester siklik bahkan tidak ada fungsi dasar untuk menghitung biaya transaksi, itu harus dilaksanakan secara terpisah. Yang juga umum digunakan hanya pesanan PASAR.
Juga, kemungkinan menggunakan kembali kode untuk pengujian dan sistem produktif sangat minim, jadi Anda harus menulisnya lagi. Ini meningkatkan kemungkinan kesalahan perangkat lunak.
Penguji loopback rentan terhadap kesalahan prediksi. Mereka harus digunakan secara eksklusif sebagai alat penyaringan untuk menolak strategi yang jelas-jelas tidak berhasil. Pada saat yang sama, penting untuk tetap sangat skeptis terhadap strategi yang telah menunjukkan hasil yang baik. Penting untuk diingat bahwa dalam kehidupan nyata, strategi jarang berkinerja lebih baik daripada saat backtest.
Sistem Berorientasi Kejadian
Sistem jenis ini berada di sisi berlawanan dari spektrum. Mereka jauh lebih dekat dengan kenyataan. Biasanya mereka bekerja di loop sementara besar, di mana "peristiwa" terus-menerus dicari dalam "antrian acara" khusus, termasuk:
- ticks - munculnya data pasar baru;
- peristiwa pensinyalan - tampilan sinyal perdagangan;
- pesanan acara - pesanan untuk menyelesaikan transaksi siap dikirim ke sistem broker;
- acara transaksi - tanda terima dari broker informasi tentang pelaksanaan aplikasi.
Ketika suatu peristiwa tertentu dikenali, itu ditransmisikan ke modul yang sesuai dalam infrastruktur sistem perdagangan untuk diproses lebih lanjut dan berpotensi menghasilkan peristiwa baru yang lagi-lagi jatuh ke dalam antrian.
Kode pseud dari backtester tersebut adalah sebagai berikut:
while event_queue_isnt_empty(): event = get_latest_event_from_queue(); if event.type == "tick": strategy.calculate_trading_signals(event); else if event.type == "signal": portfolio.handle_signal(event); else if event.type == "order": portfolio.handle_order(event); else if event.type == "fill": portfolio.handle_fill(event) sleep(600);
Seperti yang Anda lihat, sistem ini sangat tergantung pada modul pemrosesan portofolio - ini adalah jantung nyata dalam sistem yang berorientasi pada peristiwa.
Pro
Backtester jenis ini memiliki banyak keunggulan:
- Mengurangi kemungkinan kesalahan peramalan - karena struktur, yang mengasumsikan pengiriman pesan secara bertahap, kesalahan peramalan lebih kecil kemungkinannya terjadi dalam sistem yang berorientasi pada peristiwa, setidaknya di tingkat perdagangan. Namun, kemungkinan kemunculannya masih dipertahankan, karena kesalahan mungkin terdapat pada model itu sendiri.
- Kemampuan untuk menggunakan kembali kode - untuk menggunakan strategi dalam perdagangan nyata, Anda hanya perlu mengganti modul pemrosesan data dan mesin eksekusi pesanan. Deskripsi strategi, modul manajemen risiko dan manajemen posisi, kode untuk menilai produktivitas sistem - semua ini dapat digunakan tanpa perubahan. Ini mengurangi kemungkinan bug baru.
- Tingkat portofolio - Strategi yang didorong oleh peristiwa memudahkan untuk berpikir di tingkat portofolio. Pada akhirnya, ini membuatnya lebih mudah untuk membuat perubahan pada strategi dan mengembangkan metode lindung nilai.
- Manajemen risiko "Benar" - dalam sistem seperti itu lebih mudah untuk "memodulasi" manajemen risiko. Seorang trader dapat dengan mudah menggunakan teknik seperti kriteria Kelly, dan juga memasukkan berbagai peringatan, menetapkan batas (misalnya, tentang volatilitas).
- Penyebaran dan pemantauan jarak jauh - prinsip modular kode penulisan menyederhanakan penyebarannya di cloud atau sesuai dengan skema kolokasi pertukaran.
Cons
Keuntungan dari sistem yang berorientasi peristiwa dapat dimengerti, tetapi ada beberapa kelemahan. Diantaranya adalah:
- Kode kompleks - mengembangkan sistem yang sepenuhnya dicakup oleh pengujian akan membutuhkan waktu berminggu-minggu dan berbulan-bulan dalam mode penuh waktu.
- Orientasi objek - desain modular sistem memerlukan pendekatan berorientasi objek untuk pemrograman. Jadi, kita membutuhkan bahasa yang mendukung prinsip-prinsip ini. Pengujian unit tidak akan menjadi lebih mudah.
- Ambang entri tinggi - pendatang baru dalam pemrograman tidak akan dapat membuat sistem seperti itu. Pengalaman teknik yang signifikan akan diperlukan, yang akan memungkinkan untuk berurusan dengan kode penulisan, mengimplementasikan logging, melakukan pengujian unit, menerapkan kontrol versi dan praktik integrasi berkelanjutan.
- Kecepatan rendah - suatu pendekatan di mana pesan-pesan di dalam sistem ditransmisikan secara berurutan dalam level-levelnya yang berbeda, memperlambat kecepatan eksekusi aplikasi dibandingkan dengan pendekatan siklik yang vektor. Menghitung berbagai kombinasi parameter dapat memakan waktu.
Materi terkait pasar keuangan dan saham lainnya dari ITI Capital :