# -*- coding: utf-8 -*- """ STOP LOSS: 1/ implement stop-loss strategy and plot as histogram the difference between the final portfolio value and expected value i.e.: Portf- (S_T-K)+ can implement using blsdelta = 1_{...} or not Note : take r=0 in the beggining for tests No option is sold, no delivry or exercise 2/ also test is this is ok as delta-hedging """ import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm def stop_loss_rule(Price,Strike,Rate,TimeToMaturity,Volatility,DividendRate=0): delta_stop=np.heaviside(Price-Strike,np.ones_like(Price-Strike)) return delta_stop,1-delta_stop T=1 N=255*8*60 dt=T/N M=500 print("M=",M) S0=100 K=90 mu=0.15 sigma=0.2 r=0.05 #construction mouvement brownien par somme cummulative dW= np.sqrt(dt)*np.random.randn(N,M) W= np.zeros((N+1,M)) W[0,:]=0 W[1:,:]=np.cumsum(dW,axis=0) t=np.linspace(0,T,N+1,endpoint=True) #plot # construction du processus de prix S: dS/S = mu*dt + sigma* dWt S= S0*np.exp( (mu-sigma**2/2)*t[:,None] + sigma*W) plt.figure('brownian',figsize=(6,3)) plt.subplot(1,2,1) plt.plot(W) plt.subplot(1,2,2) plt.plot(S) #DELTA HEDGING : t=0 : mise en place du portefeuille de replication cash=np.zeros_like(S)# matrice du meme format que S #Calcul prix initial et vente de call cash[0,:]=S0 #remplacer par le prix initial delta=np.zeros((N+1,M)) delta[0,:]=stop_loss_rule(S0,K,r,T,sigma)[0]#calcul de Delta(t=0) cash[0,:]-= delta[0,:]*S[0,:] #achat de Delta(0) parts #de sous jacent: mettre en memoire Delta(0) et mettre à jour le cash f=0.00#frais de transaction de 1/1000 for jj in range(N):#boucle en temps: cash[jj+1,:]=cash[jj,:]*np.exp(r*dt)#capitalisation du cash delta[jj+1,:]=stop_loss_rule(S[jj+1,:],K,r,T-jj*dt,sigma)[0] #recalcul de Delta nouveau cash[jj+1,:] = cash[jj+1,:]- S[jj+1,:]*(delta[jj+1,:]-delta[jj,:]) \ - f*np.abs(S[jj+1,:]*(delta[jj+1,:]-delta[jj,:])) #achat ou vente de sous-jacent et mise à jour cash #t=T: paiement de (S(T)-K)+ du cash; vente des ss-jacents cash[-1,:] += delta[-1,:]*S[-1,:] # histograme de la valeur finale du portefeuille c'est à dire # du cash #cash_old=cash plt.figure("hist",figsize=(10,3)) plt.subplot(1,3,1) plt.hist(cash[-1,:]-np.maximum(S[-1,:]-K,0)-S0, label='gain p/r attendu') plt.subplot(1,3,2) plt.hist(cash[-1,:], label='val finale') plt.subplot(1,3,3) plt.hist(cash[-1,:]-K, label='gain p/r val initiale') #plt.hist(cash_old[-1,:])