Mengoptimalkan robot perdagangan: algoritma genetika



Dalam artikel sebelumnya, saya mulai membandingkan metode optimasi parametrik, yaitu, memilih parameter, mengevaluasi profitabilitas perdagangan robot selama backtest berikutnya. Ternyata metode dangkal Monte Carlo - generasi kombinasi parameter robot tidak berkorelasi acak - bekerja dengan baik. Sekarang saya ingin menguji algoritma yang populer, termasuk yang ada di komunitas pedagang pemrograman: algoritma pengoptimalan genetik .

Algoritma genetika untuk mengoptimalkan strategi perdagangan


Kami akan mempertimbangkan algoritma ini sebagai contoh optimasi 2 parameter. Parameter yang dioptimalkan dari robot kami adalah periode rata-rata bergerak dan TakeProfit . Untuk perendaman yang lebih besar dalam "genetika", mari kita sepakat untuk menyebut periode moving average gen yang bertanggung jawab untuk "pertumbuhan", dan TakeProfit - gen untuk "warna mata".

Dalam ruang nilai parameter yang dapat diterima, setiap titik, setiap pasangan koordinat - "tinggi / warna mata" secara teoritis menggambarkan satu "individu". Misalkan kita secara acak membuat 10 orang. Ini adalah langkah pertama dari algoritma optimasi genetik - untuk membuat generasi pertama:



Dalam ruang koordinat M - T, titik dipilih secara acak. Sebagai contoh, dua titik yang ditandai dengan bingkai merah adalah "individu" dengan nama netral gender (ini adalah poin penting!) Zhenya dan Sasha. "Pertumbuhan" Sasha (dalam rumusan awal masalahnya adalah periode rata-rata bergerak) adalah 11 unit, "warna mata" adalah 0,6 (mata hijau-biru). Zhenya sedikit berbeda dalam parameter. Karakteristik yang sama menggambarkan 8 individu yang tersisa.

Langkah kedua adalah reproduksi


Dari seluruh generasi pertama, kami menentukan sejumlah individu "paling sukses". Kriteria, jelas, adalah nilai CF. Individu-individu ini akan berkembang biak, membentuk pasangan secara acak (karena alasan ini, mereka menerima nama netral gender). Secara umum, sejumlah aturan dapat ditetapkan untuk pasangan yang cocok. Misalnya, untuk memilih individu yang dekat dalam karakteristik (mis., Secara harfiah, paling dekat dalam ruang koordinat) dengan individu - kawin sedarah. Anda bisa, sebaliknya, mencari yang berlawanan (outbreeding). Saya tidak dapat menemukan argumen yang mendukung salah satu opsi ini - dalam implementasi saya, pasangan dibentuk secara tidak sengaja ... Sebagai contoh, Zhenya dan Sasha lulus kualifikasi dan memutuskan untuk melahirkan keturunan. Apa artinya ini dalam konteks kita:



Dari dua individu "orang tua" kita memperoleh individu ketiga, yang mewarisi sebagian dari karakteristik satu orang tua, bagian yang lain. Sebagai contoh, Zhenya dan Sasha melahirkan seorang individu Nikita (Nikita, Nikita?):

  • Nikita mewarisi tanda "warna mata" (parameter TakeProfit robot) dari salah satu orang tuanya - "Zhenya",
  • "Pertumbuhan" (periode robot rata-rata bergerak) Nikita diwarisi dari "Sasha" ... tetapi sedikit disesuaikan ke arah orangtua lain, Zhenya.

Faktanya adalah bahwa semakin kecil dimensi ruang optimasi (dalam kasus kami sama dengan 2), "semakin dekat" keturunannya. Algoritma optimisasi genetik tidak secara ketat menentukan aturan untuk “pewarisan” gen untuk anak perempuan. Oleh karena itu, secara acak, Nikita meminjam warna matanya tanpa perubahan, tetapi ternyata dia berada di tengah-tengah antara kedua orang tua, lebih dekat dengan salah satu dari mereka. Dalam implementasi saya, dengan kesuksesan yang sama, Nikita dapat meminjam parameter asli dari kedua orang tua.

Langkah ketiga adalah berkembang biak


Penggerak proses evolusi, seleksi alam. 4 dari 10 individu terbaik memberi 10 lebih banyak keturunan. Sekarang kami memiliki 20 orang. Algoritma optimasi genetik melibatkan mempertahankan ukuran populasi yang konstan. 10 orang harus “mati”. Dalam implementasi ini, sebagian besar individu dari generasi pertama "mati", dari 80% hingga 100%.
Dengan demikian, dalam contoh kita, generasi baru akan terdiri dari 0 ... 2 orang tua dan 8 - 10 keturunan mereka. Dengan kata lain, jika Anda menghilangkan lirik, vektor baru dari parameter robot perdagangan akan dihitung dari vektor yang diperoleh pada langkah sebelumnya, "propagasi" (kombinasi) dari 4 tes terbaik terbaik. Sebagian besar "orang tua" tidak akan menerima partisipasi dalam iterasi seleksi baru (opsi lain untuk menerapkan seleksi dimungkinkan).

Algoritma selesai


Reproduksi dan seleksi diulang N kali. Secara khusus, dalam contoh kami, untuk perbandingan dengan tiga algoritma yang diuji sebelumnya, 4 generasi dari 10 individu diuji, total 40 tes.
Tetapi mungkin saja populasi lain akan runtuh. Dengan kata lain, semua tes akan berada di sekitar beberapa titik. Untuk menghindari situasi ini, beberapa mekanisme digunakan, khususnya:

  • infus "darah segar" ke dalam populasi. Untuk keturunan populasi saat ini ditambahkan beberapa individu baru yang diperoleh secara kebetulan, dengan cara yang sama seperti populasi awal terbentuk,
  • mekanisme mutasi: seorang individu keturunan mungkin memiliki beberapa karakteristik (koordinat) yang sedikit berbeda dari karakteristik orang tuanya:



dalam contoh ini

  • karakteristik keturunan Jane dan Joss - "pertumbuhan" dan "warna mata" dipinjam dari masing-masing orang tua,
  • karakteristik keturunan Sam dan Siri agak berbeda dari karakteristik yang sesuai dari kedua individu orangtua.

Dalam implementasi saya, meskipun ada mutasi dan "individu segar," populasi harus diperbarui secara berkala untuk menghindari konvergensi prematur, lokalisasi seluruh populasi dalam ruang terbatas.

Jika kita kembali ke data asli tempat kita menguji algoritma Monte Carlo, gradient descent dan algoritma dengan nama kerja "sea battle", proses pengoptimalan dapat diilustrasikan dengan animasi berikut:



Seperti yang dapat Anda lihat dari animasi, pada awalnya pengaturan titik kacau, tetapi, dengan generasi berikutnya, cenderung ke daerah dengan nilai DF yang lebih tinggi.

Sekarang bandingkan algoritma pada permukaan yang sama: P = f ( M , T ):



Monte Carloketurunan gradien"Pertempuran laut"algoritma genetika
95,7%92,1%97,0%96,8%

Nilai rata-rata dari ekstrum CF yang ditemukan sebagai persentase dari nilai global.

Tentu saja, terlalu dini untuk menilai dengan satu set data input, tetapi sejauh ini GA, dalam kaitannya dengan robot perdagangan kami, lebih rendah daripada algoritma "pertempuran laut":

  • cukup tidak signifikan - dengan rata-rata nilai kuasi-optimal CF,
  • memberikan perkiraan terburuk dari stabilitas parametrik dari algoritma perdagangan, karena ia tidak “menyelidiki” lingkungan dari tuple parameter kuasi-optimal yang ditemukan dalam detail yang terlalu sedikit.

Tes akhir 4 algoritma optimasi


Tes akhir dilakukan pada 4 set data input - hasil tes strategi perdagangan pada 4 segmen yang berbeda dari sejarah harga ( EURUSD : 2016, EURUSD: 2017, XAUUSD : 2016, XAUUSD: 2017).



(contoh filter digital sebagai fungsi dari dua parameter untuk 4 kali rangkaian harga)

Kali ini, optimasi dilakukan berdasarkan 3 parameter:

  1. periode rata-rata bergerak "cepat"
  2. periode rata-rata bergerak “lambat”
  3. TakeProfit (untung dari transaksi, dalam persen, setelah mencapai di mana transaksi selesai).

Setiap parameter mengambil 20 nilai yang berbeda. Total untuk membangun tabel
P = F (Mf, Ms, T)
di mana P adalah laba, Mf adalah periode moving average "cepat", Ms adalah periode moving average "lambat", T adalah TakeProfit,
20 * 20 * 20 = 8.000 iterasi pengujian dilakukan.

Optimalisasi dilakukan dengan batasan 160, 400, dan 800 tes (perhitungan DF dalam koordinat yang dipilih). Setiap kali, hasilnya dirata-rata untuk 1.000 iterasi optimasi. Nilai DF rata-rata untuk vektor kuasi-optimal parameter yang ditemukan adalah:
Monte Carloketurunan gradien"Pertempuran laut"algoritma genetika
84,1%83,9%77.0%92,6%

Secara terpisah, perlu dicatat bahwa GA menunjukkan hasil yang baik bahkan dengan persentase tes kecil dari jumlah opsi yang memungkinkan:
tesMonte Carloketurunan gradien"Pertempuran laut"algoritma genetika
160 dari 8.00079,1%76,7%73,1%87,7%
400 dari 8.00084,7%85.0%77,4%93,7%
800 dari 8.00088,6%90,1%80,4%96,3%

Alih-alih sebuah kesimpulan


Saya agak terkejut dengan hasilnya, yang menunjukkan algoritma optimasi genetik. Saya tidak berpikir bahwa secara khusus "paradigma genetik" dari metode ini memberinya tempat pertama dalam daftar. Dalam arti tertentu, menurut logika pilihan koordinat, itu menyerupai metode dikotomi / rasio emas. Mungkin patut dicoba salah satu dari algoritma ini dan membandingkan GA dengan itu.

Kembali ke robot perdagangan, perlu dicatat bagaimana "relief" dari permukaan yang dibentuk oleh CF (laba) berubah dari tahun ke tahun. Artinya, setelah "mengoptimalkan" robot pada sejarah 2017, tidak masuk akal untuk menerapkan pengaturan ini pada 2018 (kuartal pertama, bulan, minggu ... 2018).

Strategi perdagangan tiruan, dogmatis, dan tak berdaya seperti kita (membeli di persimpangan moving average) mungkin tidak akan segera keluar dari gaya. Sayangnya, saya tidak punya strategi lain. Oleh karena itu, saya mengaitkan untung atau rugi robot perdagangan karena keberuntungan daripada keuntungan / kerugian dari algoritma. Oleh karena itu, tugas optimasi parametrik robot perdagangan bagi saya pribadi secara eksklusif untuk kepentingan akademis.

Source: https://habr.com/ru/post/id430138/


All Articles