Simulasi Monte Carlo Strategi Trading — Risiko yang Disembunyikan Satu Backtest
Seorang trader pernah berbagi backtest yang ia banggakan: tingkat keberhasilan 55 persen, rata-rata keuntungan 100 euro, rata-rata kerugian 80 euro, dan proyeksi keuntungan sekitar 3.800 euro setahun di atas kertas. Angkanya cukup meyakinkan, sehingga ia membuka akun live, mempertaruhkan lima persen modal per transaksi, lalu akun itu ludes dalam enam bulan. Ia bertanya di mana kesalahannya. Kesalahannya bukan pada strateginya, melainkan pada asumsi bahwa satu backtest adalah satu kebenaran mutlak — padahal simulasi Monte Carlo akan menunjukkan bahwa edge yang sama dengan ukuran posisi itu memiliki peluang sekitar 25 persen untuk meludeskan akun. Kisah itulah yang mendorong saya menulis artikel ini.
Apa sebenarnya simulasi Monte Carlo untuk strategi trading?
Monte Carlo adalah metode probabilistik yang namanya diambil dari kasino terkenal di Monako. Dalam trading praktis, ide dasarnya mengejutkan kesederhanaannya: alih-alih hanya melihat satu kurva ekuitas yang kebetulan dihasilkan oleh riwayat data Anda, Anda membangkitkan seribu urutan baru dengan statistik yang sama tetapi dalam urutan acak yang berbeda. Setiap urutan menghasilkan gambaran akun yang berbeda, dan secara bersama-sama kesemuanya membentuk awan kemungkinan yang tidak pernah bisa diungkap oleh satu backtest saja.
Satu backtest adalah satu realisasi dari sebuah proses acak. Variansi di sekitarnya bisa sangat besar — itulah sifat alami dari permainan yang diulang berkali-kali dengan edge tertentu. Monte Carlo mengubah variansi itu menjadi angka konkret yang bisa Anda tindaklanjuti.
Pertanyaan apa saja yang benar-benar dijawab oleh Monte Carlo?
Simulasi ini memberikan tiga hal yang tidak bisa Anda peroleh dari satu backtest. Pertama adalah drawdown (penurunan ekuitas) realistis pada tingkat kepercayaan 95 persen — kedalaman yang tidak Anda lampaui dalam 95 dari 100 simulasi. Kedua adalah probabilitas kehilangan sebagian besar akun, misalnya penurunan ke bawah setengah modal. Ketiga adalah rentang hasil tahunan yang masuk akal selama edge tetap konstan.
Dalam skenario ilustratif saya (jelas hipotetis), sebuah strategi dengan tingkat keberhasilan 55 persen, rata-rata keuntungan 100 euro, rata-rata kerugian 80 euro, dan 200 transaksi per tahun memiliki ekspektansi (expectancy) sekitar 19 euro per transaksi — 3.800 euro di atas kertas. Simulasi seribu kali menghasilkan median mendekati 3.750 euro. Lima persen terburuk berakhir sekitar 500 euro keuntungan, satu persen terburuk mengalami kerugian 800 euro, dan lima persen terbaik mencapai 7.500 euro. Edge yang sama, perbedaan lima kali lipat.
Cara menjalankan simulasi di Excel
Versi tanpa makro sudah cukup untuk memahami strategi Anda sendiri. Di sel A1 hingga A5, masukkan parameter: tingkat keberhasilan 0,55, rata-rata keuntungan 100, rata-rata kerugian -80, jumlah transaksi 200, dan modal awal 10.000. Di sel B1, masukkan =IF(RAND()<A1, A2, A3) — fungsi RAND Excel mengembalikan nilai antara nol dan satu, dan jika nilainya di bawah tingkat keberhasilan, Anda mendapat keuntungan; sebaliknya, kerugian.
Di sel C1, tambahkan modal awal dengan nilai di B1 — inilah titik pertama kurva ekuitas. B2 menggunakan rumus yang sama, dan C2 menambahkan nilai di C1 dengan B2. Tarik kedua kolom ke bawah hingga baris 200. Itulah satu urutan tahunan lengkap.
Menyalin dua kolom tersebut ke samping sebanyak seribu kali (B–C, D–E, F–G, dan seterusnya) menghasilkan seribu kurva ekuitas yang independen. Dari nilai akhir, baca =PERCENTILE.INC(rentang, 0.5) untuk median, lalu 0,05 dan 0,01 untuk melihat hasil terburuk lima dan satu persen. Menekan F9 menghitung ulang semua nilai acak, sehingga setiap tekanan menghasilkan studi baru dari seribu simulasi. Ini benar-benar sudah lebih dari cukup.
Cara melakukan hal yang sama di Python dengan bootstrap
Python memberikan dua hal yang tidak dimiliki Excel. Pertama, kecepatan — ribuan simulasi selesai dalam hitungan detik. Kedua, dan yang lebih penting, Python memungkinkan Anda melakukan bootstrap: mengambil sampel bukan dari parameter yang diasumsikan, melainkan dari daftar transaksi historis nyata Anda.
Anda mengimpor NumPy, memuat 100 atau lebih angka P/L nyata dari jurnal trading, lalu menulis urutan_baru = np.random.choice(riwayat, size=200, replace=True). Fungsi np.cumsum mengubah daftar P/L menjadi kurva ekuitas, dan sebuah loop di sekelilingnya menghasilkan seribu simulasi independen. Baca persentil dengan np.percentile dan gunakan Matplotlib untuk menggambar spaghetti plot — semua seribu kurva ditumpangkan dengan median dan band persentil 5 hingga 95 yang disorot.
Bootstrap mempertahankan ekor distribusi nyata dari transaksi Anda — kerugian besar, pergerakan yang bergerombol, sesekali keuntungan rekor di minggu yang sangat volatil. Asumsi parametrik tidak bisa mereproduksi hal ini karena tidak mengasumsikan distribusi yang sebenarnya dimiliki transaksi Anda.
"Reward-to-risk ratios make almost no sense without including position sizing in the equation. Through position sizing, you can achieve almost any objective you'd like." — Van K. Tharp, 2007
Keterbatasan jujur — apa yang tidak bisa dilakukan Monte Carlo
Simulasi parametrik bertumpu pada dua asumsi: transaksi bersifat independen dan distribusi hasil bersifat stasioner. Keduanya runtuh di pasar nyata secara bersamaan. Kerugian cenderung bergerombol — ketika rezim pasar berubah, beberapa transaksi berturut-turut bergerak ke arah yang sama, dan model yang mengambil sampel independen tidak dapat mereproduksi hal ini. Drawdown nyata sering terlihat lebih buruk daripada persentil 1 persen dari Monte Carlo, bukan lebih baik.
Masalah kedua adalah simulasi menggunakan riwayat yang sama persis yang Anda masukkan. Jika 100 transaksi Anda hanya mencakup uptrend pada EUR/USD, Monte Carlo tidak akan memberi tahu apa pun tentang bagaimana strategi berperilaku selama konsolidasi panjang atau pergerakan tajam 200 pip setelah data AS. Itulah mengapa mengombinasikan simulasi dengan walk-forward analysis sangat berharga — metode itu menguji strategi di jendela bergerak dan mendeteksi degradasi edge.
Drawdown paling gelap sering menggali lebih dalam daripada persentil 1 persen dari simulasi Monte Carlo yang bersih. Perlakukan simulasi sebagai lantai probabilistik, bukan langit-langit, dan baca bersama materi manajemen risiko lengkap di ForexMechanics untuk konteks yang lebih mendalam.
Perdagangan Forex ritel di Indonesia diawasi oleh BAPPEBTI (Badan Pengawas Perdagangan Berjangka Komoditi) untuk perdagangan berjangka, dan OJK (Otoritas Jasa Keuangan) untuk sektor jasa keuangan secara luas. Pastikan Anda memilih broker atau pialang berjangka yang berizin BAPPEBTI; waspadai broker luar negeri tanpa izin yang tidak memberikan perlindungan memadai bagi Anda sebagai trader ritel.
Langkah pertama Anda untuk benar-benar menerapkan ini
- Kumpulkan riwayat minimal 100 transaksi yang sudah ditutup dari jurnal atau ekspor platform Anda. Di bawah 100 transaksi, statistiknya terlalu bising agar Monte Carlo bisa mengatakan sesuatu yang berguna tentang ekor distribusi. Jika jumlah Anda lebih sedikit, lanjutkan trading selama enam hingga dua belas minggu lagi dan kembali ke latihan ini dengan sampel yang lebih besar. Mulai juga mencatat di jurnal trading yang disiplin agar data masa depan Anda terdokumentasi dengan baik.
- Buka lembar Excel kosong dan bangun versi parametrik seperti yang dijelaskan di atas. Masukkan tingkat keberhasilan Anda sendiri, rata-rata keuntungan, rata-rata kerugian, dan modal, salin kolom sebanyak seribu kali, tekan F9, lalu pelajari sebaran nilai akhirnya. Satu jam kerja itu akan mengungkap betapa lebarnya rentang yang tersembunyi di balik "tahun rata-rata" Anda — angka yang selama ini membuat Anda merasa terlalu percaya diri.
- Baca persentil ke-5 dari drawdown maksimum dari seribu simulasi tersebut. Jika angkanya menunjukkan penurunan 30 persen sementara toleransi psikologis Anda berakhir di sekitar 15 persen, masalahnya bukan pada strategi melainkan pada ukuran posisi (position sizing) — kurangi risiko per transaksi menjadi setengahnya dan jalankan ulang simulasi sampai lantai 5 persen masuk dalam batas toleransi Anda. Ini adalah inti dari manajemen risiko yang disiplin: menyesuaikan exposure dengan apa yang bisa Anda tanggung secara psikologis, bukan dengan apa yang terlihat bagus di atas kertas.
- Setelah satu tahun trading live, jalankan simulasi ulang dengan riwayat baru dan bandingkan dengan riwayat tahun lalu. Jika median telah turun dan ekor distribusi melebar, edge Anda sedang terdegradasi — itulah saat yang tepat untuk bertanya apakah strategi masih berfungsi, bukan sekadar terus merawatnya dengan harapan kondisi membaik sendiri.
Sumber dan referensi
-
Bank for International Settlements Minimum capital requirements for market risk (d457) · Bazylejski standard pokazujący, jak instytucje liczą ryzyko rynkowe za pomocą expected shortfall i historycznej symulacji — analog Monte Carlo dla portfela. www.bis.org ↗
-
Van Tharp Institute About Van K. Tharp · Strona biograficzna potwierdzająca autorstwo książki „Trade Your Way to Financial Freedom" (McGraw-Hill) i jego pracę nad position sizingiem oraz symulacją Monte Carlo dla traderów detalicznych. www.vantharp.com ↗
-
NumPy Developers numpy.random.choice — Random sampling · Oficjalna dokumentacja funkcji losowania z powtórzeniami; podstawowe narzędzie do bootstrap resampling listy transakcji w Pythonie. numpy.org ↗
-
Python Software Foundation random — Generate pseudo-random numbers · Oficjalna dokumentacja biblioteki standardowej Pythona z funkcjami random.choices i random.sample, używanymi do prostych symulacji Monte Carlo bez NumPy. docs.python.org ↗
Pertanyaan yang sering diajukan
Apa itu simulasi Monte Carlo untuk strategi trading?
Monte Carlo adalah metode probabilistik yang namanya diambil dari kasino di Monako. Dalam trading, Anda mengambil daftar transaksi historis atau parameter strategi — tingkat keberhasilan, rata-rata keuntungan, rata-rata kerugian — dan alih-alih hanya melihat satu kurva ekuitas yang kebetulan dihasilkan oleh riwayat, Anda membangkitkan seribu urutan baru dalam urutan acak. Masing-masing memiliki statistik yang sama tetapi urutan keuntungan dan kerugian yang berbeda, sehingga setiap urutan menggambarkan potret akun yang berbeda. Mengapa perlu?: satu backtest adalah satu realisasi. Variansi di sekitarnya bisa sangat besar. Strategi yang sama dengan ekspektansi sekitar 19 euro per transaksi dan 200 transaksi per tahun dapat menghasilkan median Monte Carlo mendekati 3.750 euro, tetapi persentil terburuk 5 persen turun ke 500 euro dan yang terbaik 5 persen melonjak ke 7.500 euro. Rentangnya lebar meskipun edge tetap konstan. Kesalahpahaman paling umum: "tahun lalu strategi ini menghasilkan 5.000 euro, jadi tahun ini seharusnya serupa." Monte Carlo menunjukkan bahwa dengan edge yang tetap konstan, rentang realistis bisa membentang dari 1.000 hingga 10.000 euro — dan tidak ada yang patologis dari itu. Itulah variansi statistik semata.
Bagaimana cara menjalankan simulasi Monte Carlo di Excel?
Versi paling sederhana tidak memerlukan makro atau VBA. Di sel A1 hingga A5, masukkan parameter: tingkat keberhasilan (misalnya 0,55), rata-rata keuntungan (misalnya 100), rata-rata kerugian (misalnya -80), jumlah transaksi dalam satu urutan (misalnya 200), dan modal awal (misalnya 10.000). Di sel B1, tuliskan =IF(RAND()<A1, A2, A3) — fungsi RAND mengembalikan nilai antara nol dan satu; jika nilainya di bawah tingkat keberhasilan, Anda mendapat keuntungan, sebaliknya kerugian. Di sel C1, tambahkan modal awal ke nilai B1. B2 dan C2 mengikuti pola yang sama, tetapi C2 merujuk ke C1. Tarik kedua kolom ke bawah hingga baris 200. Itulah satu urutan tahunan lengkap. Salin kedua kolom itu ke samping sebanyak seribu kali dan Anda mendapatkan seribu kurva ekuitas yang independen. Dari nilai akhir, hitung =PERCENTILE.INC(rentang, 0.5) untuk median, dan 0,05 serta 0,01 untuk melihat hasil terburuk lima dan satu persen. Menekan F9 menghitung ulang semua nilai acak, sehingga setiap tekanan memberi studi baru dari seribu simulasi. Excel menangani ini dengan lancar dan sudah cukup untuk memahami strategi Anda sendiri.
Bagaimana cara mengimplementasikan Monte Carlo di Python?
Python melakukan pekerjaan yang sama lebih cepat dan memungkinkan Anda melakukan bootstrap dari riwayat transaksi nyata, bukan hanya dari parameter. Anda mengimpor NumPy, memuat 100 atau lebih angka P/L nyata dari jurnal, lalu menulis urutan_baru = np.random.choice(riwayat, size=200, replace=True). Fungsi np.cumsum mengubah daftar P/L menjadi kurva ekuitas, dan sebuah loop menghasilkan seribu simulasi independen. Baca persentil dengan np.percentile dan gunakan Matplotlib untuk menggambar spaghetti plot — semua seribu kurva ditumpangkan dengan median dan band persentil 5 hingga 95 yang disorot. Bootstrap mempertahankan ekor distribusi nyata: kerugian besar, pergerakan yang bergerombol, sesekali keuntungan rekor di minggu yang sangat volatil. Asumsi parametrik tidak bisa mereproduksi ini karena tidak mengasumsikan distribusi yang sebenarnya dimiliki transaksi Anda. Satu gambar mengungkap lebih banyak tentang risiko strategi daripada sepuluh tabel.
Apa saja keterbatasan Monte Carlo dalam trading?
Monte Carlo bukanlah ramalan dan hal itu perlu dikatakan dengan tegas. Asumsi dasar simulasi parametrik adalah bahwa transaksi bersifat independen dan distribusi hasil bersifat stasioner. Di pasar nyata, kedua kondisi itu sering runtuh secara bersamaan. Kerugian cenderung bergerombol — ketika rezim pasar berubah, beberapa transaksi berturut-turut bergerak ke arah yang sama, dan model yang mengambil sampel independen tidak bisa mereproduksi hal ini. Itulah mengapa drawdown paling gelap dalam trading nyata sering terlihat lebih buruk daripada persentil 1 persen dari Monte Carlo, bukan lebih baik. Masalah kedua adalah simulasi menggunakan statistik yang sama persis yang Anda ambil dari riwayat. Jika 100 transaksi Anda hanya mencakup uptrend pada EUR/USD, Monte Carlo tidak akan memberi tahu apa pun tentang bagaimana strategi berperilaku selama konsolidasi panjang. Konsekuensi praktisnya: perlakukan hasil Monte Carlo sebagai lantai probabilistik, bukan langit-langit. Jika skenario terburuk 5 persen menunjukkan drawdown 30 persen, asumsikan trading nyata bisa menggali lebih dalam. Sesuaikan ukuran posisi dengan lantai itu, bukan dengan hasil median — dengan begitu kemunduran nyata tidak akan melumpuhkan Anda.