# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ #import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns T=1 # temps final N=255 dt=T/N timerange = np.linspace(0,T,N+1,endpoint=True) timerange=timerange[:,None] print(timerange.shape) M=150 #no de realisations #construction de Wt: Wt=np.zeros((N+1,M)) W0=0 dW=np.sqrt(dt)*np.random.randn(N,M) Wt[0,:]=W0 Wt[1:,:]=W0+np.cumsum(dW,0) plt.figure() plt.subplot(1,2,1) plt.plot(Wt) plt.title('Realisations du brownien') S0=100.0 mu=0.1 sigma=0.35 taux_r=0.05 def sousjacent(mu,sigma,t,Wt): """ Rend les realisations de St une fois donne le tmps et Wt avec la formule St = S0 * exp( (mu-sigma*sigma/2.0)*t + sigma*Wt) """ return S0*np.exp( (mu-sigma**2.0/2.0)*t+ sigma*Wt) St= sousjacent(mu,sigma,timerange,Wt) plt.subplot(1,2,2) plt.plot(St) plt.title('Realisations du sous-jacent') plt.savefig("realisations_Wt_St.jpg") V0=1000 P0=950 m=5 Pt=np.zeros(N+1) Pt[0]=P0 Ct=np.zeros_like(St) Xt=np.zeros_like(St) Mt=np.zeros_like(St) Vt=np.zeros_like(St) #mise en place de la strategie Vt[0,:]=V0 Pt[0]=P0 Ct[0,:]=V0-P0 Xt[0,:]=m*Ct[0,:] Mt[0,:]=Vt[0,:]-Xt[0,:] for jj in range(N): Pt[jj+1] =Pt[jj]*np.exp(taux_r*dt)#actualisation de P Mt[jj+1,:] =Mt[jj,:]*np.exp(taux_r*dt)#actualisation de M Xt[jj+1,:] =Xt[jj,:]*St[jj+1,:]/St[jj,:]#mise a jour partie risquee avec St Vt[jj+1,:] =Xt[jj+1,:]+Mt[jj+1,:] # calcul de valeur du portfeuille Ct[jj+1,:] =Vt[jj+1,:]-Pt[jj+1] #calcul du coussin # re-allocation selon les prescriptions de la regle CPPI: Xt[jj+1,:]=m*Ct[jj+1,:] Mt[jj+1,:]=Vt[jj+1,:]-Xt[jj+1,:] #livraison cash = Xt[-1,:]+Mt[-1,:] # calcul de la valeur finale plt.figure('cppi',figsize=(9, 3)) plt.subplot(1,3,1) plt.hist(cash*100/V0) plt.title('Vt/V0, Pfinal='+str(np.round(Pt[-1],2))) plt.subplot(1,3,2) #plt.figure(8) sns.distplot(np.log((Ct[1:,:]/Ct[0:-1,:]).flatten()),hist=True,kde=True,bins=50) plt.title('hist du rdt de Ct') plt.subplot(1,3,3) #plt.figure(9) plt.title('evolution du Vt p/r au plafond Pt') plt.plot(timerange,Vt[:,0:10]) plt.plot(timerange,Pt,'-ro') plt.legend(['Vt','Pt']) plt.figure('cx_cv') plt.scatter(np.log(Ct[-1,:]/V0), np.log(St[-1,:]/V0))