Saat ini saya sedang mengerjakan metode untuk memprediksi/memproyeksikan aksi harga siklik, berdasarkan Kode indikator gelombang sinus John Ehlers, dan untuk mengujinya saya menggunakan Oktaf implementasi suatu Model Markov tersembunyi dalam paket statistik Oktaf yang dihosting di Sourceforge.
Pada dasarnya saya mengukur periode siklus dominan (menggunakan kode indikator gelombang sinus yang tertaut di atas atau kode periodogram autokorelasi ) dan menggunakan vektor periode siklus dominan yang diukur sebagai masukan ke fungsi hmmestimate. Dengan menggunakan keluaran dari fungsi ini, fungsi hmmgenerate kemudian digunakan untuk menghasilkan vektor periode baru, periode ini diubah menjadi gelombang sinus yang berubah secara perlahan dan berkala, dan kebisingan Gaussian putih aditif ditambahkan ke sinyal untuk menghasilkan sinyal akhir yang Pengujian Monte Carlo indikator yang saya usulkan dapat dilakukan. Plot khas dari periode siklus dominan yang bervariasi terlihat seperti ini
sementara sinyal gelombang sinus bising yang diperoleh dari ini tampak seperti ini.
Kode Oktaf yang relevan untuk semua ini ditunjukkan dalam dua kotak kode di bawah ini
clear all ;
pkg load statistics ;
% load all datafile names from Oanda
cd /home/dekalog/Documents/octave/oanda_data/daily ;
oanda_files_d = glob( "*_ohlc_daily" ) ; % cell with filenames matching *_ohlc_daily, e.g. eur_usd_ohlc_daily
all_transprobest = zeros( 75 , 75 ) ;
for ii = 1 : 124
filename = oanda_files_d{ ii } ;
current_data_d = load( "-binary" , filename ) ;
data = getfield( current_data_d , filename ) ;
midprice = ( data( : , 3 ) .+ data( : , 4 ) ) ./ 2 ;
period = autocorrelation_periodogram_2_5( midprice ) ;
period(1:49) = [] ;
min_val = min( period ) ; max_val = max( period ) ;
hmm_periods = period .- ( min_val - 1 ) ; hmm_states = hmm_periods ;
[ transprobest , outprobest ] = hmmestimate( hmm_periods , hmm_states ) ;
all_transprobest( min_val : max_val , min_val : max_val ) = all_transprobest( min_val : max_val , min_val : max_val ) .+ transprobest ;
endfor
all_transprobest = all_transprobest ./ 124 ;
[ i , j ] = find( all_transprobest ) ;
if ( min(i) == min(j) && max(i) == max(j) )
transprobest = all_transprobest( min(i):max(i) , min(j):max(j) ) ;
outprobest = eye( size(transprobest,1) ) ;
hmm_min_period_add = min(i) - 1 ;
endif
cd /home/dekalog/Documents/octave/period/hmm_period ;
save all_hmm_periods_daily transprobest outprobest hmm_min_period_add ;
dan
clear all ;
pkg load statistics ;
cd /home/dekalog/Documents/octave/snr ;
load all_snr ;
cd /home/dekalog/Documents/octave/period/hmm_period ;
load all_hmm_periods_daily ;
[ gen_period , gen_states ] = hmmgenerate( 2500 , transprobest , outprobest ) ;
gen_period = gen_period .+ hmm_min_period_add ;
gen_sine = sind( cumsum( 360 ./ gen_period ) ) ;
noise_val = mean( [ all_snr(:,1) ; all_snr(:,2) ] ) ;
noisy_sine = awgn( gen_sine , noise_val ) ;
[s,s1,s2,s3] = sinewave_indicator( noisy_sine ) ; s2(1:50) = s1(1:50) ;
figure(1) ; plot( gen_period , 'k' , 'linewidth' , 2 ) ;
figure(2) ; plot( gen_sine , 'k' , 'linewidth' , 2 , noisy_sine , 'b' , 'linewidth' , 2 , s , 'r' , 'linewidth' , 2 , ...
s1 , 'g' , 'linewidth' , 2 , s2 , 'm' , 'linewidth' , 2 ) ;
legend( "Gen Sine" , "Noisy Sine" , "Sine Ind" , "Sine Ind lead1" , "Sine Ind Lead2" ) ;
Saya harap para pembaca menganggap ini berguna apabila mereka perlu menghasilkan data sintetis dan siklus untuk keperluan pengembangan/pengujian mereka sendiri juga.