clear;
funcprot(0)
stacksize(10^8)


M=fscanfMat("bourse.dta");
[rows, columns]= size(M);
t= M(:,1);
vol= M(:,2);
tps_maturite= M(:,3);
prix_exercice= M(:,4);
prime_option= M(:,5);

//MAIN
// Programme principal pour la réalisation par la méthode des moindres carrés
//puis amélioration du résultat par la méthode d'analyse spectrale. 

function[]= main()
  printf("TP2  Belluot & Popa\n");
  printf("Partie 1 : Modèle linéaire par méthode des moindres carré\n");
  moindrecarres(1, 0, 0, 0)
        printf("Partie 2: Analyse spectrale\n");
  [dlt_option, dlt_levee, dlt_vol, dltps_maturite] = analyse()
  moindrecarres(dlt_option, dlt_levee, dlt_vol, dltps_maturite)
        printf("Fin du programme\n");
endfunction



//----------------------------Question 1----------------------------------------
//Calcul de la qualité du modèle linéaire par méthode des moindres carrés
//Chaque variable de la fonction moindrecarres représente les décalages de chaque variable


function[]= moindrecarres(dlt_prime_option, dlt_prix_exercice, dlt_vol, dlt_tps_maturite)

  max_dcl= max(dlt_prime_option, dlt_prix_exercice, dlt_vol, dlt_tps_maturite);
  
    tmp= abs(dlt_prime_option - max_dcl);
    new_prime_option= [zeros(dlt_prime_option, 1);prime_option;zeros(tmp, 1)]
  
    tmp= abs(dlt_prix_exercice - max_dcl);
    new_prix_exercice= [zeros(dlt_prix_exercice, 1);prix_exercice;zeros(tmp, 1)] 
  
    tmp= abs(dlt_vol - max_dcl);
    new_vol= [zeros(dlt_vol, 1);vol;zeros(tmp, 1)]

    tmp= abs(dlt_tps_maturite - max_dcl);
    new_tps_maturite= [zeros(dlt_tps_maturite, 1);tps_maturite;zeros(tmp, 1)] 
  
  y= [prime_option;zeros(max_dcl, 1)];
  X= [[new_vol], [new_tps_maturite], [new_prix_exercice], [new_prime_option]];

  [m, n]= size(X);

  rank(X)

  X_plus= inv(X'*X);
  X_plus= X_plus*X';
 
  a_hat= X_plus*y

  y_hat= X*a_hat;
  
  t= t(1+max_dcl:rows, 1); 
  new_prime_option= prime_option(1+max_dcl:rows, 1);
  y_hat= y_hat(1+max_dcl:m-max_dcl,1);
  y= y(1+max_dcl:m-max_dcl,1);
  

  r= sqrt(norm(y-y_hat))
  disp(r, "qualité");
  
  condi= norm(X)*norm(X_plus)
  disp(condi, "conditionnement");
  
  graphique(t, new_prime_option, y_hat);
endfunction



//Représentation graphique de la solution des moindres carres
// réalisation du graphique

function[]= graphique(t, prime_option, y_hat)
xset("window",1);
clf;
plot2d(t, prime_option, style= 7)
plot2d(t, y_hat, style= 6)
xtitle("On compare la solution de la méthode des moindres carrés avec les observateurs");
legends(["prime réelle de l option";"prime approchée de l option"],[1; 2])
xlabel('t')
ylabel('prime de l option')
endfunction


//--------------------------Question 2------------------------------------------
//Analyse spectrale


function[dlt_prime_option, dlt_prix_exercice, dlt_vol, dlt_tps_maturite]= analyse()
  clf;
  xset("window",2);
  plot2d(t, fft(prime_option), style= 5);
  zoom_rect([0,-10,100,800])
  xlabel('t');
  ylabel('prime de l option');
  xtitle("Analyse spectral de la prime de l option");
  xset("window",3);
  plot2d(t, fft(vol), style= 5);
  zoom_rect([0,-10,100,50])
  xlabel('t');
  ylabel('vol');
  xtitle("Analyse spectral de la volatilité");
  xset("window",4);
  plot2d(t, fft(tps_maturite), style= 5);
  zoom_rect([0,-10,100,200])
  xlabel('t');
  ylabel('temps de maturite');
  xtitle("Analyse spectral du temps de maturite");
  xset("window",5);
  plot2d(t, fft(prix_exercice), style= 5);
  zoom_rect([0,-10,100,400])
  xlabel('t');
  ylabel('prix de l exercice');
  xtitle("Analyse spectral du prix de l exercice");
  
  txt = ['prime de l option';'volatilité';'temps de maturite';'prix de l exercice'];
  valdef = ['12';'10';'30';'28'];
  sig = x_mdialog('Vérifier les périodes des analyses spectrales',txt,valdef);
  prime_option = evstr(sig(1));
  vol = evstr(sig(2));
  tps_maturite = evstr(sig(3));
  prix_exercice = evstr(sig(4));
  dlt_prime_option= 1/prime_option;
  dlt_vol = 1/vol;
  dlt_tps_maturite = 1/tps_maturite;
  dlt_prix_exercice = 1/prix_exercice;
endfunction

