33,321
社区成员




#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
class Option_Price
{
double Spot_Price, Strike_Price, Inerest_Rate, Vol, Time;
public:
double CND(double x);
double CallOption(double S, double X, double r, double sigma, double t);
};
//------------------------------------------------------------------------------------------------------
double Option_Price::CND(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;
double prob;
if(x >= 0.0)
{
double t = 1.0 / ( 1.0 + p * x );
prob=(1.0 - c * exp( -x * x / 2.0 ) * t *( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 )) ;
}
else
{
double prob= 1.0 / ( 1.0 - p * x );
//( c * exp( -x * x / 2.0 ) * t *( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 )) <<endl;
}
return prob;
};
//------------------------------------------------------------------------------------------------------
double Option_Price::CallOption(double S, double X, double r, double sigma, double t)
{
Spot_Price=S;
Strike_Price=X;
Inerest_Rate=r;
Vol=sigma;
Time=t;
double d1=(log(S/X)+r*t)/(sigma*sqrt(t))+0.5*sigma*sqrt(t);
double d2=d1-(sigma*sqrt(t));
double c=S*Option_Price::CND(d1)-X*exp(-r*t)*Option_Price::CND(d2);
return c;
}
int main()
{
int S=100;
int X=90;
double r=0.05;
double sigma=0.3;
int t=5;
Option_Price Call;
cout <<Call.CallOption(S,X,r,sigma,t) <<endl;
return 0;
}
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
class Option_Price
{
double Spot_Price, Strike_Price, Inerest_Rate, Vol, Time;
public:
double CND(double x);
double CallOption(double S, double X, double r, double sigma, double t);
};
//------------------------------------------------------------------------------------------------------
double Option_Price::CND(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;
double prob;
if(x >= 0.0)
{
double t = 1.0 / ( 1.0 + p * x );
//prob=(1.0 - c * exp( -x * x / 2.0 ) * t *( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 )) <<endl;
}
else
{
double prob= 1.0 / ( 1.0 - p * x );
//( c * exp( -x * x / 2.0 ) * t *( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 )) <<endl;
}
return prob;
};
//------------------------------------------------------------------------------------------------------
double Option_Price::CallOption(double S, double X, double r, double sigma, double t)
{
Spot_Price=S;
Strike_Price=X;
Inerest_Rate=r;
Vol=sigma;
Time=t;
double d1=(log(S/X)+r*t)/(sigma*sqrt(t))+0.5*sigma*sqrt(t);
double d2=d1-(sigma*sqrt(t));
double c=S*Option_Price::CND(d1)-X*exp(-r*t)*Option_Price::CND(d2);
return c;
}
int main()
{
int S=100;
int X=90;
double r=0.05;
double sigma=0.3;
int t=5;
Option_Price Call;
cout <<Call.CallOption(S,X,r,sigma,t) <<endl;
return 0;
}