求解无风险利率
#include <math.h>
#pragma mark - BSModel期权定价模型
// N 函数
double N(double a)
{
return (1 + erf(a / sqrt(2)))/2;
}
// 看涨期权定价公式
double call_option_price(double L, double S,double T,double r, double v){
double C, d1, d2;
d1 = (log(S/L) + (r + 0.5 * v * v) * T)/(v * sqrt(T));
d2 = d1 - v * sqrt(T);
C = S * N(d1) - L * exp(-r * T) * N(d2);
return C;
}
// 看跌期权定价公式
double put_option_price(double L, double S,double T,double r, double v){
double P, d1, d2;
d1 = (log(S/L) + (r + 0.5 * v * v) * T)/(v * sqrt(T));
d2 = d1 - v * sqrt(T);
P = L * exp(-r * T)* (N(-d2)) - S * (N(-d1));
return P;
}
/**
L:期权执行价
S:标的价格
T:有效期 ,剩余天数/365
r:无风险利率
C:期权价格
t: 期权类型,0看涨期权,1看跌期权
d: 精确度
return: 隐含波动率
*/
double implied_volatility_bs(double L, double S,double T,double r, double OP, int t, double d){
double h = 100;
double l = 0;
double p, op;
int counter = 0;
do {
p = (h + l) / 2;
op = t == 0 ? call_option_price(L, S, T, r, p/100) : put_option_price(L, S, T, r, p/100);
op < OP ? (l = p) : (h = p);
counter += 1;
if (counter > 20) {
break;
}
} while (fabs(op - OP) > d);
return p;
}
设置参数
double v = 0.0;
double S = 51370;
double L = 49000;
double OP = 377;
double d = 0.01;
double T = 31.0;
double iv = implied_volatility_bs(L, S, T/366.0, v, OP, 1, d);
printf("%.2f\n", iv);
输出结果为:20.78。
网友评论