Next price predictor using Neural Network

Deskripsi

Penulis:

gpwr

Riwayat Versi:

06/26/2009 – menambahkan indikator baru BPNN Predictor dengan Smoothing.mq4, di mana harga dihaluskan menggunakan EMA sebelum prediksi.

08/20/2009 – mengoreksi kode yang menghitung fungsi aktivasi neuron untuk mencegah pengecualian aritmatika; memperbarui BPNN.cpp dan BPNN.dll

08/21/2009 – menambahkan pembersihan memori di akhir eksekusi DLL; memperbarui BPNN.cpp dan BPNN.dll

Teori singkat Neural Networks:

Jaringan syaraf adalah model output yang dapat disesuaikan sebagai fungsi input. Terdiri dari beberapa lapisan:

  • lapisan masukanyang terdiri dari data masukan
  • lapisan tersembunyiyang terdiri dari node pemrosesan yang disebut neuron
  • lapisan keluaranyang terdiri dari satu atau beberapa neuron, yang keluarannya merupakan keluaran jaringan.

Semua node dari lapisan yang berdekatan saling berhubungan. Koneksi ini disebut sinapsis. Setiap sinaps memiliki koefisien penskalaan yang ditetapkan, yang dengannya data yang disebarkan melalui sinaps dikalikan. Koefisien penskalaan ini disebut bobot (w[i][j][k]). Di sebuah Jaringan Neural Feed-Forward (FFNN) data disebarkan dari input ke output. Berikut adalah contoh FFNN dengan satu lapisan input, satu lapisan output dan dua lapisan tersembunyi:

Topologi FFNN sering disingkat sebagai berikut: <# input> – <# neuron pada lapisan tersembunyi pertama> – <# neuron pada lapisan tersembunyi kedua> -…- <# output>. Jaringan di atas dapat disebut sebagai jaringan 4-3-3-1.

Data diproses oleh neuron dalam dua langkah, sesuai ditunjukkan dalam lingkaran dengan tanda penjumlahan dan tanda langkah:

  1. Semua input dikalikan dengan bobot terkait dan dijumlahkan
  2. Jumlah yang dihasilkan diproses oleh neuron fungsi aktivasiyang keluarannya adalah keluaran neuron.

Ini adalah fungsi aktivasi neuron yang memberikan nonlinier pada model jaringan saraf. Tanpa itu, tidak ada alasan untuk memiliki lapisan tersembunyi, dan jaringan saraf menjadi model autoregresif linier (AR).

File perpustakaan tertutup untuk fungsi NN memungkinkan pemilihan antara tiga fungsi aktivasi:

  • sigmoid sigm(x)=1/(1+exp(-x)) (#0)
  • tangen hiperbolik tanh(x)=(1-exp(-2x))/(1+exp(-2x)) (#1)
  • fungsi rasional x/(1+|x|) (#2)

Ambang aktivasi fungsi-fungsi ini adalah x=0. Ambang batas ini dapat dipindahkan sepanjang sumbu x berkat input tambahan dari setiap neuron, yang disebut masukan biasyang juga memiliki bobot yang ditetapkan untuknya.

Jumlah input, output, lapisan tersembunyi, neuron di lapisan ini, dan nilai bobot sinaps sepenuhnya menggambarkan FFNN, yaitu model nonlinier yang dibuatnya. Untuk menemukan bobot jaringan harus dilatih. Selama pelatihan yang diawasi, beberapa set input sebelumnya dan output yang diharapkan terkait diumpankan ke jaringan. Bobot dioptimalkan untuk mencapai kesalahan terkecil antara keluaran jaringan dan keluaran yang diharapkan. Metode optimasi bobot yang paling sederhana adalah propagasi balik kesalahan, yang merupakan metode penurunan gradien. Fungsi pelatihan terlampir Train() menggunakan varian metode ini, yang disebut Enhanced Resilient back-Propagation Plus (iRProp+). Metode ini dijelaskan di sini

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.1332

Kerugian utama dari metode optimasi berbasis gradien adalah bahwa mereka sering menemukan minimum lokal. Untuk deret kacau seperti deret harga, permukaan kesalahan pelatihan memiliki bentuk yang sangat kompleks dengan banyak minima lokal. Untuk deret seperti itu, a algoritma genetika adalah metode pelatihan yang disukai.

File terlampir:

  • BPNN.dll – file perpustakaan
  • BPNN.zip – arsip semua file yang diperlukan untuk mengkompilasi BPNN.dll di C++
  • BPNN Predictor.mq4 – indikator yang memprediksi harga pembukaan di masa depan
  • Prediktor BPNN dengan Smoothing.mq4 – indikator yang memprediksi harga pembukaan yang diperhalus

File BPNN.cpp memiliki dua fungsi: Train() Test(). Train() digunakan untuk melatih jaringan berdasarkan input sebelumnya yang diberikan dan nilai output yang diharapkan. Test() digunakan untuk menghitung output jaringan menggunakan bobot yang dioptimalkan, yang ditemukan oleh Train().

Berikut adalah daftar parameter input (hijau) output (biru) dari Kereta():

kereta inp ganda[] – Input data pelatihan (array 1D yang membawa data 2D, yang lama dulu)
target ganda[]
Keluarkan data target untuk pelatihan (data 2D sebagai larik 1D, pertama yang terlama)

kereta ganda[]Output array 1D untuk menampung output bersih dari pelatihan

int ntr # set pelatihan
int UEW
Gunakan Ekst. Bobot untuk inisialisasi (1=gunakan extInitWt, 0=gunakan rnd)
double extInitWt[]
Masukkan larik 1D untuk menampung larik 3D dengan bobot awal eksternal

terlatih ganda[]Keluaran larik 1D untuk menampung larik 3D dengan bobot terlatih

int numLayers# lapisan termasuk input, tersembunyi dan output
int lSz[]
# neuron berlapis-lapis. lSz[0] adalah # dari input bersih
int AFT
Jenis fungsi aktivasi neuron (0:sigm, 1:tanh, 2:x/(1+x))
int OAF
1 mengaktifkan fungsi aktivasi untuk lapisan keluaran; 0 menonaktifkan
int nep
Maks # periode pelatihan
ganda maxMSE
UMK maks; pelatihan berhenti setelah maxMSE tercapai.

Berikut adalah daftar parameter input (hijau) output (biru) dari Uji():

tes inp ganda[]Masukkan data uji (data 2D sebagai larik 1D, terlama lebih dulu)

tes keluar ganda[]Output array 1D untuk menampung output bersih dari pelatihan (terlama lebih dulu)

int ntt# set tes
double extInitWt[]
Masukkan larik 1D untuk menampung larik 3D dengan bobot awal eksternal
int numLayers
# lapisan termasuk input, tersembunyi dan output
int lSz[]
# neuron berlapis-lapis. lSz[0] adalah # dari input bersih
int AFT
Jenis fungsi aktivasi neuron (0:sigm, 1:tanh, 2:x/(1+x))
int OAF
1 mengaktifkan fungsi aktivasi untuk lapisan keluaran; 0 menonaktifkan

Apakah akan menggunakan fungsi aktivasi di lapisan keluaran atau tidak (nilai parameter OAF) tergantung pada sifat keluaran. Jika keluarannya biner, yang sering terjadi pada masalah klasifikasi, maka fungsi aktivasi harus digunakan pada lapisan keluaran (OAF=1). Harap perhatikan bahwa fungsi aktivasi #0 (sigmoid) memiliki level jenuh 0 dan 1 sedangkan fungsi aktivasi #1 dan 2 memiliki level -1 dan 1. Jika keluaran jaringan merupakan prediksi harga, maka tidak diperlukan fungsi aktivasi pada lapisan keluaran (OAF=0).

Contoh penggunaan pustaka NN:

Prediktor BPNN.mq4 – memprediksi harga terbuka di masa depan. Input dari jaringan adalah perubahan harga relatif:

x[i]=Buka[test_bar]/Membuka[test_bar+delay[i]]-1.0

dimana penundaan[i] dihitung sebagai angka Fibonacci (1,2,3,5,8,13,21..). Output dari jaringan adalah prediksi perubahan relatif dari harga berikutnya. Fungsi aktivasi dimatikan di lapisan keluaran (OAF=0).

Masukan indikator:

extern int lastBar – Bilah terakhir di data sebelumnya
extern int futBars
# bar masa depan untuk diprediksi
extern int numLayers
# lapisan termasuk input, tersembunyi & output (2.6)
extern int numInput
# masukan
extern int numNeurons1
# neuron di lapisan tersembunyi atau keluaran pertama
extern int numNeurons2
# neuron di lapisan tersembunyi atau keluaran kedua
extern int numNeurons3
# neuron di lapisan tersembunyi atau keluaran ketiga
extern int numNeurons4
# neuron di lapisan tersembunyi atau keluaran keempat
extern int numNeurons5
# neuron di lapisan tersembunyi atau keluaran kelima
ntr int eksternal
# set pelatihan
extern int nep
Maks # zaman
extern int maxMSEpwr
set maxMSE=10^maxMSEpwr; pelatihan berhenti < maxMSE
int eksternal AFT
Jenis kegiatan. fungsi (0:sigm, 1:tanh, 2:x/(1+x))

Indikator memplot tiga kurva pada grafik:

  • warna merah – prediksi harga masa depan
  • warna hitam – harga pembukaan pelatihan sebelumnya, yang digunakan sebagai keluaran yang diharapkan untuk jaringan
  • warna biru – output jaringan untuk input pelatihan

Prediktor BPNN.mq4 – memprediksi harga terbuka yang dihaluskan di masa depan. Ini menggunakan pemulusan EMA dengan periode smoothPer.

Menyiapkan semua:

  1. Salin BPNN.DLL terlampir ke C:Program FilesMetaTrader 4expertslibraries
  2. Di metatrader: Alat – Opsi – Penasihat Ahli – Izinkan impor DLL

Anda juga dapat mengkompilasi file DLL Anda sendiri menggunakan kode sumber di BPNN.zip.

Rekomendasi:

  • Jaringan dengan tiga lapisan (numLayers=3: satu input, satu tersembunyi, dan satu output) sudah cukup untuk sebagian besar kasus. Menurut Teorema Cybenko (1989), sebuah jaringan dengan satu lapisan tersembunyi mampu mendekati setiap fungsi multivariat yang berkesinambungan hingga tingkat akurasi yang diinginkan; jaringan dengan dua lapisan tersembunyi mampu mendekati fungsi multivariat yang terputus-putus:
  • Jumlah optimal neuron pada lapisan tersembunyi dapat ditemukan melalui trial and error. “Aturan praktis” berikut dapat ditemukan dalam literatur: # neuron tersembunyi = (# input + # output)/2, atau SQRT(# input * # output). Lacak kesalahan pelatihan, yang dilaporkan oleh indikator di jendela ahli metatrader.
  • Untuk generalisasi, jumlah set pelatihan (ntr) harus dipilih 2-5 kali jumlah total bobot dalam jaringan. Misalnya, secara default, BPNN Predictor.mq4 menggunakan jaringan 12-5-1. Jumlah total bobot adalah (12+1)*5+6=71. Oleh karena itu, jumlah set pelatihan (ntr) setidaknya harus 142. Konsep generalisasi dan menghafal (over-fitting) dijelaskan pada grafik di bawah ini.
  • Data input ke jaringan harus diubah menjadi stasioner. Harga forex tidak stasioner. Disarankan juga untuk menormalkan input ke kisaran -1..+1.

Grafik di bawah ini menunjukkan fungsi linier y=b*x (x-input, y-output) yang outputnya dirusak oleh noise. Kebisingan tambahan ini menyebabkan keluaran yang diukur fungsi (titik hitam) menyimpang dari garis lurus. Fungsi y=f(x) dapat dimodelkan oleh jaringan saraf maju umpan. Jaringan dengan sejumlah besar bobot dapat dipasang ke data yang diukur dengan kesalahan nol. Perilakunya ditunjukkan sebagai kurva merah yang melewati semua titik hitam. Namun, kurva merah ini tidak ada hubungannya dengan fungsi linier asli y=b*x (hijau). Ketika jaringan over-fitted ini digunakan untuk memprediksi nilai masa depan dari fungsi y(x), itu akan menghasilkan kesalahan besar karena keacakan dari noise yang ditambahkan.

Sebagai imbalan untuk membagikan kode-kode ini, penulis memiliki sedikit permintaan untuk ditanyakan. Jika Anda dapat membuat sistem perdagangan yang menguntungkan berdasarkan kode-kode ini, silakan bagikan ide Anda dengan saya dengan mengirimkan email langsung ke vlad1004@yahoo.com.

Semoga beruntung!

Vendor Information

  • Address:
  • No ratings found yet!