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

Label dan posisi memilih rekaman berbedaHarga A100, B102, C104 berurutan A, B, C. Penanda berurutan C1, A0, B0. Penyelarasan label memilih C104; perkalian array tanpa ID justru memberi nilai pertama100 pada A.Harga menurut IDUrutan penanda lainA 100C 1B 102A 0C 104B 0Series: ID C → 104Tanpa ID: baris pertama → 100Data sama, rekaman terpilih berbeda.forex-basics.com/id/
Identitas label berbeda dari posisi array. Harga A 100, B 102, C 104 dibandingkan penanda C:1, A:0, B:0. Garis hijau menghubungkan ID C; harga ini rekaan dan perkalian hanya menunjukkan pemilihan rekaman.

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

  1. 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.
  2. Telusuri beberapa rekaman yang spesifik. Catat kapan sinyal tersedia, peristiwa berikutnya yang boleh mengeksekusi serta penanganan rekaman hilang atau direvisi.
  3. Tentukan aturan status posisi: kondisi benar berulang menambah, membalik, masuk lagi sesudah stop atau menunggu pemicu aktif kembali. Periksa ID entri yang diharapkan.
  4. Rekonsiliasi biaya serta tiap fill, lalu turunkan hasil dari catatan. Uji aturan beku yang sama dengan asumsi eksekusi alternatif yang dijelaskan.
  5. 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.