%%%%%%%%%%%%%%%%%%%%JAN PAUKEJE, VUT BRNO, 2012.%%%%%%%%%%%%%%%%%%%

% Skript realizujúci konštrukciu ARIMA/GARCH modelu. Využíva funkcie
% obsiahnuté v Ekonometrickej a Štatistickej sade nástrojov prostredia
% MATLAB (R2009b).


%% Čistka

%Zmazanie príkazového riadku.Zatvorenie všetkých okien. Odstránenie
%premenných z pracovného priestoru. 
clc;
clear all;
close all;
%% Načítanie dát

% Načítanie stĺpcového vektora obsahujúceho časové rady v poradí:
% 1. prichádzajúce požiadavky na server yt.mat
% 2. veľkosť vyžiadaného súboru v bytoch yt.mat
% 3. prístupy k domovskej stránke yh.mat
% Všetky 3 časové rady sú vytvorené s intervalom pozorovania 30s.

structy = load('yt.mat'); % prichádzajúce požiadavky na server,
y = getfield(structy,'yt');

% structy = load('yb.mat'); % vyžiadaná veľkosť dát v bytoch
% y = getfield(structy,'yb')
% 
% structy = load('yh.mat'); % prístupy k domovskej stránke.
% y = getfield(structy,'yh');

trainSeries = y(1:5701,1); % orezanie spočívajúce vo vynechaní posledných
                           % 60 hodnôt kvôli testovaniu s predikovanými
                           % hodnotami
                           
fullSeries = y;            % celý vektor časového radu

%% Výpočet ACF a PACF a diferenciácia, výpočet strednej hodnoty 

lag = 10; % oneskorenie udáva počet koeficientov, ktoré majú byť výstupom 
          %korelačných funkcií
acf = autocorr(trainSeries, lag); % výpočet koeficientov ACF
pacf = parcorr(trainSeries, lag); % výpočet koeficientov PACF

trainSeries = diff(trainSeries);

dacf = autocorr(trainSeries, lag); % výpočet koeficientov ACF po diferenciacii
dpacf = parcorr(trainSeries, lag); % výpočet koeficientov PACF


%% Špecifikácia modelu

% Táto funkcia vytvorí štruktúru, ktorá bude obsahovať odhad budúceho
% modelu, respektíve základnú špecifikáciu, ktorej by mala predchádzať
% identifikácia modelu. Jej výstup Spec je v nasledujúcom riadku kódu
% použitý ako vstup funkcie garchfit().
% Jednotlivé znaky, za ktorými nasleduje číselná špecifikujú rád
% čiastkových procesov AR, MA, GARCH,ARCH, prípadne priamo hodnoty
% koeficientov modelu. Viď. dokumentácia funkcie.

Spec = garchset('R',1,'M',1,'C',0,'K',0.0001,'P',1,'Q',1);

%% Stanovenie parametrov modelu ARMAX/GARCH

%Funkcia garchfit() - jej vstupom je načítaný časový rad a štruktúra Spec
%popísaná vyššie. Výstupom funkcie,ktorý nás obzvlášť zaujíma je štruktúra
%Coeff obsahujúca základné informácie o stanovenom modeli spolu s
%odhadnutými parametrami modelu. Štuktúra Errors, ako napovedá jej názov,
%obsahuje štandardné chyby odhadnutých parametrov. 
% Táto funkcia vykoná prispôsobenie modelu časovému radu pomocou výpočtu
% neznámych parametrov, prípadne prepočet parametrov stanovených v
% predchádzajúcom kroku v štruktúre Spec.

[Coeff,Errors,LLF,Innovations,Sigmas,Summary] = garchfit(Spec,trainSeries);

%% Simulácia
% Nasledujúca funkcia pomocou stanoveného modelu (popísaného v štruktúre
% Coeff) simuluje nový kvazi-náhodný časový rad. Voliťelná vstupná premenná
% NumSamples definuje počet hodnôt, ktoré majú byť simulované.

NumSamples = 5760;
[simInnovations, simSigmas, simSeries] = garchsim(Coeff, NumSamples);

%% Predikcia
% Funkcia garchpred() na základe vypočítaných parametrov modelu uložených v
% štruktúre Coeff, predikuje nové nastávajúce hodnoty časového radu.
% Premenná NumPeriods špecifikuje počet predikovaných hodnôt.

NumPeriods = 60;
[SigmaForecast, MeanForecast,...
    SigmaTotal, MeanRMSE] = garchpred(Coeff, trainSeries, NumPeriods)

%% Vykreslenie dát

figure(1)

subplot(2,1,1), bar(acf);

% Create xlabel
xlabel('{\itposunutie } (-)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('ACF koeficienty (-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('ACF {\it} ',...
    'FontName','MS Reference Sans Serif');

subplot(2,1,2), bar(pacf);

% Create xlabel
xlabel('{\itlag } (-)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('PACF koeficienty (-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('PACF {\it} ',...
    'FontName','MS Reference Sans Serif');


figure(2)

subplot(2,1,1), bar(dacf);
% Create xlabel
xlabel('{\itposunutie } (-)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('ACF koeficienty(-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('ACF po 1. diferenciácii ČR {\it} ',...
    'FontName','MS Reference Sans Serif');

subplot(2,1,2), bar(dpacf);

% Create xlabel
xlabel('{\itlag } (-)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('PACF koeficienty (-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('PACF po 1. diferenciácii ČR {\it} ',...
    'FontName','MS Reference Sans Serif');

figure(3)

subplot(2,1,1), stem(trainSeries,'k','Marker','none','LineWidth',2);

% Create xlabel
xlabel('{\itt } (30 s)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('HTTP požiadavky (-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('Pôvodný časový po 1. diferenciácii {\it} ',...
    'FontName','MS Reference Sans Serif');

subplot(2,1,2), stem(simSeries ,'r','Marker','none','LineWidth',2);
% Create xlabel
xlabel('{\itt } (30 s)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('HTTP požiadavky (-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('Simulovaný časový rad podľa modelu {\it} ',...
    'FontName','MS Reference Sans Serif');

figure(4)

subplot(2,1,1), stem(fullSeries(5701:5760,1),'k','Marker','none',...
    'LineWidth',2);

% Create xlabel
xlabel('{\itt } (30 s)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('HTTP požiadavky (-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('Vynechané hodnoty pôvodného ČR{\it} ',...
    'FontName','MS Reference Sans Serif');

subplot(2,1,2), stem((SigmaForecast + MeanForecast),'r','Marker','none',...
    'LineWidth',2);
% Create xlabel
xlabel('{\itt } (30 s)  \rightarrow','FontName','MS Reference Sans Serif');
% Create ylabel
ylabel('HTTP požiadavky (-)  \rightarrow',...
    'FontName','MS Reference Sans Serif');
% Create title
title('Predikované hodnoty {\it} ',...
    'FontName','MS Reference Sans Serif');
