Sabtu, 16 November 2019

Peramalan Harga Saham dengan Neural Network


Studi kasus untuk forecasting harga saham menggunakan neural network backpropagation sudah sangat banyak yang meneliti, adapun nilai harga saham terdiri dari open, high, low, dan close. Secara mudahnya untuk harga saham ada beberapa cara

  1. menggunakan harga close atau harga penutupan bursa pasar.
  2. Menggunakan ke 4 harga yaitu OHLC nya
  3. Atau average(OHLC) nya

Adapun untuk pemilihan emiten saham harus dalam kondisi normalnya yaitu



  1. Tidak dalam masa stocks split, right issue atau aksi korporasi lainnya yang bisa membuat harga bergerak secara fluktuatif.
  2. Bebas menggunakan harga close daily, weekly, atau monthly, untuk harga daily yaitu 5 hari kerja dalam seminggu, sedangkan harga close weekly akhir bursa yaitu jumat sore.
  3. Serta menggunakan data 2 tahun ke belakang agar bisa mencerminkan pergerakan harga saham.

Contoh emiten saham yang digunakan yaitu PP Property dengan kode saham PPRO, penulis menggunakan data weekly yang diambil dari www.investing.com
https://www.investing.com/equities/pp-properti-tbk-pt-historical-data





Desain input dan target mengikuti ilustrasi berikut (simple moving average) dengan aturan seperti berikut


4 Harga weekly average(OHLC) untuk memprediksi harga minggu ke 5, begitu juga dengan untuk prediksi minggu ke 6, diambil dari data dari minggu ke 2 sampai dengan minggu ke 5.

Acuan fraksi harga sahamhttps://www.idx.co.id/investor/mekanisme-perdagangan/



Sehingga fraksi harga saham sesuai dengan data historisnya mempunyai rentang 92 s.d 208  sebagai nilai acuan normalisasi data, akan tetapi diperluas bila saja terjadi penurunan/kenaikan batas diatas tersebut, maka diubah rentangnya yaitu 80 s/d 300. Teknik normalisasi menggunakan rumus http://www.softscients.web.id/2014/09/teknik-untuk-melakukan-normalisasi.html


Persiapan Dataset


Dataset yang digunakan disimpan dalam format excel terdiri dari 51 data tahun 2018 dan 44 data tahun 2019 ( Januari 2018 s.d November 2019)


Pada format investing.com menggunakan format weekly, misalkan pada perdagangan minggu I Januari (senin, 02 s.d 05 januari 2018) ditulis pada minggu, 07 Januari 2018.





Kolom yang digunakan yaitu Price/Closed, Open, High, dan Low disingkat dengan OHLC (open high low close) akan dicari nilai average nya.

clc;clear all;close all;warning off;
data=readtable('PPRO Historical Data.xlsx');
harga = [data.Price,data.Open,data.High,data.Low]; %ambil nilai OHLC
harga = mean(harga,2); %nilai reratanya


Penyusunan Array Input Target


Desain stacking/penyusunan array input target di desain dengan disusun array dengan aturan kolom ke 1 sampai dengan 4 merupakan input sedangkan kolom ke 5 adalah kolom target.

 
Pada baris ke 1:  data ke 1 s.d 4 untuk prediksi data ke 5,
Pada baris ke 2:  data ke 2 s.d 5 untuk prediksi ke 6
Sehingga kode nya menjadi berikut

clc;clear all;close all;warning off;
data=readtable('PPRO Historical Data.xlsx');
harga = [data.Price,data.Open,data.High,data.Low];
harga = mean(harga,2);
input_target = [];
for i = 1: length(harga)
    if i+4>length(harga)
        break
    end
    input_target(i,1:4) = harga(i:i+3);
    input_target(i,5) = harga(i+4);
    
end


Sehingga ukuran array input_target yaitu 91 baris * 5 kolom

Normalisasi data


Arsitektur jaringan yang digunakan sangat sederhana yaitu menggunakan fungsi logsig dan 1 layer hidden (7 node), kamu bisa baca link berikut
https://www.softscients.web.id/2019/11/deteksi-kanker-payudara-dengan-neural.html
sehingga dibutuhkan normalisasi data, baca link berikut http://www.softscients.web.id/2014/09/teknik-untuk-melakukan-normalisasi.html. Seperti sebelumnya yang telah ditentukan nilai  minimal = 80 dan maksimal 300, maka kode diatas secara lengkap sebagai berikut:

clc;clear all;close all;warning off;
data=readtable('PPRO Historical Data.xlsx');
harga = [data.Price,data.Open,data.High,data.Low];
harga = mean(harga,2);
input_target = [];
for i = 1: length(harga)
    if i+4>length(harga)
        break
    end
    input_target(i,1:4) = harga(i:i+3);
    input_target(i,5) = harga(i+4);
    
end
maksimal = 300;
minimal = 80;
delta = maksimal-minimal;
 
input_target_normalisasi = (input_target-minimal)./delta; 

Split Dataset Input dan Target


Tahap selanjutnya menggunakan slicing array yaitu untuk memisahkan array input dan target, dengan kode sebagai berikut


P = input_target_normalisasi(:,1:4); %ambil kolom 1 s.d 4
T = input_target_normalisasi(:,end); %ambil kolom 5 atau yang terakhir

Berikut grafik overlay untuk target dan prediksi dengan hasil RMSE 0.01942 (belum maksimal)




Dengan nilai RMSE diatas, maka model bisa kita gunakan untuk memprediksi harga average OHLC saham PPRO minggu ke 3 bulan November (18 s.d 22 November 2019) menggunakan data dari 20-Okt-19;  27-Okt-19; 03-Nov-19; 10-Nov-19

data ke 91 terdiri dari 20-Okt-19; 27-Okt-19; 03-Nov-19; 10-Nov-19
  102.2500  101.7500   98.7500   95.2500


prediksi_92 =

   97.2781




Sesuai dengan hasil peramalan bahwa harga sama average pada 17 November 2019 yaitu 97.2781 atau dibulatkan menjadi 97. Kode selengkapnya


clc;clear all;close all;warning off;
data=readtable('PPRO Historical Data.xlsx');
harga = [data.Price,data.Open,data.High,data.Low];
harga = mean(harga,2);
input_target = [];
for i = 1: length(harga)
    if i+4>length(harga)
        break
    end
    input_target(i,1:4) = harga(i:i+3);
    input_target(i,5) = harga(i+4);
    
end
maksimal = 300;
minimal = 80;
delta = maksimal-minimal;
 
input_target_normalisasi = (input_target-minimal)./delta; 
 
 
 
P = input_target_normalisasi(:,1:4); %ambil kolom 1 s.d 4
T = input_target_normalisasi(:,end); %ambil kolom 5 atau yang terakhir
 
 
epoch = 100000;
lr = 0.25;
node_hidden = 10;
 
jaringan = latihjaringan(P,T,epoch, node_hidden,lr);
 
prediksi = simulasijaringan(jaringan,P);
 
 
RMSE = sqrt(mean((prediksi-T).^2));
 
 
for i=5:length(harga)
 sumbux(i-4) = (data.Date(1));
end
 
 
 
figure
plot(data.Date(5:end),T.*delta+minimal)
hold on
plot(data.Date(5:end),prediksi.*delta+minimal)
legend('Target','Prediksi')
xlabel('Data Mingguan')
ylabel('Harga')
title(['Nilai RMSE : ' num2str(RMSE)])
grid on
 
%prediksi untuk minggu III bulan november 2019
disp('data ke 91 terdiri dari 20-Okt-19; 27-Okt-19; 03-Nov-19; 10-Nov-19')
data_91 = [P(end,2:end), T(end)];
disp(data_91*delta+minimal)
 
prediksi_92 = simulasijaringan(jaringan,data_91)*delta+minimal %langsung denormalisasi
 




Tidak ada komentar: