Python untuk Backtesting Forex — Stack, Alur Riset, dan Catatan Jujur
Strategy Tester MT5 bekerja baik selama strategi Anda masih sesuai dengan asumsinya — aturan entri sederhana, satu instrumen, tanpa kebutuhan data eksternal yang rumit. Begitu Anda ingin sesuatu yang lebih khusus, alat itu terasa sempit, dan itulah mengapa para trader sistematis sudah lama mengandalkan Python untuk backtesting. Alasannya jelas: kendali penuh atas aturan, pustaka berstandar ilmiah, berbagai sumber data dalam satu skrip, dan siklus kerja di mana jarak antara ide dan kurva ekuitas bisa hanya hitungan menit.
Mengapa Trader Beralih dari Strategy Tester
Strategy Tester unggul untuk mengoptimalkan satu expert advisor pada satu pasangan dan satu timeframe — dan di situlah batasnya. Gabungkan data non-broker, padukan beberapa pasangan dalam satu sinyal, atau hitung rasio Sharpe di samping distribusi drawdown, dan Anda akan terjebak menggabungkan file CSV di Excel. Python merangkum semua pekerjaan itu dalam satu skrip: data kuotasi broker masuk ke pandas, data makro bergabung melalui merge yang sama, dan metrik risiko tersedia dari pustaka sains data terbuka. Dasar-dasar mengotomatiskan strategi ada di panduan trading algoritmik untuk pemula; perbandingan antara MQL5 dan Python tercakup dalam pembahasan tentang platform trading dan alat analisis.
Stos Perangkat yang Digunakan
Tumpukan alat (stack) ini ringkas. Pengelolaan data ada di pandas dan numpy — yang pertama menangani deret waktu dan resampling dari M1 ke H1, yang kedua menangani aritmetika vektor di balik indikator. Engine backtesting biasanya backtrader karya Daniel Rodriguez, dengan gaya event-driven berbasis kelas Strategy dan Cerebro, atau vectorbt karya Oleg Polakov ketika Anda perlu menyapu ratusan kombinasi parameter dalam hitungan detik. Grafik dihasilkan oleh matplotlib untuk laporan statis dan plotly untuk tinjauan interaktif. Data historis masuk melalui yfinance untuk penutupan harian, ccxt untuk aset kripto, dan paket resmi MetaTrader5 untuk data kuotasi dari broker. Seluruh stack gratis dan bersumber terbuka.
Siklus Riset — dari Aturan hingga Validasi
Sebuah proyek melewati empat langkah yang sebaiknya dijaga tetap terpisah. Pertama, tulis aturan entri dan keluar dalam bahasa Indonesia yang biasa — jika Anda tidak bisa mengatakan "saya beli ketika kemiringan EMA-50 positif dan harga penutupan menembus tertinggi 20 hari," tidak ada gunanya membuka editor. Kedua, terjemahkan aturan itu ke dalam ekspresi pandas yang divektorisasi: satu kondisi untuk seluruh kolom sekaligus, bukan loop bar per bar, itulah mengapa sepuluh tahun data H1 dapat diuji dalam hitungan detik. Ketiga, jalankan engine pada seluruh data historis dengan komisi, slippage (selip harga), stop loss, dan take profit (ambil untung), lalu baca kurva ekuitas dan daftar transaksi. Keempat — tahap yang sering dilewati pemula secara diam-diam — validasi di luar sampel: isolasi dua tahun terakhir, optimalkan hanya pada jendela data lebih awal, dan baca hasilnya dari data yang tidak pernah disentuh. Mekanisme jendela bergulir dibahas dalam panduan strategi trading dan analisis lanjutan.
Apa yang Tidak Akan Dilakukan Python Sendiri
Pengguna baru membaca dokumentasi backtrader dan mengira pustaka itu menangani segalanya. Tidak demikian. Engine bawaannya tidak tahu apa-apa tentang spread broker Anda, tidak tahu bahwa kuotasi bisa melebar lima pip saat rilis berita, dan tidak tahu bahwa akun ECN membebankan tujuh dolar per lot di kedua sisi. Semua itu Anda ketik sendiri — parameter commission, slippage_perc, dan model spread kustom yang berubah per jam. Jebakan diam-diam kedua adalah kualitas data: seri gratis yfinance mengandung celah akhir pekan, dan data tick Dukascopy bisa tidak lengkap untuk pasangan eksotis. Dosa ketiga adalah terlalu mencintai kurva yang mulus: backtest in-sample dengan lima parameter yang dioptimalkan hampir selalu mengiklankan 200 persen setahun — sampai Anda menghapus satu variabel dan melihat kurva pada data yang tidak pernah disentuh oleh optimizer. Versi realistis biasanya menunjukkan 30 hingga 50 persen lebih rendah dari yang dijanjikan versi naif.
Contoh Ilustratif — Proyek EUR/USD Hipotetis
Bayangkan strategi pembukaan sesi London pada EUR/USD menggunakan bar M15: posisi beli (long) ketika harga mencetak di atas tertinggi lima bar setelah pukul 09.00 WIB, posisi jual (short) ketika harga menembus ke bawah terendah; stop ditempatkan di 1,5 kali ATR 20 periode, take profit di dua kali stop. Anda mengambil data 2018 hingga 2024 menggunakan paket MetaTrader5, memuatnya ke pandas, dan melakukan resampling ke M15. Backtest — dengan komisi enam dolar per lot, spread tetap 0,8 pip di luar jendela berita, dan satu pip slippage entri yang diacak — menghasilkan tingkat keberhasilan 51 persen, profit factor 1,28, maksimum drawdown (penurunan ekuitas) 14 persen, dan Sharpe 0,9. Membagi data menjadi empat tahun in-sample dan dua tahun out-of-sample menurunkan rata-rata out-of-sample sekitar sepertiga — menyisakan keputusan penerapan pada dasar yang masuk akal, bukan spektakuler. Semua angka di atas bersifat ilustratif; ini menunjukkan bentuk jawabannya, bukan janji hasil.
"Python telah menjadi bahasa pemrograman dan ekosistem yang kuat untuk industri keuangan — mulai dari menganalisis data keuangan, trading algoritmik, hingga manajemen risiko." — Yves Hilpisch, 2018
Catatan Jujur yang Harus Menyertai Setiap Laporan
Ketika backtest selesai, lampirkan kotak catatan singkat. Pertama: spread apa yang Anda asumsikan dan apakah Anda melebarkannya di sekitar rilis makro — perbedaan antara spread tetap 0,8 dan spread realistis 2,5 pip saat NFP sering menjadi seluruh keunggulan strategi. Kedua: apakah data bebas dari look-ahead bias, yaitu apakah Anda menghitung indikator dari penutupan bar berjalan yang belum Anda ketahui secara real-time. Ketiga: berapa banyak parameter yang Anda optimalkan sekaligus — lima adalah ambang batas di mana bahkan walk-forward analysis pun berhenti melindungi Anda. Keempat: apakah hasilnya bertahan di luar sampel atau hanya pada data penuh. Tanpa keempat kalimat itu, laporan adalah iklan, bukan audit. Perlu diingat bahwa di Indonesia, keuntungan dari trading Forex umumnya dikenai Pajak Penghasilan (PPh) dan wajib dilaporkan melalui SPT Tahunan; pastikan Anda memiliki NPWP dan konsultasikan kewajiban pajak spesifik dengan konsultan pajak. Untuk broker, pilihlah pialang berjangka yang berizin BAPPEBTI agar aktivitas trading Anda berada dalam kerangka hukum yang jelas.
Langkah Pertama Anda
- Instal Python 3.11 atau lebih baru beserta pustaka
pandas,numpy,backtrader,matplotlib, dan paket resmiMetaTrader5— satu perintahpip installsudah mencakup seluruh stack — kemudian unduh dua tahun data H1 untuk pasangan yang benar-benar Anda perdagangkan dan simpan sebagai CSV, agar iterasi berikutnya bekerja dari sumber lokal yang stabil dan tidak bergantung koneksi setiap kali dijalankan. - Tuliskan aturan strategi dalam bahasa Indonesia biasa terlebih dahulu — satu kalimat masing-masing untuk entri, keluar, stop loss, dan take profit (ambil untung) — baru kemudian terjemahkan ke dalam ekspresi
pandasyang divektorisasi; usahakan seluruh pengujian muat dalam tiga puluh baris kode tanpa loop bar per bar, dan tahan diri untuk tidak mengoptimalkan parameter pada tahap ini. - Jalankan backtest dengan komisi nyata, spread konstan, dan satu pip slippage yang diacak, lalu bandingkan dengan versi tanpa biaya; selisihnya memberitahu Anda seberapa besar keunggulan yang diasumsikan hanyalah artefak eksekusi harga tengah — jika biaya memakan lebih dari separuh keuntungan kotor, strategi terlalu tipis untuk diterapkan secara live dan perlu diperbaiki terlebih dahulu.
- Bagi data historis menjadi empat tahun in-sample dan satu tahun out-of-sample, optimalkan tidak lebih dari dua parameter pada jendela in-sample, bekukan set parameter terbaik, lalu jalankan uji out-of-sample sekali saja; jika tingkat keberhasilan turun lebih dari sepertiga, sederhanakan logika daripada mencari optimasi yang lebih baik — itu tanda bahwa model belajar kebisingan data, bukan struktur pasar.
- Simpan catatan sederhana — file Markdown di repo yang sama — dan setelah setiap backtest tuliskan empat kalimat: spread yang digunakan, apakah indikator bebas look-ahead, berapa parameter yang disetel, dan apakah ekuitas out-of-sample tetap di atas separuh in-sample; tanpa jurnal itu, dalam tiga bulan Anda tidak akan ingat laporan mana yang jujur dan mana yang hanya terlihat bagus.
Sumber dan referensi
-
Backtrader Backtrader documentation — Introduction · oficjalna dokumentacja open-source'owej biblioteki Daniela Rodrigueza: model event-driven, klasy Strategy i Cerebro, integracja danych www.backtrader.com ↗
-
vectorbt vectorbt usage documentation · oficjalny przewodnik po wektorowym backtestowaniu w numpy/pandas — przykłady i sweep parametrów vectorbt.dev ↗
-
O'Reilly Media Yves Hilpisch — Python for Finance, 2nd Edition (2018) · kanoniczna pozycja o zastosowaniach Pythona w analityce finansowej, algorytmice i zarządzaniu ryzykiem www.oreilly.com ↗
-
MQL5 MetaTrader 5 Python Integration — official reference · oficjalne API pakietu MetaTrader5: pobieranie historycznych OHLC i tików, dostęp do konta i składanie zleceń z Pythona www.mql5.com ↗
-
pandas pandas — Time series / date functionality · referencja czasu w pandas: konwersje, resampling, indeksowanie i przesunięcia używane w każdym backteście pandas.pydata.org ↗
Pertanyaan yang sering diajukan
Apakah saya perlu Python tingkat lanjut untuk memulai?
Python dasar sudah cukup — perulangan, daftar, fungsi, mengimpor pustaka, dan membaca file CSV. Sisanya adalah pandas, dan Anda akan mempelajarinya sambil berjalan karena setiap proyek backtesting menggunakan serangkaian operasi yang sama: memuat data, resampling, menghitung indikator, mendefinisikan kondisi entri, mengagregas hasil. Strategi pertama biasanya muat dalam tiga puluh baris kode, sehingga tidak ada gunanya menunggu sampai "menguasai Python sepenuhnya". Ritme yang lebih sehat adalah menjalankan dua jalur secara paralel: kursus singkat untuk dasar-dasar (empat hingga enam minggu, satu jam per hari) dan proyek nyata yang sedang Anda latih. Jika Anda bisa membuat lembar Excel dengan formula dan memahami apa itu fungsi, Anda sudah memiliki minimum yang dibutuhkan — pandas secara efektif menggantikan spreadsheet, bekerja lebih cepat, dan memungkinkan Anda memvalidasi pekerjaan dengan benar di luar sampel.
Mengapa memilih backtrader daripada vectorbt, atau sebaliknya?
Kedua pustaka mengikuti filosofi yang berbeda. Backtrader bersifat event-driven: engine berjalan bar demi bar, memanggil metode next() pada kelas Strategy Anda, dan mencerminkan cara trading live sesungguhnya berjalan — sehingga menambahkan manajemen posisi, trailing stop, atau keluar parsial menjadi mudah. Harganya adalah kecepatan: sepuluh tahun data M5 pada satu pasangan bisa memakan beberapa menit. Vectorbt mengambil jalur sebaliknya — Anda mengekspresikan seluruh strategi sebagai operasi yang divektorisasi pada kolom pandas, engine menjalankan semuanya secara paralel melalui numpy, dan penyapuan seratus kombinasi parameter selesai dalam hitungan detik. Harganya adalah rentang ekspresi: logika entri yang kompleks yang bergantung pada status portofolio lebih sulit dikodekan. Dalam praktiknya, trader menyimpan keduanya — vectorbt untuk eksplorasi cepat dan penyapuan parameter, backtrader untuk validasi akhir kandidat terbaik dengan model komisi dan slippage yang realistis.
Di mana mendapatkan data historis yang dapat diandalkan?
Ada tiga sumber, berurutan berdasarkan prioritas. Pertama, paket resmi MetaTrader5 — Anda mendapatkan data historis langsung dari broker Anda sendiri, sehingga spread, swap (rollover / biaya menginap), dan komisi dalam backtest sesuai dengan apa yang akan Anda lihat di akun live. Ini opsi paling jujur untuk strategi yang ingin Anda terapkan. Kedua, Dukascopy menerbitkan data tick dan M1 untuk pasangan utama sejak 2003 — kualitas institusional, tetapi spread berasal dari platform Dukascopy, bukan dari broker Anda. Ketiga, yfinance untuk penutupan harian dan ccxt untuk pasar kripto — keduanya baik untuk prototipe, tetapi celah akhir pekan dan menit yang sesekali hilang menjadikannya tidak cocok untuk memvalidasi strategi intraday. Dokumentasikan sumber di header skrip setiap kali, agar enam bulan kemudian Anda masih tahu apa dasar laporan tersebut — detail kecil yang menyelamatkan pekerjaan saat ada audit.
Bagaimana mengenali backtest yang terlalu bagus untuk menjadi kenyataan?
Ada empat sinyal yang cukup. Pertama, tingkat keberhasilan di atas 75 persen pada lebih dari dua ratus transaksi — hampir tidak dapat dicapai di luar scalping di pasar yang sangat ketat, sehingga hasilnya menunjukkan look-ahead bias atau kesalahan data. Kedua, kurva ekuitas tanpa penurunan berarti — strategi nyata mencatat drawdown (penurunan ekuitas) dua digit, sehingga garis lurus naik yang bersih adalah peringatan curve-fit. Ketiga, profit factor di atas 3,5 — sangat jarang di Forex, di mana spread ECN saja memakan bagian dua digit dari keunggulan. Keempat, sensitivitas tajam terhadap parameter — ketika mengubah periode rata-rata bergerak dari 14 ke 12 membuat hasil runtuh, strategi telah mempelajari kebisingan data, bukan struktur pasar. Ketika dua dari empat sinyal menyala bersamaan, laporan tersebut mencurigakan terlepas dari metrik utamanya; sederhanakan logika, kurangi satu atau dua parameter, dan jalankan ulang pengujian di luar sampel.