matlab exercise 101071041 Convertible bond pricing no call
matlab exercise 101071041
Convertible bond pricing (no call back function [price, lattice, num] = Latticebond(fv, S 0, r, rc, T, sigma, N) delta. T = T/N; u=exp(sigma * sqrt(delta. T)); d=1/u; p=(exp(r*delta. T) - d)/(u-d); lattice = zeros(N+1, N+1); div=fv*rc; num=0; for j=0: N lattice(N+1, j+1)=max( fv , S 0*(u^j)*(d^(N-j))); end for i=N-1: 0 for j=0: i if S 0*(u^j)*(d^(i-j)) > exp(-r*delta. T) *(p * lattice(i+2, j+2) + (1 -p) * lattice(i+2, j+1)+div) num=i; end lattice(i+1, j+1) = max( S 0*(u^j)*(d^(i-j)) , . . . exp(-r*delta. T) *(p * lattice(i+2, j+2) + (1 -p) * lattice(i+2, j+1)+div)); end price = lattice(1, 1);
Convertible bond pricing (with call back function [price, lattice] = Latticebond(fv, S 0, r, rc, T, sigma, N, callbackprice) delta. T = T/N; u=exp(sigma * sqrt(delta. T)); d=1/u; p=(exp(r*delta. T) - d)/(u-d); lattice = zeros(N+1, N+1); div=fv*rc; for j=0: N lattice(N+1, j+1)=max( fv , S 0*(u^j)*(d^(N-j))); end for i=N-1: 0 for j=0: i lattice(i+1, j+1) = max( S 0*(u^j)*(d^(i-j)) , . . . min(exp(-r*delta. T) *(p * lattice(i+2, j+2) + (1 -p) * lattice(i+2, j+1)+div), callbackprice)); end price = lattice(1, 1);
Doc/is/con % DOCall. MCCond. IS. m function [Cdo, CI, NCrossed] =. . . DOCall. MCCond. IS(S 0, X, r, T, sigma, Sb, NSteps, NRepl, bp) dt = T/NSteps; nudt = (r-0. 5*sigma^2)*dt; b = bp*nudt; sidt = sigma*sqrt(dt); [Call, ~] = blsprice(S 0, X, r, T, sigma); NCrossed = 0; Payoff = zeros(NRepl, 1); Times = zeros(NRepl, 1); Stock. Vals = zeros(NRepl, 1); ISRatio = zeros(NRepl, 1);
for i=1: NRepl % generate normals vet. Z = nudt - b + sidt*randn(1, NSteps); Log. Path = cumsum([log(S 0), vet. Z]); Path = exp(Log. Path); %conditioning jcrossed = min(find( Path <= Sb )); if not(isempty(jcrossed)) NCrossed = NCrossed + 1; TBreach = jcrossed - 1; Times(NCrossed) = TBreach * dt; Stock. Vals(NCrossed) = Path(jcrossed); ISRatio(NCrossed) = exp( TBreach*b^2/2/sigma^2/dt +. . . b/sigma^2/dt*sum(vet. Z(1: TBreach)) -. . . TBreach*b/sigma^2*(r - sigma^2/2)); end if (NCrossed > 0) [Caux, ~] = blsprice(Stock. Vals(1: NCrossed), X, r, . . . T-Times(1: NCrossed), sigma); Payoff(1: NCrossed) = exp(r*Times(1: NCrossed)). * Caux. . * ISRatio(1: NCrossed); end [Cdo, ~, CI] = normfit(Call - Payoff);
Com. m S 0=50; X=52; r=0. 1; T=2/12; sigma=0. 4; Sb=30; NStep=60; NRepl=10000; bp 0=0; bp 20=20; bp 50=50; bp 200=200; randn('seed', 0); [DOPut. MCCond. IS 0, CI 2, NCrossed 2]=DOCall. MCCond. IS(S 0, X, r, T, sigm a, Sb, NStep, NRepl, bp 0); randn('seed', 0); [DOPut. MCCond. IS 20, CI 3, NCrossed 3]=DOCall. MCCond. IS(S 0, X, r, T, sig ma, Sb, NStep, NRepl, bp 20); randn('seed', 0); [DOPut. MCCond. IS 50, CI 4, NCrossed 4]=DOCall. MCCond. IS(S 0, X, r, T, sig ma, Sb, NStep, NRepl, bp 50); randn('seed', 0); [DOPut. MCCond. IS 200, CI 5, NCrossed 5]=DOCall. MCCond. IS(S 0, X, r, T, sig ma, Sb, NStep, NRepl, bp 200); >> randn('seed', 0); [DOPut. MCCond. IS 0, CI 2, NCrossed 2]=DOCall. MCCond. IS(S 0, X, r, T, sigm a, Sb, NStep, NRepl, bp 0) randn('seed', 0); [DOPut. MCCond. IS 20, CI 3, NCrossed 3]=DOCall. MCCond. IS(S 0, X, r, T, sig ma, Sb, NStep, NRepl, bp 20) randn('seed', 0); [DOPut. MCCond. IS 50, CI 4, NCrossed 4]=DOCall. MCCond. IS(S 0, X, r, T, sig ma, Sb, NStep, NRepl, bp 50) randn('seed', 0); [DOPut. MCCond. IS 200, CI 5, NCrossed 5]=DOCall. MCCond. IS(S 0, X, r, T, sig ma, Sb, NStep, NRepl, bp 200)
DOPut. MCCond. IS 0 =2. 7519 CI 2 =2. 7519 NCrossed 2 = 12 DOPut. MCCond. IS 20 =2. 7519 CI 3 = 2. 7519 NCrossed 3 = 43 DOPut. MCCond. IS 50 = 2. 7519 CI 4 = 2. 7519 NCrossed 4 = 225 DOPut. MCCond. IS 200 = 2. 7519 CI 5 = 2. 7519 NCrossed 5 = 8469
訂正: do. put. mc. control. variate Payoff = zeros(NRepl, 1); % DOPut. MC. m NCrossed = 0; function [P, CI, NCrossed] = DOPut. MC_control(S 0, X, r, T, sigma, Sb, NSteps, NRepl, NPilot) % Generate asset paths Payoff = zeros(NPilot, 1); NCrossed = 0; for i=1: NPilot Path=Asset. Paths 1(S 0, r, sigma, T, NSteps, 1); stockvalues(i)=Path(NSteps+1); crossed = any(Path <= Sb); if crossed == 0 Payoff(i) = max(0, X - Path(NSteps+1)); else Payoff(i) = 0; NCrossed = NCrossed + 1; end Mat. Cov=cov(stockvalues, Payoff); Var. Y = S 0^2 * exp(2*r*T) * (exp(T * sigma^2) - 1); c = - Mat. Cov(1, 2) / Var. Y; Exp. Y = S 0 * exp(r*T); for i=1: NRepl Path=Asset. Paths 1(S 0, r, sigma, T, NSteps, 1); stockvalue(i)=Path(NSteps+1); crossed = any(Path <= Sb); if crossed == 0 Payoff(i) = max(0, X - Path(NSteps+1)); else Payoff(i) = 0; NCrossed = NCrossed + 1; end controlvalue= (Payoff)'+ c * (stockvalue-Exp. Y ); [P, ~, CI] = normfit( exp(-r*T) * controlvalue);
[P, CI, NCrossed] = DOPut. MC_control(50, 0. 1, 2/12, 0. 4, 40, 60, 10000, 100) P= 1. 3470 CI = 1. 3055 1. 3884 NCrossed = 1415
- Slides: 11