from S import *
from Prix_Americaines import *

def CouvertureAmer(n,N,K,r,a,b,x):
    #Couverture dans le Modele CRR
    #Delta(n,x = S_{n-1}) est la quantite a detenir entre n-1 et n

    #Attention : Quantite d'actif risque a detenir entre n-1 et n 
    #Attention : il faut remplacer x par S_{n-1} 
  
  #A COMPLETER
  
  return 


def defaut_de_couvertureAmer(N,K,r,a,b,cours):
    Valeur=np.zeros(N+1)
    Defaut=np.zeros(N+1)

  # A l'instant 0
    S_0 = cours[0];
    V_0 = Prix_en_zero_Amer(N,K,r,a,b,S_0)
    Valeur[0] = V_0;
   
    # calcul de la couverture entre 0 et 1 
    H = CouvertureAmer(1,N,K,r,a,b,S_0)
    SoHo = V_0 - H * S_0 # condition d'autofinancement

    for n in range(1,N):#n=1:N-1
        #on est en n
        S_n = cours[n]
 
        # nouvelle valeur du portefeuille en n
        V = H * S_n + SoHo * (1+r)  
        
        # calcul de la nouvelle couverture entre n et n+1
        H = CouvertureAmer(n+1,N,K,r,a,b,S_n)
        # autofinancement
        #A COMPLETER
        SoHo   = ??????
  
        Valeur[n] = V
        Defaut[n] = V-Prix_en_zero_Amer(N-n,K,r,a,b,S_n)
    # on est en N
    S_N  = cours[N]
    V    = H * S_N + SoHo * (1+r)
    res  = V - payoff(cours[N],K)

    Valeur[N] = V
    Defaut[N] = res
  
    cours_final = cours
    valeur_finale = Valeur
    
    return cours_final, valeur_finale

p=5;
for i in range(p):
    cours,valeur = defaut_de_couvertureAmer(N,K,r,a,b,S(N,0.2,a,b,S0))
    v_payoff=payoff(cours,K)
    CouvertureParfaite=min(valeur-v_payoff) #COMMENTER
    print('CouvertureParfaite : ', CouvertureParfaite)
