About Me

Financial product design and pricing

Web Programming, Technologies, and Applications

Links

經歷


  • 桃園市縣立同安國小

  • 桃園市私立振聲中學國中部

  • 國立武陵高中瘋狂烹調認真炒菜社

  • 桃園市國立武陵高中

  • 就讀國立清華大學計量財務金融學系

  • 辛卯梅竹工作會文資部

  • 計財系系學會美宣

  • 壬辰梅竹工作會文資部

  • 癸巳梅竹工作會文資部

興趣


  • 畫圖

  • 唱歌

  • 手工藝

  • 烹飪

Top


  1. Homework一
  2. Homework二
  3. Homework三
  4. Homework四
  5. Homework五
  6. Homework六
  7. Homework七
  8. Homework八
  9. Homework九
  10. Homework十
  11. Homework十一
  12. Homework十二
  13. Homework十三
  14. Homework十四
  15. Homework十五
  16. Final

Top


  1. Homework一
  2. Homework二
  3. Homework三
  4. Homework四
  5. Homework五
  6. Homework六
  7. Homework八

Top


Top


   HW1

        function X=BSCall(S,K,r,sigma,T)
        
        Q=(log(S/K)+(r+sigma^2/2)*T)/(sigma*sqrt(T));
        W=Q-(sigma*sqrt(T));
        X=S*normcdf(Q)-K*(exp(-r*T)*normcdf(W));
        
        
        
        function X=BSPut(S,K,r,sigma,T)
        
        Q=(log(S/K)+(r+sigma^2/2)*T)/(sigma*sqrt(T));
        W=Q-(sigma*sqrt(T));
        X=-S*normcdf(-Q)+K*(exp(-r*T)*normcdf(-W));
        
        
        
        function B = PV(y,n,C)
            for i=1:n
                D(i)= 1/((1+y)^(i-1));
            end
        D*C



   
  HW2
  	Delta
  	
        x=50;
        r=0.05;
        t=0.5:0.5:10;
        sig=0.2;
        div=0;
        s=60;
        
        call_delta1= blsdelta(s,x,r,t,sig,div);
        call_delta2= blsdelta(s-10,x,r,t,sig,div);
        call_delta3= blsdelta(s-20,x,r,t,sig,div);
        
        plot(t,call_delta1,'-')
        hold on;
        plot(t,call_delta2,'-r')
        plot(t,call_delta3,'-g')
        title('Delta vs. T')
        xlabel('T')
        ylabel('Delta')
        legend('in the money','at the money','out of the money')
        axis([0 10 0 1.2]);
        
        
     Gamma
     
        x=50;
        r=0.05;
        t=0.5;
        sig=0.2;
        div=0;
        s=30:120;
        
        call_gamma = blsgamma(s,x,r,t,sig,div);
        
        plot(s,call_gamma,'-')
        title('Gamma vs. s')
        xlabel('s')
        ylabel('Gamma')
        legend('Gamma')
        
        
     Theta
     
        x=50;
        r=0.05;
        t=0.5;
        sig=0.2;
        div=0;
        s=30:120;
        
        [call_theta,put_theta]=blstheta(s,x,r,t,sig,div);
        
        plot(s,call_theta,'-')
        title('Theta vs. s')
        xlabel('s')
        ylabel('Theta')
        legend('Theta')
        
        
      Vega
      
        x=50;
        r=0.05;
        t=0.5;
        sig=0.2;
        div=0;
        s=30:120;
        
        call_vega = blsvega(s,x,r,t,sig,div);
        
        plot(s,call_vega,'-')
        title('Vega vs. s')
        xlabel('s')
        ylabel('Vega')
        legend('Vega')

  
'
   HW4
  	%Callprice.m
        function [C,P] = blsprice(S0,X,r,T,sigma)
        X=20:1:80;
        S0=50;
        r=0.08;
        sigma=0.4;
        T=1;
        [C,P] = blsprice(S0,X,r,T,sigma);
        plot(X,C,'-r');
        hold on;
        T=0;
        [C,P] = blsprice(S0,X,r,T,sigma);
        plot(X,C,'-blue');
        hold on;
        axis([20 80 0 25]);
        title('Call price v.s. Exercise Price');
        xlabel('Exercise price');
        ylabel('Call price');
        legend('EurCall value','內含價值(T=0)');


        function [C,P] = blsprice(S0,X,r,T,sigma)
        X=20:1:80;
        S0=50;
        r=0.08;
        sigma=0.4;
        T=1;
        [C,P] = blsprice(S0,X,r,T,sigma);
        plot(X,P,'-r');
        hold on;
        T=0;
        [C,P] = blsprice(S0,X,r,T,sigma);
        plot(X,P,'-blue');
        hold on;
        axis([20 80 0 25]);
        title('Put price v.s. Exercise Price');
        xlabel('Exercise price');
        ylabel('Put price');
        legend('EurPut value','內含價值(T=0)');
  
  HW5
        function [price, lattice] = LatticeAmCallDivD(S0,X,r,T,sigma,N,D,tau)
        deltaT = T/N;
        u=exp(sigma * sqrt(deltaT));
        d=1/u;
        p=(exp(r*deltaT) - d)/(u-d);
        S0a=S0-D*exp(-r*tau*deltaT);
        lattice = zeros(N+1,N+1);
        for j=0:N
         lattice(N+1,j+1)=max(0 , -X+S0a*(u^j)*(d^(N-j)));
        end
        for i=N-1:-1:tau
         for j=0:i
         lattice(i+1,j+1) = max( -X+S0a*u^j*d^(i-j) , ...
         exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
         end
        end
        for i=tau-1:-1:0
         for j=0:i lattice(i+1,j+1) = max( -X+S0a*u^j*d^(i-j)+D*exp(-r*(tau-i)*deltaT) , ...
         exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
         end
        end
        price = lattice(1,1);
        
        
        
        function [price, lattice] = LatticeAmCallDivP(S0,X,r,T,sigma,N,div,tau)
        deltaT = T/N;
        u=exp(sigma * sqrt(deltaT));
        d=1/u;
        p=(exp(r*deltaT) - d)/(u-d);
        lattice = zeros(N+1,N+1);
        for j=0:N
         lattice(N+1,j+1)=max(0 , S0*(u^j)*(d^(N-j))*(1-div)-X);
        end
        for i=N-1:-1:tau
            for j=0:i
            lattice(i+1,j+1) = max(-X+S0*u^j*d^(i-j)*(1-div) , ...
            exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
            end
        end
        for i=tau-1:-1:0
            for j=0:i
            lattice(i+1,j+1) = max(-X+S0*u^j*d^(i-j) , ...
            exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
            end
        end
        price = lattice(1,1);
        
        
        
        function [price, lattice] = LatticeEurCallDivD(S0,X,r,T,sigma,N,D,tau)
        deltaT = T/N;
        u=exp(sigma * sqrt(deltaT));
        d=1/u;
        p=(exp(r*deltaT) - d)/(u-d);
        S0a=S0-D*exp(-r*tau*deltaT);
        lattice = zeros(N+1,N+1);
        for j=0:N
         lattice(N+1,j+1)=max(0 , -X+S0a*(u^j)*(d^(N-j)));
        end
        for i=N-1:-1:0
            for j=0:i
                lattice(i+1,j+1) = exp(-r*deltaT)*...
                (p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
            end
        end
        price = lattice(1,1);
        
        
        
        function [price, lattice] = LatticeEurCallDivP(S0,X,r,T,sigma,N,div,tau)
        deltaT = T/N;
        u=exp(sigma * sqrt(deltaT));
        d=1/u;
        p=(exp(r*deltaT) - d)/(u-d);
        lattice = zeros(N+1,N+1);
        for j=0:N
         lattice(N+1,j+1)=max(0,-X+S0*(u^j)*(d^(N-j))*(1-div));
        end
        for i=N-1:-1:tau
              for j=0:i
                lattice(i+1,j+1) = exp(-r*deltaT)*(1-div)*...
                (p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
            end
        end
        for i=tau-1:-1:0
            for j=0:i
                lattice(i+1,j+1) = exp(-r*deltaT)*...
                (p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
            end
        end
        price = lattice(1,1);
        
        
        
        
        function [price, lattice] = LatticeEurPutDivD(S0,X,r,T,sigma,N,D,tau)
        deltaT = T/N;
        u=exp(sigma * sqrt(deltaT));
        d=1/u;
        p=(exp(r*deltaT) - d)/(u-d);
        S0a=S0-D*exp(-r*tau*deltaT);
        lattice = zeros(N+1,N+1);
        for j=0:N
         lattice(N+1,j+1)=max(0 , X-S0a*(u^j)*(d^(N-j)));
        end
        for i=N-1:-1:0
            for j=0:i
                lattice(i+1,j+1) = exp(-r*deltaT)*...
                (p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
            end
        end
        price = lattice(1,1);
        
        
        
        function [price, lattice] = LatticeEurPutDivP(S0,X,r,T,sigma,N,div,tau)
        deltaT = T/N;
        u=exp(sigma * sqrt(deltaT));
        d=1/u;
        p=(exp(r*deltaT) - d)/(u-d);
        lattice = zeros(N+1,N+1);
        for j=0:N
         lattice(N+1,j+1)=max(0,X-S0*(u^j)*(d^(N-j))*(1-div));
        end
        for i=N-1:-1:tau
              for j=0:i
                lattice(i+1,j+1) = exp(-r*deltaT)*(1-div)*...
                (p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
            end
        end
        for i=tau-1:-1:0
            for j=0:i
                lattice(i+1,j+1) = exp(-r*deltaT)*...
                (p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
            end
        end
        price = lattice(1,1);
        
        
        
        function [price, lattice] = TriAmPut(S0,X,r,T,sigma,N,lamda)
        deltaT = T/N;
        u=exp(lamda*sigma * sqrt(deltaT));
        d=1/u;
        pu=1/(2*lamda^2)+(r-(sigma^2/2))*sqrt(deltaT)/(2*lamda*sigma);
        pm=1-1/(lamda^2);
        pd=1-pu-pm;
        lattice = zeros(N+1,2*N+1);
        for j=1:N+1
         lattice(N+1,j)=max(0 , -S0*(d^(N-j+1)) + X);
        end
        for j=N+2:2*N+1
         lattice(N+1,j)=max(0 , -S0*(u^(j-N-1)) + X);
        end
        for i=N-1:-1:0
         for j=1:2*i+1
          lattice(i+1,j+1) = max( X-S0*u^j*d^(i-j) , ...
         (pd * lattice(i+2,j) + pm * lattice(i+2,j+1)+ ...
         pu*lattice(i+2,j+2)));
         end
        end
        
        
        
        function [price, lattice] = TriEurPut(S0,X,r,T,sigma,N,lamda)
        deltaT = T/N;
        u=exp(lamda*sigma * sqrt(deltaT));
        d=1/u;
        pu=1/(2*lamda^2)+(r-(sigma^2/2))*sqrt(deltaT)/(2*lamda*sigma);
        pm=1-1/(lamda^2);
        pd=1-pu-pm;
        lattice = zeros(N+1,2*N+1);
        for j=1:N+1
         lattice(N+1,j)=max(0 , -S0*(d^(N-j+1)) + X);
        end
        for j=N+2:2*N+1
         lattice(N+1,j)=max(0 , -S0*(u^(j-N-1)) + X);
        end
        for i=N-1:-1:0
         for j=1:2*i+1
         lattice(i+1,j) = exp(-r*deltaT) * ...
         (pd * lattice(i+2,j) + pm * lattice(i+2,j+1)+ ...
         pu*lattice(i+2,j+2));
         end
        end
  
 HW6
 	% BlsMCAVD.m
        function [Price, CI] = BlsMCAVD(S0,X,r,T,sigma,NRepl,q)
        nuT = ((r-q)-0.5*sigma^2)*T;
        siT = sigma*sqrt(T);
        Veps = randn(NRepl,1);
        
        Payoff1 = max( 0 , S0*exp(nuT+siT*Veps)-X);
        Payoff2 = max( 0 , S0*exp(nuT+siT*(-Veps))-X);
        DiscPayoff = exp(-r*T)*0.5*(Payoff1+Payoff2);
        [Price, VarPrice, CI] = normfit(DiscPayoff);



    % BlsMCAVDP.m
        function [Price, CI] = BlsMCAVDP(S0,X,r,T,sigma,NRepl,q)
        nuT = ((r-q)-0.5*sigma^2)*T;
        siT = sigma*sqrt(T);
        Veps = randn(NRepl,1);
        
        Payoff1 = max( 0 ,X-S0*exp(nuT+siT*Veps));
        Payoff2 = max( 0 ,X-S0*exp(nuT+siT*(-Veps)));
        DiscPayoff = exp(-r*T)*0.5*(Payoff1+Payoff2);
        [Price, VarPrice, CI] = normfit(DiscPayoff);
        
        
    % BlsMCAVP.m
        function [Price, CI] = BlsMCAVP(S0,X,r,T,sigma,NRepl)
        nuT = (r - 0.5*sigma^2)*T;
        siT = sigma * sqrt(T);
        Veps = randn(NRepl,1);
        
        Payoff1 = max( 0 , X-S0*exp(nuT+siT*Veps));
        Payoff2 = max( 0 , X-S0*exp(nuT+siT*(-Veps)));
        DiscPayoff = exp(-r*T) * 0.5 * (Payoff1+Payoff2);
        [Price, VarPrice, CI] = normfit(DiscPayoff);
        
        
   % BlsMCD.m
        function [Price, CI] = BlsMCD(S0,X,r,T,sigma,NRepl,q)
        
        nuT = ((r-q)-0.5*sigma^2)*T;
        siT = sigma * sqrt(T);
        
        DiscPayoff = exp(-r*T) * max( 0 , S0*exp(nuT+siT*randn(NRepl,1)) - X);
        [Price, VarPrice, CI] = normfit(DiscPayoff);
   
   
   
   % BlsMCDP.m
        function [Price, CI] = BlsMCDP(S0,X,r,T,sigma,NRepl,q)
        
        nuT = ((r-q)-0.5*sigma^2)*T;
        siT = sigma * sqrt(T);
        
        DiscPayoff = exp(-r*T) * max( 0 ,X-S0*exp(nuT+siT*randn(NRepl,1)));
        [Price, VarPrice, CI] = normfit(DiscPayoff);
   
   
   
   % BlsMCP.m
        function [Price, CI] = BlsMCP(S0,X,r,T,sigma,NRepl)
        
        nuT = (r - 0.5*sigma^2)*T;
        siT = sigma * sqrt(T);
        
        DiscPayoff = exp(-r*T) * max( 0 ,X-S0*exp(nuT+siT*randn(NRepl,1)));
        [Price, VarPrice, CI] = normfit(DiscPayoff);
    
    
    
    % CompBlsMCAVD.m Compare blsprice and BlsMCD200000 and BlsMCAVD100000

        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        q=0.05;
        NRepl1=100000;
        NRepl2=200000;
        
        Bls=blsprice(S0,X,r,T,sigma,q);
        randn('seed',0);
        [MC200000, CI1] = BlsMCD(S0,X,r,T,sigma,NRepl2,q);
        randn('seed',0);
        [MCAV100000, CI2] = BlsMCAVD(S0,X,r,T,sigma,NRepl1,q);
        
        Bls
        MC200000
        CI1
        MCAV100000
        CI2
    
    
    
    % CompBlsMCAVD.m Compare blsprice and BlsMCD200000 and BlsMCAVD100000

        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        q=0.05;
        NRepl1=100000;
        NRepl2=200000;
        
        [BlsC, BlsP]=blsprice(S0,X,r,T,sigma,q);
        randn('seed',0);
        [MC200000, CI1] = BlsMCDP(S0,X,r,T,sigma,NRepl2,q);
        randn('seed',0);
        [MCAV100000, CI2] = BlsMCAVDP(S0,X,r,T,sigma,NRepl1,q);
        
        BlsP
        MC200000
        CI1
        MCAV100000
        CI2
        
        
   % ComBlsMCAVP.m Compare blsprice and BlsMc200000 and BlsMCAV100000

        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        NRepl1=100000;
        NRepl2=200000;
        
        [BlsC, BlsP]=blsprice(S0,X,r,T,sigma);
        randn('seed',0);
        [MCP200000, CI1] = BlsMCP(S0,X,r,T,sigma,NRepl2);
        randn('seed',0);
        [MCAVP100000, CI2] = BlsMCAVP(S0,X,r,T,sigma,NRepl1);
        
        BlsP
        MCP200000
        CI1
        MCAVP100000
        CI2
	
    
    % ComBlsMCP.m Compare blsprice and BlsMCP1000 and BlsMCP200000

        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        NRepl1=1000;
        NRepl2=200000;
        
        [BlsC, BlsP]=blsprice(S0,X,r,T,sigma);
        randn('seed',0);
        [MCP1000, CI1000] = BlsMCP(S0,X,r,T,sigma,NRepl1);
        randn('seed',0);
        [MCP200000, CI200000] = BlsMCP(S0,X,r,T,sigma,NRepl2);
        
        BlsP
        MCP1000
        CI1000
        MCP200000
        CI200000



 
 HW8
 	%BlsHaltonEurCall.m
        function Price = BlsHaltonEurCall(S0,X,r,T,sigma,NPoints,Base1,Base2)
        nuT = (r-0.5*sigma^2)*T;
        siT = sigma*sqrt(T);
        
        rand('seed',0);
        H1 = GetHalton(ceil(NPoints/2),Base1);
        H2 = GetHalton(ceil(NPoints/2),Base2);
        VLog = sqrt(-2*log(H1));
        Norm1 = VLog.*cos(2*pi*H2);
        Norm2 = VLog.*sin(2*pi*H2);
        Norm = [Norm1;Norm2];
        DiscPayoff = exp(-r*T) * max( 0 , S0*exp(nuT+siT*Norm) -X );
        Price = mean(DiscPayoff);
        
        %{
        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        NPoints=5000;
        %}
        
    %BlsHaltonEurPut.m
        function Price = BlsHaltonEurPut(S0,X,r,T,sigma,NPoints,Base1,Base2)
        nuT = (r-0.5*sigma^2)*T;
        siT = sigma*sqrt(T);
        
        rand('seed',0);
        H1 = GetHalton(ceil(NPoints/2),Base1);
        H2 = GetHalton(ceil(NPoints/2),Base2);
        VLog = sqrt(-2*log(H1));
        Norm1 = VLog.*cos(2*pi*H2);
        Norm2 = VLog.*sin(2*pi*H2);
        Norm = [Norm1;Norm2];
        DiscPayoff = exp(-r*T) * max( 0 , X-S0*exp(nuT+siT*Norm));
        Price = mean(DiscPayoff);
        
        %{
        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        NPoints=5000;
        %}
        
        
    function Price = BlsRandBox(S0,X,r,T,sigma,NPoints)
        nuT = (r - 0.5*sigma^2)*T;
        siT = sigma * sqrt(T);
        
        % Use Box to generate standard normals
        
        rand('seed',0);
        H1 = rand(NPoints,1);
        H2 = rand(NPoints,1);
        VLog = sqrt(-2*log(H1));
        Norm1 = VLog.*cos(2*pi*H2);
        Norm2 = VLog.*sin(2*pi*H2);
        Norm = [Norm1;Norm2];
        
        DiscPayoff = exp(-r*T) * max( 0 ,  X - S0*exp(nuT+siT*Norm) );
        Price = mean(DiscPayoff);
        end
        %{
        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        NPoints=5000;
        %}
     
     
     function Price = BlsRandBoxCall(S0,X,r,T,sigma,NPoints)
        nuT = (r - 0.5*sigma^2)*T;
        siT = sigma * sqrt(T);
        
        % Use Box to generate standard normals
        
        rand('seed',0);
        H1 = rand(NPoints,1);
        H2 = rand(NPoints,1);
        VLog = sqrt(-2*log(H1));
        Norm1 = VLog.*cos(2*pi*H2);
        Norm2 = VLog.*sin(2*pi*H2);
        Norm = [Norm1;Norm2];
        
        DiscPayoff = exp(-r*T) * max( 0 ,  S0*exp(nuT+siT*Norm) -X  );
        Price = mean(DiscPayoff);
        end
        
        %{
        S0=50;
        X=52;
        r=0.1;
        T=5/12;
        sigma=0.4;
        NPoints=5000;
        %}


	function Seq = GetHalton(HowMany, Base)

        Seq = zeros(HowMany,1);
        NumBits = 1+ceil(log(HowMany)/log(Base));
        VetBase = Base.^(-(1:NumBits));
        WorkVet = zeros(1,NumBits); 
        for i=1:HowMany
           % increment last bit and carry over if necessary
           j=1;
           ok = 0;
           while ok == 0
              WorkVet(j) = WorkVet(j)+1;
              if WorkVet(j) < Base
                 ok = 1;
              else
                 WorkVet(j) = 0;
                 j = j+1;
              end
           end
           Seq(i) = dot(WorkVet,VetBase);
        end
        

	function h=HaltonSeq(m,b)
        seq=zeros(m,1);
        for n=1:m
        n0 = n;
        h(n) = 0;
        f = 1/b;
        while (n0 > 0)
           n1 = floor(n0/b);
           r = n0 - n1*b;
           h(n) = h(n)+f*r;
           f = f/b;
           n0=n1;
        end
        end


	% CompRandHalton

        % Rand
        for i=1:1000
        U1 = rand()
        U2 = rand()
        VLog = sqrt(-2*log(U1));
        X = VLog * cos(2*pi*U2);
        Y = VLog * sin(2*pi*U2);
        
        plot(X,Y,'o');
        hold on
        end
        title('rand Box-Muller distribution');
        grid on

 
 HW9
        
        
        function C=compound(s0,K1,K2,r,T1,T2,sigma,q)
            
            sstar=fzero(@(x) blsprice(x,K2,r,T2-T1,sigma,q)-K1,99);
            a1=(log(s0/sstar)+(r-q+(sigma^2)/2)*T1)/(sigma*sqrt(T1));
            a2=a1-sigma*sqrt(T1);
            b1=(log(s0/K2)+(r-q+(sigma^2)/2)*T2)/(sigma*sqrt(T2));
            b2=b1-sigma*sqrt(T2);
            
            C=s0*exp(-q*T2)*binorm(a1,b1,T1,T2)-K2*exp(-r*T2)*binorm(a2,b2,T1,T2)-K1*exp(-r*T1)*normcdf(a2);
        end
        
        
        
        function Q=binorm(a,b,T1,T2)
        
        fun=@(x,y) (1/(2*pi*sqrt(1-T1/T2)))*exp(-(1/(1-T1/T2))*(x.^2-2*sqrt(T1/T2)*x*y+y.^2)/2);
            Q=dblquad(fun,-10,a,-10,b);
        end
        
        
        
        function z=integrnd(x,y)
            T1=0.25;
            T2=1;
            
            z=(1/(2*pi*sqrt(1-T1/T2)))*exp(-(1/(1-T1/T2))*(x.^2-2*sqrt(T1/T2)*x*y+y.^2)/2);
        end
        
        
        
        
        s0=100;
        K1=8;
        K2=100;
        r=0.1;
        T1=1;
        T2=1.1;
        sigma=0.2;
        q=0.05;
        Cp=[];
        Ce1=[];
        
        for T1=1:0.005:(T2)
            C=compound(s0,K1,K2,r,T1,T2,sigma,q);
            Cp=[Cp;C];
            Ce=blsprice(s0,K1+K2,r,T2,sigma,q);
            Ce1=[Ce1;Ce];
        end
        Cp=[Cp;C]
        Ce1=[Ce1;Ce]
        plot(Cp)
        hold on;
        plot(Ce1,'r')
        xlabel('T1');
        ylabel('price');
        axis([1 8 1 15]);

 
	HW10
        function Price=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,N,rho)
            
            nuvT=(r-qv-0.5*sigmav^2)*T;
            nuuT=(r-qu-0.5*sigmau^2)*T;
            sivT=sigmav*sqrt(T);
            siuT=sigmau*sqrt(T);
            [x1,x2]=cholesky(rho,N);
    
            DiscPayoff=exp(-r*T)*max(0,v0*exp(nuvT+sivT*x1)-u0*exp(nuuT+siuT*x2));
            Price=normfit(DiscPayoff);
        
        
		function [x1,x2]=cholesky(rho,N)
            randn('seed',0);
            x1=randn(N,1);
            x2=rho*x1+sqrt(1-rho^2)*randn(N,1);
            end
        
        
        
        function C=outperform(v0,u0,qv,qu,sigmav,sigmau,T,rho)
            sigma=sqrt(sigmav^2+sigmau^2-2*rho*sigmav*sigmau);
            d1=(log(v0/u0)+(qu-qv+(sigma^2)/2)*T)/(sigma*sqrt(T));
            d2=d1-sigma*sqrt(T);
            C=v0*exp(-qv*T)*normcdf(d1)-u0*exp(-qu*T)*normcdf(d2);
            end    	
         
            
            
       	v0=30;
        u0=50;
        qv=0.2;
        qu=0.3;
        sigmav=0.25;
        sigmau=0.2;
        T=1;
        rho=0.2;
        r=0.1;
        
        BlsO=outperform(v0,u0,qv,qu,sigmav,sigmau,T,rho)
        MCO100=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,100,rho)
        MCO1000=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,1000,rho)
        MCO10000=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,10000,rho)
        MCO100000=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,100000,rho)  

 HW12
 	% AssetPaths1.m
        function SPaths=AssetPaths1(S0,mu,sigma,T,NSteps,NRepl)
        dt = T/NSteps;
        nudt = (mu-0.5*sigma^2)*dt;
        sidt = sigma*sqrt(dt);
        
        Increments = nudt + sidt*randn(NRepl, NSteps);
        LogPaths = cumsum([log(S0)*ones(NRepl,1) , Increments] , 2);
        SPaths = exp(LogPaths);
        
        
	%computeLookbackMCHalton
        S0=50;
        X=50;
        r=0.1;
        T=1;
        sigma=0.4;
        NSteps=300;
        NRepl=1000;
        PMC=LookbackMC(S0,r,T,sigma,NRepl,NSteps);
        PHalton = LookbackHalton(S0,r,T,sigma,NRepl,NSteps);
        PMC
        PHalton
    
    
    
    % HaltonPaths.m
        function SPaths=HaltonPaths(S0,mu,sigma,T,NSteps,NRepl)
        dt = T/NSteps;
        nudt = (mu-0.5*sigma^2)*dt;
        sidt = sigma*sqrt(dt);
        NRepl = 2*ceil(NRepl/2); % make sure it's even
        % Use Box Muller to generate standard normals
        RandMat = zeros(NRepl, NSteps);
        seeds = myprimes(2*NSteps);
        Base1 = seeds(1:NSteps);
        Base2 = seeds((NSteps+1):(2*NSteps));
        
        for i=1:NSteps
           H1 = GetHalton(NRepl/2,Base1(i));
           H2 = GetHalton(NRepl/2,Base2(i));
           VLog = sqrt(-2*log(H1));
           Norm1 = VLog .* cos(2*pi*H2);
           Norm2 = VLog .* sin(2*pi*H2);
           RandMat(:,i) = [Norm1 ; Norm2];
        end
        Increments = nudt + sidt*RandMat;
        LogPaths = cumsum([log(S0)*ones(NRepl,1) , Increments] , 2);
        SPaths = exp(LogPaths);
        

	%LookbackOptionHalton
        function P = LookbackHalton(S0,r,T,sigma,NRepl,NSteps)
        Payoff = zeros(NRepl,1);
        
        Path = HaltonPaths(S0,r,sigma,T,NSteps,NRepl);
        SMax=max(Path,[],2);
        Payoff = max (0, SMax-Path(NSteps+1));
        
        [P,aux,CI] = normfit(exp(-r*T)*Payoff);        

	

	%LookbackOptionMC
        function [P,CI] = LookbackMC(S0,r,T,sigma,NRepl,NSteps)
        Payoff = zeros(NRepl,1);
        for i=1:NRepl
         Path = AssetPaths1(S0,r,sigma,T,NSteps,1);
         SMax = max(Path);
         Payoff(i) = max (0, SMax-Path(NSteps+1));
        end
        [P,aux,CI]=normfit(exp(-r*T)*Payoff);
        
            
    function p = myprimes(N)
        found = 0;
        trynumber = 2;
        p = [];
        while (found < N)
           if isprime(trynumber)
              p = [p , trynumber];
              found = found + 1;
           end
           trynumber = trynumber + 1;
        end
        
 
 HW13
    
    % EuPutExpl1.m
        function price = EuPutExpl1(S0,X,r,T,sigma,Smax,dS,dt)
        % set up grid and adjust increments if necessary
        M = round(Smax/dS);
        dS = Smax/M;
        N = round(T/dt);
        dt = T/N;
        matval = zeros(M+1,N+1);
        vetS = linspace(0,Smax,M+1)';
        vetj = 0:N;
        veti = 0:M;
        % set up boundary conditions
        matval(:,N+1) = max(X-vetS,0);
        matval(1,:) = X*exp(-r*dt*(N-vetj));
        matval(M+1,:) = 0;
        % set up coefficients 
        a = 0.5*dt*(sigma^2*veti - r).*veti;
        b = 1- dt*(sigma^2*veti.^2 + r);
        c = 0.5*dt*(sigma^2*veti + r).*veti;
        % solve backward in time
        for j=N:-1:1
           for i=2:M
              matval(i,j) = a(i)*matval(i-1,j+1) + b(i)*matval(i,j+1)+ ...
                 c(i)*matval(i+1,j+1);
           end
        end
        % find closest point to S0 on the grid and return price
        % possibly with a linear interpolation
        idown = floor(S0/dS);
        iup = ceil(S0/dS);
        if idown == iup
           price = matval(idown+1,1);
        else
           price = matval(idown+1,1) + ...
              (S0 –(idown+1)*dS)*(matval(iup+1,1) - matval(iup,1))/dS;
        end 

 
 HW14
 	function [price,callprice,vetS,vetT] = EuCallImpl(S0,X,r,T,sigma,Smax,dS,dt)
        M=round(Smax/dS);
        dS=Smax/M;
        N=round(T/dt);
        dt=T/N;
        callprice=zeros(M+1,N+1);
        vetS=linspace(0,Smax,M+1)';
        vetj=0:N;
        veti=0:M;
        vetT=linspace(0,T,N+1)';
        
        callprice(:,N+1)=max(vetS-X,0);
        callprice(1,:)=0;
        callprice(M+1,:)=Smax-X*exp(-r*dt*(N-vetj));
        
        a=0.5*(r*dt*veti-sigma^2*dt*(veti.^2));
        b=1+sigma^2*dt*(veti.^2)+r*dt;
        c=-0.5*(r*dt*veti+sigma^2*dt*(veti.^2));
        coeff=diag(a(3:M),-1)+diag(b(2:M))+diag(c(2:M-1),1);
        [L,U]=lu(coeff);
        
        aux=zeros(M-1,1);
        for j=N:-1:1
           aux(M-1)=-c(M)*callprice(M+1,j);
           %matval(2:M,j)=U\(L\(matval(2:M,j+1)+aux));
           callprice(2:M,j)=coeff\(callprice(2:M,j+1)+aux);
        end
        
        idown=floor(S0/dS);
        iup=ceil(S0/dS);
        if idown==iup
           price=callprice(idown+1,1);
        else
           price=callprice(idown+1,1)+(S0-idown*dS)*(callprice(idown+2,1)-callprice(idown+1,1))/dS;
        end


	function [C,callprice,vetS,vetT]=EurCallExp(S0,X,r,T,sigma,Smax,dS,dt)
        M=round(Smax/dS);
        dS=Smax/M;
        N=round(T/dt);
        dt=T/N;
        callprice=zeros(M+1,N+1);
        vetS=linspace(0,Smax,M+1)';
        vetj=0:N;
        veti=0:M;
        vetT=linspace(0,T,N+1)';
        callprice(:,N+1)=max(vetS-X,0);
        callprice(1,:)=0;
        callprice(M+1,:)=Smax-X*exp(-r*dt*(N-vetj));
        a=0.5*dt*(sigma^2*veti-r).*veti;
        b=1-dt*(sigma^2*veti.^2+r);
        c=0.5*dt*(sigma^2*veti+r).*veti;
        
        for j=N:-1:1
            for i=2:M
                callprice(i,j)=a(i)*callprice(i-1,j+1)+b(i)*callprice(i,j+1)+c(i)*callprice(i+1,j+1);
            end
        end
        
        idown=floor(S0/dS);
        iup=ceil(S0/dS);
        if isequal(idown,iup)
            C=callprice(idown+1,1);
        else
            C=callprice(idown+1,1)+(S0-(idown+1)*dS)*(callprice(iup+1,1)-callprice(iup,1))/dS;
        end
	

        S0=50;
        X=50;
        r=0.1;
        T=5/12;
        sigma=0.4;
        Smax=100;
        dS1=0.5;
        dS2=1;
        dS3=2;
        dT=5/2400;
        
        c=blsprice(S0,X,r,T,sigma);
        ImpcalldS1=EuCallImpl(S0,X,r,T,sigma,Smax,dS1,dT);
        ImpcalldS2=EuCallImpl(S0,X,r,T,sigma,Smax,dS2,dT);
        ImpcalldS3=EuCallImpl(S0,X,r,T,sigma,Smax,dS3,dT);
        
        c
        ImpcalldS1
        ImpcalldS2
        ImpcalldS3
        
        [price,callprice,vetS,vetT]=EuCallImpl(S0,X,r,T,sigma,Smax,dS1,dT);
        %callprice
        mesh(vetT,vetS,callprice);
        ylabel('Stock price'); xlabel('Time'); title('European Call Option, Implicit Method');

    	
    	
    
        S0=50;
        X=50;
        r=0.1;
        T=5/12;
        sigma=0.3;
        Smax=100;
        dS=2;
        dT=5/1200;
        
        [C,callprice,vetS,vetT]=EurCallExp(S0,X,r,T,sigma,Smax,dS,dT);
        
        %callprice
        C
        mesh(vetT,vetS,callprice);
        ylabel('Stock price'); xlabel('Time'); title('European Call Option, Explicit Method');