티스토리 뷰

// Switch/case를 이용한 European OPtion Pricing 계산기(Black-Scholes Model 이용)
// by remings(http://remings.tistory.com)
// For my C++ Educational Purpose

#include <iostream>
#include <cmath>
using namespace std;


//Cumulative Normal Distribution Code

double N(const double x)
{
  const double b1 =  0.319381530;
  const double b2 = -0.356563782;
  const double b3 =  1.781477937;
  const double b4 = -1.821255978;
  const double b5 =  1.330274429;
  const double p  =  0.2316419;
  const double c  =  0.39894228;

  if(x >= 0.0) {
      double t = 1.0 / ( 1.0 + p * x );
      return (1.0 - c * exp( -x * x / 2.0 ) * t *
      ( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 ));
  }
  else {
      double t = 1.0 / ( 1.0 - p * x );
      return ( c * exp( -x * x / 2.0 ) * t *
      ( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 ));
    }
}


int main()
{
 char CallPutFlag; // call, put 결정
 double X,S,r,sig,T;
 double eCallPrice=0, ePutPrice=0;
 double d1=0, d2=0;
 double Nd1c=0, Nd2c=0;
 double Nd1p=0, Nd2p=0;
 
 cout<<"어떤 옵션을 계산하고 싶으신가요?\n";
 cout<<"콜옵션일 경우 'c' , 풋옵션일 경우 'p'를 입력해 주십시요=>";

 cin>>CallPutFlag;

 switch(CallPutFlag)
 {
 case 'c':

  {

  cout<<"콜옵션을 선택하셨군요!!"<<endl;
  cout<<"아래에 인수를 넣어주세요\n";
  cout<<"X : ";
  cin>>X;
  cout<<"S : ";
  cin>>S;
  cout<<"r : ";
  cin>>r;
  cout<<"sig : ";
  cin>>sig;
  cout<<"T : ";
  cin>>T;

  int DiffCall;
  DiffCall = S-X;
  if(DiffCall<=0)
  {
   cout<<"이 콜 옵션은 OTM 입니다\n";
   break;
  }
 
  // European Call Option 의 Analytic Equation

  d1 = (log(S/X)+(r-0.5*sig*sig)*T) / (sig*sqrt(T));
  d2 = d1-sig*sqrt(T);
  Nd1c = N(d1);
  Nd2c = N(d2);

  eCallPrice = S*Nd1c - X*exp(-r*T)*Nd2c;


  cout<<"European Call Option Price is ";
  cout<<eCallPrice<<endl;

  break;
  } 
 case 'p':

  {
 
  cout<<"풋옵션을 선택하셨군요!!"<<endl;
  cout<<"아래에 인수를 넣어주세요\n";
  cout<<"X : ";
  cin>>X;
  cout<<"S : ";
  cin>>S;
  cout<<"r : ";
  cin>>r;
  cout<<"sig : ";
  cin>>sig;
  cout<<"T : ";
  cin>>T;

  int DiffPut;
  DiffPut = X-S;
  if(DiffPut<=0)
  {
   cout<<"이 풋 옵션은 OTM 입니다\n";
   break;
  }
 
 
  // European Put Option 의 Analytic Equation

  d1 = (log(S/X)+(r-0.5*sig*sig)*T) / (sig*sqrt(T));
  d2 = d1-sig*sqrt(T);
  Nd1p = N(-d1);
  Nd2p = N(-d2);

  ePutPrice = X*exp(-r*T)*Nd2p - S*Nd1p;


  cout<<"European Put Option Price is ";
  cout<<ePutPrice<<endl;

  break;
  }
 
 return 0;
 }
}

'Language > C' 카테고리의 다른 글

이차원 동적 배열 설정  (0) 2009.01.04
VS2005 에서 VS2008 로 넘어갈때의 팁  (0) 2008.09.01
Financial Numerical Recipes in C ++.  (0) 2008.08.12
Exotic option valuation  (0) 2008.08.12
[while] 중첩 while을 이용한 구구단  (0) 2008.07.28