Beispiel #1
0
static double spmapprox(int ind, double spot, double strk, double ti, double ri, double dividi, double sigma0,double ka,double theta,double sigma2,double rhow, double alpha)
{
	double  logk;
	double uu, ww, deriv2, deriv3,prob, addterm;
	logk = log(strk);

	// s-p for K
	uu= alpha-ind+1.;
	if(uu==0.) 
	{
		deriv2 = secderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha);
		deriv3 = thirdderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha);
		prob = 0.5 - deriv3/( 6.*deriv2*sqrt(2.*M_PI*deriv2) );
		return prob;
	}
	// s-p for Ko
	ww= 2.0*(uu*logk - mgf(ind, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha));
	if(ww>0.) { ww = sqrt( ww );}
	else { printf("ww<0!\n"); ww= 1.; }
	if(uu<0.){ww *= -1.;}
	//sec deriv
	deriv2 = secderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha);
	deriv3 = thirdderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha);
	//deriv4 = fourthderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha);
	
 	// probability approx Luganini-Rice formula
	if(deriv2>0.) {
	  //znam = uu*sqrt(deriv2);
		addterm = 0.;//(deriv4/(deriv2*deriv2)/8. - 5.*deriv3*deriv3/(deriv2*deriv2*deriv2)/24.)/znam - deriv3/(deriv2*sqrt(deriv2))/4./(znam*znam) - 1./(znam*znam*znam) + 1./(ww*ww*ww) ;
		prob = 1. - cdf_nor(ww) + pnl_normal_density(ww)*( 1.0/(uu*sqrt(deriv2)) - 1.0/ww + addterm);
	}
	else {printf("deriv2<0!\n"); prob=0.;}
		
	return prob;
}
Beispiel #2
0
/**
 * returns the 'index' function-name of the 'lib'
 */
int sblmgr_getfuncname(int lib_id, int index, char *buf) {
#if defined(LNX_EXTLIB) || defined(WIN_EXTLIB)
  slib_t *lib;
  int (*mgf) (int, char *);

  buf[0] = '\0';
  if (lib_id < 0 || lib_id >= slib_count) {
    return 0;
  }
  lib = &slib_table[lib_id];
  mgf = slib_getoptptr(lib, "sblib_func_getname");
  if (mgf == NULL) {
    return 0;
  }
  return mgf(index, buf);
#else
  return 0;
#endif
}