Dalam artikel ini
Setelah membaca artikel ini…
- Mencocokkan pengenal harga dan sinyal sebelum menghapus indeks.
- Membedakan waktu label, publikasi dan eksekusi dalam model bar yang sudah selesai.
- Merekonsiliasi biaya serta aturan masuk kembali sebelum membandingkan hasil backtest.
Pelajari istilah tanpa meninggalkan artikel
Backtesting (uji data historis) Eksekusi order Komisi Drawdown Stop loss Take profit (TP)Backtest Python memerlukan rantai yang dapat ditelusuri: data, informasi yang tersedia saat keputusan, order, eksekusi, lalu catatan transaksi yang direkonsiliasi. Simpan pengenal rekaman selain timestamp. Grafik ekuitas yang cepat dibuat belum menunjukkan apakah sinyal memakai rilis masa depan, bar yang belum selesai atau harga yang tidak diizinkan model eksekusi.
Pilih lingkungan sesuai pertanyaan riset
Strategy Tester MT5 mendukung Expert Advisor multivaluta, pengujian dan optimasi. Python memberi cara lain untuk mengatur data, perhitungan khusus dan riset. Bandingkan kebutuhan data, kontrak dan eksekusi sebenarnya. Ketika membandingkan implementasi, bekukan dataset serta aturan yang sama; perbedaan platform saja tidak menjelaskan perbedaan hasil. Dasar otomasi tersedia di trading algoritmik untuk pemula, sedangkan MQL5 dibandingkan Python membantu memilih alur kerja.
Simpan data, maknanya dan perangkat yang dipakai
Catat instrumen serta produk, penyedia, zona waktu, sisi kuotasi, interval dan rentang unduhan. Periksa ID ganda, urutan rekaman serta periode hilang. Penutupan pasar tidak otomatis berarti berkas rusak; mengisi celah dapat menciptakan observasi yang tidak pernah ada. Simpan berkas asli bersama langkah transformasinya.
Fungsi copy_rates_range pada paket MetaTrader5 mengembalikan waktu, OHLC, tick volume, spread dan real volume. Fungsi itu tidak menyediakan seluruh tarif historis komisi atau swap. Bar yang tersedia bergantung pada riwayat serta pengaturan terminal: meminta rentang tanggal belum membuktikan semua bar diterima. Argumen waktu dan data hasilnya memakai UTC. Tetapkan zona waktu secara eksplisit sebelum mengonversi jadwal sesi.
pandas dan NumPy menangani perhitungan data; Backtrader menyediakan alur berdasarkan peristiwa. Simulasi portofolio vectorbt juga memperbarui kas dan posisi, dengan mode orders, signals serta fungsi order khusus. Nama pustaka tidak menjamin eksekusi realistis atau durasi tertentu. Pilih perangkat paling sederhana yang memenuhi kebutuhan, catat versi dan periksa lisensi, hak data serta lingkungan yang didukung. Data dan penerapan dapat menimbulkan biaya tersendiri.
Menghapus indeks dapat memindahkan sinyal ke bar lain
Model rekaan ini mempunyai tiga rekaman harga yang sudah selesai: A = 100, B = 102, C = 104. Series penanda terpisah berurutan C: 1, A: 0, B: 0. Nilai 1 hanya menandai kandidat untuk pemodelan berikutnya, belum merupakan order atau harga eksekusi.
Pengenal rekaman dibandingkan posisi array
Penyelarasan label memilih C 104. Tanpa ID, perkalian posisi dapat mengaitkan penanda pertama dengan A 100.
Pada layar kecil, gulir diagram mendatar atau perbesar. Nilai dan kesimpulan juga tersedia dalam teks di bawah.
pandas menyelaraskan Series berdasarkan label. Hasil prices * flags adalah A: 0, B: 0, C: 104. Mengubah keduanya menjadi array lalu mengalikan berdasarkan posisi memberi 100, 0, 0. Bila hasil itu diberi urutan A, B, C, justru A menjadi kandidat. Periksa ID sebelum to_numpy(), bukan hanya kesamaan panjang array. Penyelarasan yang benar tetap memerlukan pemeriksaan waktu tersedianya sinyal. Pengenal harus unik; label hilang atau berulang memerlukan kebijakan tersendiri. Harga ini arbitrer, tanpa biaya atau hasil investasi.
Tentukan kapan informasi boleh digunakan
Bar berlabel waktu pembukaannya belum lengkap pada waktu tersebut. OHLC lengkap bar H1 yang dimulai pukul 10.00 baru diketahui setelah periodenya berakhir. Pada resampling pandas, closed mengatur keanggotaan interval dan label mengatur batas yang ditampilkan. Mengubah label tidak memajukan waktu tersedianya agregat.
Gabungkan data makro memakai waktu publikasi versi yang tersedia saat itu, bukan hanya bulan yang dijelaskan. merge_asof memerlukan kunci waktu terurut; backward memilih kunci sebelumnya atau sama, sedangkan nearest dapat memilih yang lebih kemudian. Keduanya tidak mengetahui revisi data. Tentukan toleransi serta urutan peristiwa yang memiliki timestamp sama.
Uji pencocokan rekaman. Keputusan dibuat pukul 10.04 UTC. Hanya ada rilis tersimpan pukul 10.00 bernilai 50 dan pukul 10.05 bernilai 60. Backward tanpa batas toleransi memilih 50, empat menit sebelumnya. Nearest memilih 60, hanya satu menit jauhnya tetapi masih berada di masa depan. Backward dengan toleransi inklusif dua menit tidak menemukan pasangan. Catat nilai hilang itu; menggantinya dengan rilis masa depan mengubah himpunan informasi.
Resep terpisah memakai 22 bar rekaan yang seluruhnya sudah selesai. Dua puluh High pertama berurutan dari 100 sampai 119, masing-masing Open = High − 0,5, Low = High − 2 dan Close = High − 1. Bar 21 memiliki O120/H121/L118/C120,5; bar 22 O120,6/H122/L119/C121. Angka arbitrer ini bukan data pasar atau transaksi FX.
previous_high = bars["high"].shift(1).rolling(20).max()
signal = bars["close"] > previous_high
next_bar_signal = signal.shift(1, fill_value=False)
Pada bar 21, maksimum dua puluh High sebelumnya adalah 119 sehingga 120,5 > 119 bernilai benar. Memasukkan High bar berjalan membuat batasnya 121 dan kondisi menjadi salah. Baris terakhir menempatkan sinyal yang sudah diamati pada bar 22; baris itu belum memberi harga eksekusi, membuktikan order diterima atau menentukan keluar. Gunakan bar masukan yang selesai dan tetapkan ukuran posisi, jenis order serta urutan peristiwa secara terpisah.
Pisahkan sinyal, eksekusi dan biaya
Dalam model Market standar yang didokumentasikan Backtrader, order yang dibuat setelah pemrosesan bar berjalan memakai Open bar tersedia berikutnya. Pengaturan atau model lain dapat mengubah waktunya. Ketika stop loss dan take profit berada dalam satu bar, OHLC saja tidak mengungkap mana yang teramati lebih dahulu. Dokumentasikan asumsi eksekusi tersebut.
Akuntansi satu transaksi rekaan. Beli 10.000 EUR pada Ask EUR/USD 1.1002, dengan Bid bersamaan 1.1000. Kemudian jual seluruh unit pada Bid 1.1012, ketika Ask 1.1014. Satu pip adalah 0.0001 USD per EUR. Selisih harga eksekusi sepuluh pip menghasilkan 10 USD. Komisi 1 USD pada masing-masing sisi menyisakan laba neto 8 USD. Pendanaan dan slippage tambahan diasumsikan nol. Mengurangi lagi spread masuk dua pip akan menghasilkan 6 USD dan menghitung selisih yang sudah terkandung dalam harga sebanyak dua kali.
Tetapkan pendanaan, konversi, ukuran kontrak, aturan margin dan penolakan order untuk produk yang dimaksud. Untuk banyak instrumen, modelkan kas bersama, margin tersedia serta urutan pemrosesan permintaan serentak. Menjumlahkan kurva ekuitas independen dapat memasukkan order yang sebenarnya tidak mampu didanai akun bersama. Model slippage acak juga memerlukan distribusi, seed dan versi pustaka yang dinyatakan.
Catatan transaksi membuat hasil dapat diperiksa
Ilustrasi terpisah dengan nilai uang R tetap mempunyai tepat 40 kemenangan +2R dan 60 kerugian −1R: jumlah keuntungan 80R, besar kerugian 60R, neto 20R. Profit factor 80/60 sekitar 1,33 dan mean 0,2R per transaksi. Biaya 0,1R pada setiap transaksi mengubah hasil menjadi 40 kali +1,9R dan 60 kali −1,1R: keuntungan 76R, kerugian 66R, neto 10R, profit factor sekitar 1,15 dan mean 0,1R. Ini aritmetika rekaan, bukan hasil backtest pasar.
Kontracontoh masuk kembali. Kondisi lima bar adalah benar, benar, benar, salah, benar. Kedua kebijakan masuk pada bar 1; stop menutup posisi pada bar 2 sebelum kondisi masuk diperiksa. Tidak ada keluar berikutnya. Kebijakan yang masuk saat tanpa posisi dan kondisi benar masuk kembali pada bar 2 lalu tetap memegang posisi. Kebijakan yang mensyaratkan kondisi salah sebelum mengaktifkan ulang pemicu menunggu pada bar 2 dan 3, aktif kembali pada bar 4, lalu masuk pada bar 5. Keduanya menghitung dua entri, tetapi waktunya berbeda. Ini mesin status yang dipilih secara eksplisit, bukan klaim tentang default pustaka.
Simpan ekuitas termasuk posisi terbuka serta hasil transaksi tertutup. Sertakan modal awal saat menghitung drawdown dan pisahkan setoran serta penarikan dari return strategi. Jangan menambahkan return, Sharpe ratio atau drawdown yang tidak dapat direkonstruksi dari catatan bertanggal dan deret ekuitasnya.
Pisahkan pemilihan strategi dari evaluasi data tersisih
Tetapkan jendela pelatihan dan pengujian secara kronologis sebelum memilih aturan. Catat setiap instrumen, kombinasi parameter, filter serta pembagian yang dicoba, termasuk versi yang ditolak. Sedikit parameter tidak berarti sedikit hipotesis. Makalah Bailey dan rekan membahas pemilihan berulang serta backtest overfitting; contoh rekaan artikel ini tidak menghasilkan estimasi PBO. Catatan percobaan dan data yang belum dipakai membantu menjelaskan proses seleksi, tetapi tidak otomatis menjamin strategi bertahan.
Win rate tinggi saja bukan alat diagnosis. Contoh lain dengan 100 transaksi rekaan, 75 keuntungan +0,2R dan 25 kerugian −1R, mempunyai win rate 75% tetapi rugi 10R sebelum biaya: keuntungan 15R, kerugian 25R, profit factor 0,6. Periksa observasi, ketergantungan sampel, eksekusi, biaya dan sensitivitas parameter. Ambang win rate atau profit factor universal tidak membuktikan adanya kesalahan maupun keunggulan.
Langkah yang dapat dikerjakan besok
- Buat proyek terisolasi dan simpan data asli beserta ID, sumber, waktu UTC, sisi kuotasi serta versi. Latihan luring ini tidak memerlukan kredensial live atau pengiriman order.
- Telusuri beberapa rekaman yang spesifik. Catat kapan sinyal tersedia, peristiwa berikutnya yang boleh mengeksekusi serta penanganan rekaman hilang atau direvisi.
- Tentukan aturan status posisi: kondisi benar berulang menambah, membalik, masuk lagi sesudah stop atau menunggu pemicu aktif kembali. Periksa ID entri yang diharapkan.
- Rekonsiliasi biaya serta tiap fill, lalu turunkan hasil dari catatan. Uji aturan beku yang sama dengan asumsi eksekusi alternatif yang dijelaskan.
- Simpan log percobaan, jendela tersisih, versi dan keterbatasan. Bandingkan periode yang setara beserta ketidakpastiannya; penurunan persentase tertentu tidak mengidentifikasi penyebabnya. Lanjutkan ke walk-forward analysis setelah arti data dan aturan waktunya jelas.
Periksa pemahaman Anda
Latihan: sekitar 2 menit.
Lihat jawaban dan penjelasan
Benar. Satu-satunya penanda 1 mempunyai ID C, yang harganya 104.
Pertanyaan lain
Apakah perlu Python tingkat lanjut untuk memulai?
Bagaimana memilih Backtrader atau vectorbt?
Di mana memperoleh data historis yang sesuai?
Bagaimana memeriksa hasil yang tampak terlalu bagus?
Mengapa Series memilih C, tetapi array dapat memilih A?
Apakah nearest aman untuk menggabungkan rilis makro?
Apakah spread perlu dikurangi lagi setelah memakai Ask dan Bid?
Mengapa dua kebijakan yang sama-sama mencatat dua entri bisa berbeda?
Sumber dan verifikasi
- Backtrader: dokumentasi resmi
Referensi alur berdasarkan peristiwa; aturan Market standar diperinci pada referensi eksekusi di bawah.
- vectorbt: panduan penggunaan
Referensi penggunaan, bukan pengukuran kecepatan universal.
- Yves Hilpisch: Python for Finance, edisi kedua, 2018
Referensi bibliografis buku; tidak ada kutipan langsung dari buku.
- MetaQuotes: integrasi Python MetaTrader5
Referensi paket resmi; pemakaian fungsi data tidak membuktikan seluruh tarif historis tersedia.
- pandas: deret waktu dan resampling
Keanggotaan interval dan label waktu merupakan pengaturan terpisah.
- MetaQuotes: copy_rates_range
Kolom hasil, UTC serta keterbatasan riwayat terminal.
- pandas: merge_asof
Kunci terurut, arah pencocokan dan toleransi; contoh waktu di artikel merupakan model rekaan.
- vectorbt: alur dan mode simulasi portofolio
Simulasi memperbarui status kas dan aset; tersedia mode orders, signals dan fungsi order khusus.
- pandas: Series dan penyelarasan label
Perbedaan identitas label dan posisi array; model A/B/C merupakan rekaman rekaan.
- Backtrader: pembuatan dan eksekusi order
Model standar Market memakai Open bar tersedia berikutnya setelah keputusan pada bar sebelumnya.
- MetaTrader 5: Strategy Testing
Dokumentasi resmi menyatakan dukungan Expert Advisor multivaluta.
- Bailey, Borwein, López de Prado dan Zhu: The Probability of Backtest Overfitting
Makalah versi Februari 2015 tentang pemilihan berulang dan overfitting. Artikel ini tidak menghitung PBO atau mereplikasi penelitian tersebut.
Perhitungan menggunakan asumsi yang dinyatakan secara terbuka. Perhitungan ini tidak menggantikan data pasar terkini atau ketentuan penyedia.
