//TP8: Options Américaines
//Exercice 1
clear;
n=50;T=1;delta_t=T/n;S0=140;K=S0;sigma=0.4;r=0.25;
up=exp(sigma*sqrt(delta_t));down=exp(-sigma*sqrt(delta_t));
R=exp(r*delta_t);p=(R-down)/(up-down);
//Calcul des valeurs de l'actif sous jacent S
function s=S(i,j);s=S0*up.^j.*down.^(i-j);endfunction;
// Calcul par récurrence de la matrice CC du Call
CC=zeros(n+1,n+1);
for j=0:n CC(1+n,1+j)=max(S(n,j)-K,0);
end;
for i=n-1:-1:0
    for j=0:i CC(1+i,1+j)=(p*CC(1+i+1,1+j+1)+(1-p)*        CC(1+i+1,1+j))/R;
    end;
end;
// Calcul par récurrence de la matrice PP du Put
PP=zeros(n+1,n+1);
for j=0:n PP(1+n,1+j)=max(K-S(n,j),0);
end;
for i=n-1:-1:0
    for j=0:i PP(1+i,1+j)=(p*PP(1+i+1,1+j+1)+(1-p)*        PP(1+i+1,1+j))/R;
    end;
end;
//valeurs de S, C et P en t=1/2 s'il n'y a eu que des down
//Comme T=1 et n=50, c'est pour i=25 que t=1/2. Donc on calcule
S(25,0)
// on trouve 34, ce qui prouve que S a beaucoup descendu depuis sa valeur initiale S0=140. Pour les deux options, on tape
CC(26,1)
PP(26,1)
//et on trouve un call quasi nul (aucun risque à la hausse) et un put à 89,5 environs, ce qui est grand et reflète le fait que, comme S a beaucoup baissé, la garantie d'un prix de vente à T=1 de 140 est devenue très chère.

//Exercice 2
//Calcul par récurrence retrograde de la matrice CCamer du Call américain
CCamer=zeros(n+1,n+1); 
for j=0:n CCamer(n+1,j+1)=max(S(n,j)-K,0); end;
for i=n-1:-1:0
    for j=0:i
      CCamer(i+1,j+1)=max(max(S(i,j)-K,0),(p*CC(i+2,j+2)+(1-p)*CC(i+2,j+1))/R);
    end;
end;

//Exercice 3 On calcule 
CC(1,1)//puis 
CCamer(1,1)
// et on constate que les deux valeurs sont égales. La différence "Call Américain moins Call Européen" est donc nulle. Cette différence est la prime d'exercice anticipée car, lorsqu'elle est positive, elle représente l'avantage de pouvoir exercer le Call à une date plus proche que la date finale.

//Exercice 4
//Calcul par récurrence retrograde de la matrice PPamer du Put américain
PPamer=zeros(n+1,n+1); 
for j=0:n, PPamer(n+1,j+1)=max(K-S(n,j),0); end;
for i=n-1:-1:0
    for j=0:i
      PPamer(i+1,j+1)=max(max(K-S(i,j),0),(p*PPamer(i+2,j+2)+(1-p)*PPamer(i+2,j+1))/R);
    end;
end;
PPamer(1,1)-PP(1,1)
// on trouve une prime d'exercice anticipée de 3,92
// On peut changer la valeur de K avant de recalculer les matrices PP et PPamer pour évaluer la prime d'exercice anticipée. On voit que cette prime change en fonction de K. 
//K=140;
PP=zeros(n+1,n+1);
for j=0:n PP(1+n,1+j)=max(K-S(n,j),0);
end;
for i=n-1:-1:0
    for j=0:i PP(1+i,1+j)=(p*PP(1+i+1,1+j+1)+(1-p)*        PP(1+i+1,1+j))/R;
    end;
end;
PPamer=zeros(n+1,n+1); 
for j=0:n, PPamer(n+1,j+1)=max(K-S(n,j),0); end;
for i=n-1:-1:0
    for j=0:i
      PPamer(i+1,j+1)=max(max(K-S(i,j),0),(p*PPamer(i+2,j+2)+(1-p)*PPamer(i+2,j+1))/R);
    end;
end;
PPamer(1,1)-PP(1,1)
//par exemple pour K=100 la prime vaut 0.37 et pour K=20 elle est quasi nulle.

//Exercices 5 et 6 
K=140;//on revient à la valeur de K=140!
// On fait une boucle pour voir comment varie le Put américain en fonction de r
for r=0:0.05:0.25
    R=exp(r*delta_t);p=(R-down)/(up-down);
PP=zeros(n+1,n+1);
for j=0:n PP(1+n,1+j)=max(K-S(n,j),0);
end;
for i=n-1:-1:0
    for j=0:i PP(1+i,1+j)=(p*PP(1+i+1,1+j+1)+(1-p)*        PP(1+i+1,1+j))/R;
    end;
end;
PPamer=zeros(n+1,n+1); 
for j=0:n PPamer(n+1,j+1)=max(K-S(n,j),0); end;
for i=n-1:-1:0
    for j=0:i
      PPamer(i+1,j+1)=max(max(K-S(i,j),0),(p*PPamer(i+2,j+2)+(1-p)*PPamer(i+2,j+1))/R);
    end;
end;
//r
PP(1,1)
PPamer(1,1)
//PPamer(1,1)-PP(1,1)
end;
//on constate qu'il devient de moins en moins chère quand r augmente et c'est vrai aussi du Put Européen mais en r=0, ils vallent la même valeur.

