BAB IV PEMBUATAN APLIKASI DAN PENGUJIAN
4.1 Pembuatan Aplikasi Pada tahap ini adalah tahap membuat plugin baru yaitu file DLL serta implementasi algoritma semut pada konsep JST dalam menentukan gambar grafik indikator prediksi pergerakan saham yang dibangun menggunakan aplikasi yang sudah ada yaitu amiBroker.
4.1.1 Spesifikasi Perangkat Keras dan Perangkat Lunak Perangkat keras dan perangkat lunak yang digunakan dalam membuat indikator baru menggunakan algoritma semut pada tugas akhir ini adalah sebagai berikut: Spesifikasi perangkat keras yang digunakan pada penelitian ini adalah sebagai berikut: 1. Laptop acer Aspire 4315. 2. Modem. 3. Mouse. Spesifikasi perangakat lunak yang digunakan pada penelitian ini adalah sebagai berikut: 1. Windows XP SP2. 2. AmiBroker versi 5.50. 3. Microsoft Visual Studio 2008. 4. ADK.
4.1.2
Pembuatan File DLL Untuk pembuatan file DLL pada penelitian ini menggunakan Microsoft Visual Studio
2008 yang nantinya akan disimpan didalam folder plugin pada amibroker. Berikut langkahlangkah pembuatan file DLL: 1. Memilih Menu file kemudian tekan New kemudian pilih Project. 2. Dari daftar proyek yang tersedia pilih Visual C++ kemudian memilih Win32 Console Application. 57
58
3. Mengisi nama project di field “Name” dengan nama apa saja (di dalam penelitian ini diberi nama “AntColony”). 4. Memilih Ok. 5. Kemudian akan tampil Win32 Application Wizard. 6. Pilih Finish. 7. Sebuah proyek DLL sederhana telah dibuat, file didalam folder project yang telah di create terdapat AntColony.cpp, stdafx.h, stdafx.cpp, dllmain.cpp, targetver.h 8. Kemudian menyalin “Plugin.cpp”,”Plugin.h” dan Plugin_Legacy.h” file dari plugin (files dari folder ADK). 9. Klik kanan pada folder “AntColony” yang dibuat, pilih add kemudian New item 10. Dari dialog file tersebut pilih “Plugin.cpp, “Plugin.h”, “Plugin_Legacy.h” file dan klik Ok. Sekarang file-file tersebut sudah ada pada folder proyek dan kemudian dapat membangunnya dan mengembangkannya lebih jauh. Setelah langkah-langkah tersebut selesai dilakukan maka proyek sampel dengan nama AntColony siap untuk dimodifikasi sesuai dengan kebutuhan (Source code terlampir). Gambar 4.1 adalah gambar screenshot dari Microsoft visual studio 2008 yang telah dibuat proyek membuat file DLL dengan nama AntColony. Di dalamnya terdapat berbagai source file yang mendukung pembuatan file DLL.
Gambar 4.1 Tampilan berbagai file dari proyek AntColony pada Microsoft visual studio 2008
59
Setelah program berhasil di jalankan maka Microsoft Visual Studio 2008 akan secara otomatis akan merubah program yang berisi program bahasa C ke dalam file DLL. File DLL yang bernama AntColony.dll tersebut kemudian di salin ke dalam folder Plugins yang terdapat pada folder amiBroker di Program files. Tujuan dari di simpannya file DLL (AntColony.dll ) pada folder plugins pada amiBroker adalah untuk menampilkan gambar grafik indikator pergerakan saham dari implementasi algortima semut pada konsep JST. Untuk menampilkannya yaitu menambah plugin baru yaitu file DLL, kemudian panggil file DLL tersebut melalui fungsi AFL pada formula editor.
4.1.3 Implementasi Jaringan Syaraf Tiruan Dengan Algoritma Semut pada Bahasa C Pada sub bab ini akan menjelaskan bagaimana implementasi algoritma semut pada JST menggunakan bahasa pemrograman C.
4.1.3.1 Implementasi Algoritma Semut dalam Bahasa C Pada program ini akan dijelaskan pengimplementasian dari algoritma semut pada bahasa C. Impelementasi yang dibangun pada algortima semut terdiri dari fungsi utama, fungsi mencari jalur terbaik, fungsi memperbarui posisi semut, dan fungsi memperbarui feromone. Pada implementasinya terdapat beberapa fungsi tambahan lain yang digunakan untuk membantu fungsi-fungsi utama di atas. Pertama-tama adalah implementasi dari fungsi utama dari algoritma semut. Fungsi ini sebenarnya tidak akan digunakan di dalam fungsi yang akan diintegrasikan dengan program jaringan saraf tiruan, akan tetapi membantu memahami cara penggunaan fungsi-fungsi pembangun algoritma semut. Berikut ini adalah tampilan dari fungsi utama algoritma semut. Kode program dibawah ini menerangkan tentang awal mula program dengan menginisialisasi kota, semut, dan waktu. Semut diberikan maksimal iterasi hanya 1000 kali. Yang dimaksud dengan srand (time(NULL)) digunakan untuk menginisialisasi pembangkit nomor secara acak.
60 int main() { // inisialisasi kota, semut, dan waktu int numCities = 6; int numAnts = 4; int maxTime = 1000; srand(time(NULL));
Fungsi program ini untuk inisialisasi jarak pada semut. Angka-angka dibawah ini adalah jarak yang dilalui semut. Tipe data yang digunakan adalah integer, karena jarak dibulatkan, tidak dalam bilangan real (bilangan desimal). Struktur data yang digunakan adalah array dua dimensi untuk merepresentasikan jalur antara satu kota dengan kota lainnya. // inisialisasi jarak //int
jarak[6][6]
=
{{0,10,20,-1,-1,-1},{-1,0,3,8,10,-1},{-1,-1,0,15,7,-
1},{-1,-1,-1,0,14,5},{-1,-1,-1,-1,0,9},{-1,-1,-1,-1,-1,0}}; Int
jarak[6][6] =
{0,10,20,0,0,0,0,0,3,8,10,0,0,0,0,15,7,0,0,0,0,0,14,5,0,0,0,0,0,9,0,0,0,0,0,0 };
Fungsi program ini adalah untuk mendeklarasikan semut, feromon, dan kota (rute terbaik). Untuk jalur semut diwakilkan dengan ant, dan memiliki tipe data integer dan berstruktur data larik dua dimensi. // init ants int ants[numAnts][numCities]; double pheromone[Ant][City]; int ruteTerbaik[numCities]; show2d(jarak, numAnts, numCities);
Fungsi program ini untuk inisialisasi semut, jumlah semut, dan kota. Parameter yang digunakan untuk inisialisasi semut adalah jalur semut, banyaknya kota, dan juga banyaknya semut. // inisialisasi ants initAnts(ants, numAnts, numCities); show2d(ants, numAnts, numCities);
61
Fungsi ini adalah untuk memilih rute mana yang terbaik dari rute yang sudah ada. Parameter yang digunakan adalah rute terbaik, jalur semut dan juga jarak antar kota. // bestTrail BestTrail(ruteTerbaik, ants, jarak); show1d(ruteTerbaik, City);
Fungsi pada program ini adalah untuk Menghitung panjang jarak (rute) yang dilalui semut. Parameter yang digunakan adalah feromone, jalur semut dan juga banyak kota. // init pheromones initPheromone(pheromone, Ant, City); show2dd(pheromone, Ant, City);
int time = 0;
Kode program di bawah untuk melakukan iterasi pada perjalan semut berikutnya, di mana dilakukan juga pembaruan feromon dan pencarian rute terbaik. Iterasi dilakukan sampai dengan banyaknya waktu yang telah diinisialisasi. while(time < maxTime) { updateAnts(ants, pheromone, jarak); updatePheromone(pheromone, ants, jarak);
Jalur rute terbaik di simpan dalam sebuah variabel larik bertipe data integer dengan nama curBestTrail. Bertipe integer karena yang disimpan adalah urutan kota-kota yang menghasilkan rute terbaik atau yang memiliki jarak terpendek pada saat ini. Sedangkan untuk jarak rute terpendek saat ini disimpan dalam sebuah variabel bertipe data double dengan nama curBestLength. Bertipe double karena jarak rute terpendek kemungkinan akan menghasilkan bilangan desimal. int curBestTrail[City]; BestTrail(curBestTrail, ants, jarak); double curBestLength = Length(curBestTrail, jarak);
62
Membandingkan jarak terbaik saat ini dengan jarak terbaik yang sudah ada. Jika jarak terbaik saat ini lebih kecil dari jarak terbaik yang sudah ada, maka jarak terbaik yang sudah ada diperbarui dengan jarak terbaik saat ini. if(curBestLength < bestLength) { bestLength = curBestLength; int i; for(i=0;i
Program di atas dimulai dengan inisialisasi dari varibel-variabel yang digunakan di dalam algoritma semut. Beberapa variabel yang digunakan antara lain variabel yang menampung banyak semut, banyak kota, jarak, posisi semut, feromone, jalur (rute), dan juga jarak jalur. Pada tahap pertama, fungsi utama mencari jalur terbaik berdasarkan inisialisasi pertama kali dan selanjutnya adalah menginisialisasi feromone. Setelah itu, fungsi utama masuk ke dalam perulangan, dan menjalankan fungsi updateAnts untuk memperbarui posisi dari semut, dan kemudian menjalankan fungsi updatePheromone untuk memperbarui feromone yang telah dilalui oleh semut tersebut. Perulangan akan berakhir jika waktu yang ditentukan telah tercapai. Selanjutnya adalah menjalankan fungsi untuk mencari jalur terbaik. Implementasinya ke dalam bahasa C adalah sebagai berikut.
void BestTrail(int a[City], int ants[][City], int dists[][City]) { int aa[City]; int idxBestLength = 0; getRow2d(ants, aa, 0); double bestLength = Length(aa, dists); int k; int i; for(i = 0; i < City; i++) {
63 a[i] = aa[i]; } for(k = 1; k < Ant; k++) { getRow2d(ants, aa, k); double len = Length(aa, dists); if(len < bestLength) { bestLength = len; idxBestLength = k; for(i = 0; i < City; i++) { a[i] = aa[i]; } } } printf("bestLength: %f \n",bestLength); }
Fungsi di atas digunakan untuk mencari rute terbaik dengan parameter masukkan adalah larik penyimpan rute, posisi dari semut, dan jarak antar kota. Perhitungan jarak terbaik di ambil berdasarkan posisi masing-masing semut yang terekam di dalam posisi semut, kemudian dibandingkan jarak dari rute masing-masing semut.
4.1.3.2 Memperbarui Feromon Kode program dibawah ini mempunyai fungsi untuk memperbarui feromon. Hal pertama yang akan dilakukan saat memperbarui feromon adalah inisialisasi parameter-parameter seperti feromon, semut, jarak, dan kota. i, j, k adalah tipe data integer. yang dimaksud dengan int aa[city] adalah membuat matrik sementara untuk menampung satu jalur semut. getRow2d adalah untuk mengambil satu baris pada matrik 2 dimensi ke 1 dimensi, bertujuan agar bisa menganalisa satu per satu baris pada matrik tersebut. Pada progam ini juga terdapat fungsi mengkurur jarak, dist (matrik jarak) jika diimplementasikan adalah jarak. Double decrease pada program yaitu untuk menghitung variable berkurangnya feromon. EdgeInTrail adalah titik saat ini yang dilalui semut ada pada jalur atau tidak (titik ini sudah ada di posisi atau tidak). if(boolEIT == 1) pada fungsi program yaitu untuk menyeleksi jka titik saat ini dilalui, maka feromon diperbarui.
64
Prosedur program ini adalah untuk mengapdate feromon dengan parameter feromon, posisi semut, dan jarak.
void
updatePheromone(double
phero[][City],
int
ants[][City],
int
dists[][City]) { int i,j,k;
Kode program di bawah digunakan untuk memperbarui feromon dengan perulangan for. feromon yang diperbarui hanya feromon yang dilalui oleh semut saja. Dan setiap feromon akan mengalami penguapan. for(i=0; i
Proses pengurangan dan penambahan pheromone dilakukan oleh variable decrease dan variable increase. Kedua variable tersebut memiliki tipe data double. Dan untuk varible increase akan dihitung jika sebuah kota dilewati dan dengan rumus membagi Q (faktor penambahan pheromone) dengan panjang dari jalur. double len = Length(aa, dists); double decrease = (1.0 - rho) * phero[i][j]; double increase = 0.0; int boolEIT = EdgeInTrail(i,j,aa[k]); if(boolEIT == 1) // increase = Q/len; phero[i][j] = decrease + increase;
Baris program di atas digunakan untuk membatasi nilai feromon, jika kurang dari 0.0001 maka akan diberikan nilai 0.0001, jika lebih dari 100000, maka akan diberikan nilai 100000. if(phero[i][j] < 0.0001) phero[i][j] = 0.0001;
65 else if(phero[i][j] > 100000.0) phero[i][j] = 100000.0;
phero[j][i] = phero[i][j]; } } } }
4.1.3.3 Memperbarui jalur Semut dan Menuju Kota Selanjutnya Program ini menjelaskan tentang fungsi untuk memperbarui jalur dari semut dan memilih kota selanjutnya. Di dalamnya terdapat fungsi BuildTrail yaitu untuk memilih titik selanjutnya yang akan semut lalui dengan probabilitas berdasarkan perhitungan yang ada (terlampir pada BAB III). void updateAnts(int ants[][City], int phero[][City], int dists[][City]) { int i; for(i = 0; i < Ant; i++) { int start; int arr[City]; start = randomRange(0, City-1); buildTrail(arr, i, start, phero, dists); int j,k; for(j=0;j
4.1.3.4 Menghitung jarak semut Fungsi pada program ini adalah untuk menghitung jarak tiap-tiap jalur (rute) semut. Gambar 4.2 menggambarkan suatu matrik dua dimensi dimana pada satu baris tersebut di keluarkan menjadi matrik satu dimensi, gunanya untuk mempermudah analisis dengan
66
menghitung per satu baris. Kemudian sesuai urutanya, ukur jarak dari A – C – D – F – B (jarak dari A ke C, C ke D, D ke F, dan F ke B.
double Length(int *trail, int dists[City][City]) { double result = 0.0; int i, *z; for(i = 0;i < City-1; i++) { z = trail+i; result += (double)dists[*z][*(trail+i+1)]; } return result; }
4.1.3.5 Konsep Jaringan Syaraf Tiruan Pada Algortima Semut Fungsi utama untuk Jaringan Syaraf Tiruan Berikut adalah implementasi dari fungsi utama untuk menjalankan jaringan syaraf tiruan. Dibawah ini adalah menerangkan tentang inisialisasi variable pada JST, yaitu input, hidden. Dan output. Input diberi 4, hidden 4 dan output 1. int main(int argc, char** argv) { // inisialisasi variable int input = 4; int hidden = 4; int output = 1;
Kode program untuk mendeklarasikan larik yang menanmpung nilai dari perhitungan bobot antar layer, baik dari layer input ke hidden, dan dari layer hidden ke output. Semuanya menggunakan tipe data double, karena nilai yang disimpan bisa berupa bilangan desimal.
double in[input]; double v[input-1][hidden]; // untuk bobot input-hidden double vo[hidden]; // untuk bobot bias-hidden double wt[hidden]; // untuk bobot hidden-output
67 double zin[hidden]; // untuk penjumlahan bobot input double z[hidden]; // untuk output hidden double yin; // untuk bobot output output double y; // untuk aktifasi output int maxEpoch = 1000; double err = 0.01; double alpha = 1.0; srand(time(NULL));
Fungsi program ini adalah untuk memasukkan data yang dilakukan layer input untuk di alihkan ke hidden layer. // proses input data printf("Proses Input data: \n"); printf("Input x1: "); scanf("%lf",&in[0]); printf("Input x2: "); scanf("%lf", &in[1]); printf("Input x3: "); scanf("%lf",&in[2]);
double wo = randomRangeD();
Kode program di bawah digunakan untuk melakukan inisialisasi tiap-tiap bobot berdasarkan dari masukkan user pada kode program di atas.
// init bobot input-hidden initV(v,input-1,hidden); show2dd(v, input-1,hidden); // init bobot bias-hidden initVoVt(vo, hidden); // init bobot hidden-output initVoVt(wt, hidden);
68
Kode program di bawah digunakan untuk menghitung bobot dari layer input ke layer hidden setelah dilakukan inisialisasi. Setelah bobot dihitung, kemudian dilakukan aktifasi menggunakan fungsi sigmoid.
Dilanjutkan dengan perhitungan bobot dari layer hidden ke
output dan perhitungan aktifasi. Tahap ini adalah tahap awal dari jaringan saraf tiruan dan bobot diperoleh menggunakan fungsi acak. int i = 0; double eror = 0.0; pembobotan(zin,v,vo,in); aktifasiInput(z, zin); yin = pembobotanOutput(wo,wt); y = aktifasiOutput(yin); eror = hitungEror(y,eror);
Selanjutnya perulangan dilakukan sampai dengan iterasi yang ditentukan atau sampai eror yang diperoleh kurang dari 0.01. Sebelum dihitung kembali, bobot diperbarui menggunakan algoritma semut. while(i < maxEpoch && eror > 0.01) { double
optimalBobot
=
aco_result(zin[0],zin[1],zin[2],zin[3]); int j; for(j = 0; j < hidden; j++) { zin[j] = optimalBobot; } pembobotan(zin,v,vo,in); aktifasiInput(z, zin); yin = pembobotanOutput(wo,wt,z); y = aktifasiOutput(yin); eror = hitungEror(y,eror); i++; } return 0; }
Fungsi utama ini digunakan untuk menjalankan beberapa fungsi yang mendukung dari jaringan syaraf tiruan. Beberapa fungsi yang digunakan di dalam jaringan syaraf tiruan adalah
69
fungsi pembobotan, aktifasi, dan hitung eror, serta fungsi untuk memberikan hasil optimal dari bobot yang diperbarui dengan menggunakan algoritma semut. Fungsi untuk pembobotan terdiri dari dua, yaitu pembobotan untuk layer input ke layer hidden, dan pembobotan untuk layer hidden ke layer output. Untuk pembobotan dari layer input ke layer hidden kode programnya adalah sebagai berikut:
void
pembobotan(double
a[hidden],
double
b[][hidden],
double
c[hidden],
double d[hidden]) { int i,j,k; for(i = 0; i < 3; i++) { double kali = 0.0; for(j = 0; j < hidden-1; j++ ) { kali = kali + b[j][i]*d[j]; } a[i] = c[i] + kali; } }
Fungsi pembobotan di atas digunakan untuk memperbarui matrik yang menampung nilai bobot dari hubungan antara input layer dengan hidden layer. Nilai bobot dihitung dari penambahan nilai input ditambah dengan bobot yang menuju ke masing-masing hidden layer. Untuk perhitungan pembobotan dari hidden layer ke output layer, dilakukan dengan melakukan perhitungan penambahan dari jumlah perkalian antara bobot hidden-output dengan hasil aktifasi dari hidden layer. Untuk pembobotan dari hidden layer ke output layer kode programnya adalah sebagai berikut.
double pembobotanOutput(double ww, double w[hidden], double wtwt[hidden]) { int i,j; double val = 0; double kali; for(i = 0; i < hidden; i++) { kali = kali + w[i]*wtwt[i]; } val = ww + kali; return val;
70 }
Sedangkan untuk kode program aktifasi yang dapat dilakukan adalah sebagai berikut memanggil fungsi sigmoid dengan masukkan nilai dari bobot yang akan dihitung. Fungsi aktifasi akan memperbarui elemen dari sebuah larik yang menyimpan nilai hasil aktifasi, pada kode program di atas diwakilkan dengan variabel zz. void aktifasiInput(double zz[3], double zinzin[3]) { int i; for(i = 0; i < 3; i++) { zz[i] = sigmoid(zinzin[i]); } }
Fungsi aktifasi output tidak jauh berbeda dengan fungsi aktifasi output. double aktifasiOutput(double yinyin) { double val = sigmoid(yinyin); return val; }
Aktifasi yang dilakukan pada kedua fungsi di atas menggunakan fungsi sigmoid. Fungsi sigmoid yang digunakan dibuat dalam sebuah fungsi tersendiri dengan parameter adalah nilai yang akan dihitung dan bertipe data double. Untuk fungsi sigmoidnya adalah sebagai berikut:
double sigmoid(double x) { double exp_value; double return_value; /*** Exponential calculation ***/ exp_value = exp(-x); /*** Final sigmoid value ***/ return_value = 1 / (1 + exp_value); return return_value; }
71
4.1.4. Penerapan AFL Untuk Memanggil Fungsi File DLL Program berikut adalah template AFL jika ingin memanggil fungsi indikator baru melalui formula editor pada amiBroker. Fungsi dari program ini adalah untuk membentuk plot, garis pada amiBroker. CandleDll(); PlotOpen(); PlotHigh(); PlotLow(); PlotClose(); Prediction();
Agar file DLL yang telah dibuat bisa di panggil oleh fungsi program tersebut, maka pada file DLL yang dibuat di dalamnya harus ada kode program untuk membuatnya di panggil atau di tampilkan pada amiBroker. Fungsi dibawah ini adalah membuat grafik pada amibroker, maksudnya adalah fungsi untuk membentuk batang lilin (candlestik). Amivar adalah sebuah variabel yang disediakan oleh Amibroker Development Kit. Amivar memperbolehkan sebuah variabel dapat dikenal di dalam amibroker. AmiVar CandlePlot (int NumArgs, AmiVar *ArgsTable) { // arguments table AmiVar arg[6]; arg[0].type = VAR_ARRAY; arg[0].array = gSite.GetStockArray(3); arg[1].type = VAR_STRING; arg[1].string = ""; arg[2].type = VAR_FLOAT; arg[2].val = 16; arg[3].type = VAR_FLOAT; arg[3].val = 64; AmiVar result = gSite.CallFunction("Plot", 6, arg); return result; }
72
Fungsi ini digunakan untuk menampilkan harga Open pada tampilan amibroker. Untuk mendapatkan harga Open, untuk mengambilnya diperlukan fungsi GetStockArray yang berada di dalam struck gSite. Open berada pada urutan ke-0. // Function for O
AmiVar PlotO (int NumArgs, AmiVar *ArgsTable) { AmiVar arg[6]; arg[0].type = VAR_ARRAY; arg[0].array = gSite.GetStockArray(0); arg[1].type = VAR_STRING; arg[1].string = "OPEN"; arg[2].type = VAR_FLOAT; arg[2].val = 16; arg[3].type = VAR_FLOAT; arg[3].val = 256; AmiVar result = gSite.CallFunction("Plot", 6, arg); return result; }
Fungsi untuk menampilkan harga High pada amibroker. Untuk mendapatkan harga High, untuk mengambilnya diperlukan fungsi GetStockArray yang berada di dalam struck gSite. High berada pada urutan ke-1. // Function for H
AmiVar PlotH (int NumArgs, AmiVar *ArgsTable) { AmiVar arg[6]; arg[0].type = VAR_ARRAY; arg[0].array = gSite.GetStockArray(1); arg[1].type = VAR_STRING; arg[1].string = "HIGH"; arg[2].type = VAR_FLOAT; arg[2].val = 16; arg[3].type = VAR_FLOAT; arg[3].val = 256;
73 AmiVar result = gSite.CallFunction("Plot", 6, arg); return result; }
Fungsi untuk menampilkan harga Low pada tampilan Amibroker. Untuk mendapatkan harga Low, untuk mengambilnya diperlukan fungsi GetStockArray yang berada di dalam struck gSite. Low berada pada urutan ke-2. // Function for Low
AmiVar PlotL (int NumArgs, AmiVar *ArgsTable) { AmiVar arg[6]; arg[0].type = VAR_ARRAY; arg[0].array = gSite.GetStockArray(2); arg[1].type = VAR_STRING; arg[1].string = "LOW"; arg[2].type = VAR_FLOAT; arg[2].val = 16; arg[3].type = VAR_FLOAT; arg[3].val = 256; AmiVar result = gSite.CallFunction("Plot", 6, arg); return result; }
Fungsi ini digunakan untuk menampilkan harga Close pada tampilan Amibroker. Untuk mendapatkan harga Close, untuk mengambilnya diperlukan fungsi GetStockArray yang berada di dalam struck gSite. Close berada pada urutan ke-3. // Function for Close AmiVar PlotC (int NumArgs, AmiVar *ArgsTable) { AmiVar arg[6]; arg[0].type = VAR_ARRAY; arg[0].array = gSite.GetStockArray(3); arg[1].type = VAR_STRING; arg[1].string = "CLOSE"; arg[2].type = VAR_FLOAT;
74 arg[2].val = 16; arg[3].type = VAR_FLOAT; arg[3].val = 256; AmiVar result = gSite.CallFunction("Plot", 6, arg); return result; }
Ini adalah fungsi program untuk menampilkan grafik pergerakan saham menggunakan jaringan saraf tiruan dan algoritma semut. Pertama adalah inisialisasi variable open, close, high, low, dan tipe data pada masing-masing variabel. AmiVar Prediction((int NumArgs, AmiVar *ArgsTable) { AmiVar result; result = gSite.AllocArrayResult();
float Open float Close
= ArgsTable[ 0 ].array; = ArgsTable[ 1 ].array;
float High = ArgsTable[ 2 ].array; float Low = ArgsTable[ 3 ].array; double in[input];
Proses untuk mendapatkan data dilakukan dengan mengambil data dari Harga Open, Close, High, dan Low dari setiap hari. Data-data tersebut di simpan ke dalam larik yang berfungsi untuk menyimpan data masukkan ke layer input. in[0] = Open; in[1] = Close; in[2] = High; in[3] = Low;
Untuk fungsi Inisialisasi bobot sama dengan fungsi inisialisasi yang telah dijelaskan di dalam sub bab jaringan saraf tiruan. double wo = randomRangeD(); // init bobot input-hidden initV(v,input-1,hidden);
75 // init bobot bias-hidden initVoVt(vo, hidden); // init bobot hidden-output initVoVt(wt, hidden); int i = 0; double eror = 0.0; pembobotan(zin,v,vo,in); aktifasiInput(z, zin); yin = pembobotanOutput(wo,wt,z); y = aktifasiOutput(yin); eror = hitungEror(y,eror); while(i < maxEpoch && eror > 0.01) { double optimalBobot = aco_result(zin[0],zin[1],zin[2],zin[3]); int j; for(j = 0; j < hidden; j++) { zin[j] = optimalBobot; } pembobotan(zin,v,vo,in); aktifasiInput(z, zin); yin = pembobotanOutput(wo,wt); y = aktifasiOutput(yin); eror = hitungEror(y,eror); i++; }
Fungsi dibawah ini adalah untuk mencatak grafik dari hasil implementasi perhitungan jaringan saraf tiruan menggunakan algoritma semut yang disimpan di dalam variable tersendiri. AmiVar argPlot[6]; argPlot[0].type = VAR_ARRAY; argPlot[0].array = eror; argPlot[1].type = VAR_STRING; argPlot[1].string = "Predictioin"; argPlot[2].type = VAR_FLOAT; argPlot[2].val = 3; argPlot[3].type = VAR_FLOAT; argPlot[3].val = 1; AmiVar result = gSite.CallFunction("Plot", 6, argPlot);
76 return result; }
4.2 Pengujian Pengujian pada sistem yang baru dibangun dilakukan melalui tahap pengujian white box yang menggunakan teknik pengujian Basis Path (Basis Path Testing).
4.2.1
Pengujian White Box Pengujian white box merupakan metode perancangan test case yang menggunakan
struktur kontrol dari perancangan prosedural dalam mendapatkan test case. Metode yang digunakan di dalam pengujian white box adalah Basis Path. Metode basis path memungkinkan pendesain kasus uji untuk membuat perkiraan lojik yang kompleks dari desain prosedural dan menggunakan perkiraan ini untuk mendefinisikan aliran eksekusi. a. Pengujian White box pencarian jalur terpendek dengan algoritma semut. Berikut ini pseudocode algoritma semut.: 1.
Inisialisasi jarak, posisi semut, dan feromon
2.
Hitung rute terbaik
3.
While iterasi < waktu yang ditentukan
4.
Perbarui jalur semut
5.
Perbarui feromone
6.
Cari rute terbaik saat ini
7.
If rute terbaik saat ini < rute terbaik
8.
Ganti rute terbaik dengan rute terbaik saat ini
9.
End if
10.
Penambahan iterasi
11. End while 12. Return rute terbaik 13. End
77
Berdasarkan pseudocode pencarian jalur terpendek pada algoritma semut di atas maka dihasilkan diagram alirnya pada Gambar 4.2 sebagai berikut.
Gambar 4.2 Diagram alir algoritma Semut
Dari diagram alir di atas, dapat dihitung cyclomatic complexity, yakni: 1. Flowgraph mempunyai 3 Region 2. V(G) = 14 – 13 + 2 = 3 3. V(G) = 2 Predicate Node + 1 = 3 Dari hasil perhitungan cyclomatic complexity terdapat 3 independent path yaitu: Path 1 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 Path 2 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 - 13 Path 3 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 6 – 7 – 8 – 9 – 10 – 11 – 12 - 13
78
Untuk melakukan uji coba basis path di atas digunakan graph matrik. Graph matrik merupakan matrik empat persegi yang mempunyai ukuran yang sama dengan jumlah node pada flowgraph algortima semut di atas adalah sebagai berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
1
1-1 = 0 1
2
1-1 = 0 1
3
1-1 = 0 1
4
1-1 = 0 1
5
1-1 = 0 1
6
1-1 = 0 1
7
1-1 = 0 1
8
1-1 = 0 1
9
1-1 = 0 1
10 1
11
1-1 = 0 1
1
12
2-1 = 1 1
2-1 = 1 0
13 SUM(E)+1
Gambar 4.3 Graph Matrik Algortima Semut.
b. Pengujian White box pencarian bobot nilai dengan jaringan syaraf tiruan. Berikut ini pseudocode jaringan syaraf tiruan pada:
n(E)-1
1.
baca harga saham sebagai input
2.
inisialisasi bobot dengan nilai acak.
3.
hitung bobot pada masing-masing layer
4.
aktifasi dengan menggunakan fungsi sigmoid pada tiap-tiap layer.
5.
hitung eror
6.
while kriteria berhenti belum terpenuhi
7.
hitung optimasi nilai bobot dengan algoritma semut
2+1 = 3
79
8.
perbarui nilai bobot
9.
hitung bobot kembali
10. aktifasi masing-masing node 11. hitung eror 12. tambah pencacah 13. end while 14. return nilai_output
Berdasarkan pseudocode di atas maka diagram alirnya sebagai berikut:
Gambar 4.4 Diagram alir JST
80
Dari diagram alir di atas, dapat dihitung cyclomatic complexity, yakni: 1. Flowgraph mempunyai 2 Region 2. V(G) = 14 – 14 + 2 = 2 3. V(G) = 1 Predicate Node + 1 = 2 Dari hasil perhitungan cyclomatic complexity terdapat 2 independent path yaitu: Path 1 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 - 14 Path 2 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 14
Untuk melakukan uji coba basis path di atas digunakan graph matrik. Graph matrik merupakan matrik empat persegi yang mempunyai ukuran yang sama dengan jumlah node pada flowgraph algortima semut di atas adalah sebagai berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
1
1-1 = 0 1
2
1-1 = 0 1
3
1-1 = 0 1
4
1-1 = 0 1
5
1-1 = 0 1
6
1-1 = 0 1
7
1-1 = 0 1
8
1-1 = 0 1
9
1-1 = 0 1
10
1-1 = 0 1
11
1-1 = 0 1
12 1
13
n(E)-1
1-1 = 0 1
2-1 = 1 0
14 SUM(E)+1
Gambar 4.5 Graph Matrik JST.
1+1 = 2
81
4.2.2
Analisis Hasil. Berdasaarkan hasil pengujian di atas, maka dapat diperoleh beberapa hasil dari kegiatan
tersebut, diantaranya: 1. Pengujian yang berhasil dilakukan adalah menggunakan pengujian white box dengan memakai metode Basis Path. 2. Pengujian pada tiap-tiap pseudocode yaitu dari pseudocode algoritma semut dan JST dibuat menjadi diagram alir dan kemudian di hitung cyclomatic complexity pada masingmasing pseudocode. 3. Algortima semut pada pengujian cyclomatic complexity mempunyai flowgraph 3 region yang di hitung berdasarkan aturan pengujian basis path. 4. Dari hasil perhitungan cyclomatic complexity pada algoritma semut dihasilkan 3 independent path dan graph matrik yang berjumlah sama yaitu 3, berikut adalah independent path yang dihasilkan: a. Path 1 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 b. Path 2 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 c. Path 3 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 5. Pencarian bobot nilai JST pada pengujian cyclomatic complexity mempunyai flowgraph 2 region yang dihitung berdasarkan aturan pengujian yang telah ditentukan. 6. Dari hasil perhitungan cyclomatic complexity pada JST dihasilkan 2 independent path dan graph matrik yang berjumlah sama yaitu 2, berikut adalah independent path yang dihasilkan: a.
Path 1 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 – 14
b.
Path 2 = 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 - 14
4.2.3 Perbandingan AntColony dengan Indikator Saham Lainnya. Gambar 4.3 adalah gambar grafik indikator prediksi pergerakan saham hasil dari implementasi dari algoritma semut pada konsep jaringan syaraf tiruan. Berdasarkan pada gambar
82
yang ditampilkan, indikator yang berwarna biru muda tampak sejalur dan searah mengikuti batang lilin (candlestick) dalam menunjukan fluktuasi harga saham. Hal ini mempertegas jika implementasi algortima semut pada konsep JST berhasil menyelesaikan masalah optimasi untuk mencari nilai optimal pada setiap titik-titik yang dilalui semut.
Gambar 4.6 Grafik indikator AntColony
Terlepas dari terselesaikannya masalah optimasi pada algortima semut menggunakan konsep JST, AntColony sebagai indikator baru untuk memprediksi pergerakan saham memiliki kekurangan dan kelebihannya dibandingkan dengan indikator lainnya seperti MA, RSI, dan MACD. Kekurangan dan kelebihan dalam memprediksi pergerakan saham menggunakan indikator AntColony adalah sebagai berikut: Kekurangan Indikator AntColony: 1. Menurut pakar saham, pergerakan saham yang baik ditunjukan adanya indikator yang tidak selalu berada pada bawah batang lilin (candlestick), dan AntColony mempunyai
83
posisi pergerakan indikator berada dibawah dari batang lilin. Jadi para trader tidak bisa memperkirakan dengan benar harga akan naik pada posisi berapa. 2. Indikator AntColony tidak cocok untuk melakukan perdagangan (trading) jangka panjang, karena memiliki garis pergerakan yang kasar
Kelebihan Indikator AntColony: 1. Sebagai pemain saham atau trader harus mengetahui batas bawah harga terendah saat itu juga, dan AntColony adalah satu-satunya indikator yang menjadi batas bawah dari pergerakan batang lilin. Para trader akan tahu berapa harga terendah pada saat itu, dan jarang terdapat batang lilin yang bisa menembus dari batas bawah indikator. 2. Indikator AntColony cocok untuk melakukan perdagangan jangka pendek. 3. Indikator AntColony selalu mengikuti tren, jika naik maka akan naik, jika turun maka akan turun.
4.2.3.1 Perbandingan Indikator AntColony dengan MA Gambar 4.4 merupakan gambar perbandingan antara indikator grafik prediksi pergerakan saham MA dan AntColony. MA berada pada gambar posisi atas, dan AntColony berada di posisi bawah. MA memiliki pergerakan yang halus dibandingkan dengan AntColony. Pada pergerakan yang halus seperti MA hanya bisa memprediksi pergerakan saham jangka panjang, dan tidak bisa memprediksi jangka pendek. Lain halnya dengan AntColony yang cocok untuk melakukan perdagangan jangka pendek. Untuk perdagangan saham jangka panjang lebih bagus menggunakan pergerakan yang halus dibandingkan dengan pergerakan yang kasar seperti AntColony. Jika MA dipaksakan untuk melakukan perdagangan jangka pendek, terkadang indikator akan menunjukan tren yg salah, yg sharusnya naik tetapi sebaliknya akan turun. Bereda dengan AntColony yang benar-benar mengikuti tren.
84
Gambar 4.7 Perbandingan antara grafik indikator MA dan AntColony
4.2.3.2 Perbandingan Indikator AntColony dengan RSI Gambar 4.5 merupakan gambar perbandingan antara indikator grafik prediksi pergerakan saham RSI dan AntColony. RSI berada pada gambar posisi atas, dan AntColony berada di posisi bawah. Kedua indikator ini memiliki kemiripan yang sama yaitu memiliki pergerakan yang bagus untuk perdagangan saham jangka pendek, dan tidak cocok jangka panjang. Tetapi disini RSI lebih bagus dibandingkan dengan AntColony, karena indikator RSI mengetahui tren lebih awal dari pada AntColony. Terlihat pada gambar jika dengan waktu yang sama RSI jauh lebih dahulu menempati garis tren bawah, tetapi AntColony tidak mencapai garis grafik yang diperlihatkan RSI. Pada gambar terlihat jika RSI hanya menampilkan garis indikator saja, dikarenakan RSI hanya menampilkan grafik saja tanpa batang lilin (candlestick).
85
Gambar 4.8 Perbandingan antara grafik indikator RSI dan AntColony
4.2.3.3 Perbandingan Indikator AntColony dengan MACD Gambar 4.6 merupakan gambar perbandingan antara indikator grafik prediksi pergerakan saham MACD dan AntColony. MACD berada pada gambar posisi atas, dan AntColony berada di posisi bawah. Terlihat pada gambar keduanya jika mereka mempunyai perbedaan, pada MACD akan memperlihatkan kapan pada saat tren akan menguat, apakah akan turun atau naik. Salah satu perbandingan MACD dengan AntColony adalah pada sisi kekuatan tren lebih kuat MACD dari pada AntColony. AntColony lebih bagus digunakan sebagai batas bawah dari harga saham saat itu juga. Jadi, untuk menentukan tren lebih bagus menggunakan teknik MACD, dan menentukan batas bawah tren menggunakan AntColony.
86
Gambar 4.9 Perbandingan antara grafik indikator MACD dan AntColony