forum.alglib.net http://forum.alglib.net/ |
|
ALGLIB and C++ http://forum.alglib.net/viewtopic.php?f=2&t=328 |
Page 2 of 2 |
Author: | SteSus85 [ Fri Sep 28, 2012 1:06 pm ] |
Post subject: | Re: ALGLIB and C++ |
Hello. I got it work more or less. It works very fast and precisely for 1 parameter, quite good for 2 parameters, more or less good for 3 parameters in case of good guess and with scaling. I have the biggest trouble for the case of 4 parameters. It makes first step, which is often worth than initial guess and then it makes very very small steps w.r.t. all parameters. I guess it could be because the values of function are much bigger than the differences of it from step to step. Could it be a problem? How to treat it? Or may be I do scaling incorrect? One of examples (correct answer is c[0]=3, c[1]=1.4,c[2]=0.95): ![]() p.s. I hope I managed to descibe my problem. |
Author: | Sergey.Bochkanov [ Sun Sep 30, 2012 7:57 am ] |
Post subject: | Re: ALGLIB and C++ |
Can you post your code here? I need: a) data you used for fitting, b) function being fitted. It is better to reproduce algorithm behavior on real data. |
Author: | SteSus85 [ Mon Oct 01, 2012 6:11 am ] |
Post subject: | Re: ALGLIB and C++ |
Sergey.Bochkanov wrote: Can you post your code here? I need: a) data you used for fitting, b) function being fitted. It is better to reproduce algorithm behavior on real data. a) Code: double function_temp(float p1, float p2, float p3, float p4, float var1) { //float gkk = 0.95f; //float b = 3.f; // Model Param float rho = 0.3f; // Model Param //float sigma0 = 0.02f; // Model Param //float m0 = 1.4f; // Model Param int k = 6; // Fixed Param !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! float lambda = -0.1f; // Option Param float initPrice = 50.f; // Option Param // float strikePrice = 65.f; // Option Param float interest = 0.00018f; // Option Param int noOfSum = 300; // Sym Param int width = 128; // Sym Param int height = 256;// 256; // Sym Param float temp; return (double)clMonteCarloAMSM( p3,//gkk, // Model Param p1,//b, // Model Param rho, // Model Param p4,//sigma0, // Model Param p2, // Model Param k, // Fixed Param lambda, // Option Param initPrice, // Option Param var1,//strikePrice, // Option Param interest, // Option Param noOfSum,//noOfSum, // Sym Param width, // Sym Param height, // Sym Param &temp); // return exp(-p1*pow(var1, 2)); std::cout<<" temp = " << (double)temp <<std::endl; } void function_cx_1_func(const real_1d_array &c, const real_1d_array &x, double &func, void *ptr) { // this callback calculates f(c,x)=exp(-c0*sqr(x0)) // where x is a position on X-axis and c is adjustable parameter //func = pow((float)x[0] - (float)c[0],2); // func = function_temp2((float)c[0],(float)x[0]); func = function_temp((float)c[0],(float)c[1],(float)c[2], (float)c[3], (float)x[0]); if (x[0]==50) {std::cout<<" c[0] = " << c[0]<<" c[1] = " << c[1] << " c[2] = " << c[2] <<" c[3] = " << c[3] << " x[0] = " << x[0] << " func = " << (double)func <<std::endl;} } int main(int argc, char * argv[]) { real_2d_array x = "[[30],[32],[34],[36],[38],[40],[42],[44],[46],[48],[50],[52],[54],[56],[58],[60],[62],[64],[66],[68],[70]]"; real_1d_array y = "[21.7538, 19.9783, 18.254, 16.5923, 15.004, 13.4978, 12.0822, 10.7645, 9.54836, 8.43455, 7.42138, 6.50722, 5.68772, 4.95832, 4.31183, 3.74198, 3.24245, 2.80582, 2.42521, 2.09441, 1.80822]"; real_1d_array c = "[3.1, 1.38, 0.97, 0.03]"; //real_1d_array c = "[3.0739, 1.4057, 0.9557]"; real_1d_array bndl = "[2.0, 1.2, 0.9, 0.001]"; real_1d_array bndu = "[10.0, 1.6, 0.9999, 0.06]"; //real_1d_array s = "[0.8e+1, 1.0, 1.5]"; real_1d_array s = "[8.0e-7, 0.4e-7, 0.25e-7, 0.05e-7]"; double epsf = 0; double epsx = 0.00001; // condition on step size ae_int_t maxits = 0; ae_int_t info; lsfitstate state; lsfitreport rep; double diffstep = 1.0e-2; // // Fitting without weights // lsfitcreatef(x, y, c, diffstep, state); lsfitsetcond(state, epsf, epsx, maxits); lsfitsetbc(state, bndl, bndu); lsfitsetscale(state, s); //alglib::lsfitsetxrep(state, true); alglib::lsfitfit(state, function_cx_1_func); lsfitresults(state, info, c, rep); //printf("%d\n", int(state)); std::cout<< "C = " << c.tostring(4).c_str() << std::endl; There are prices computed by the model by using Monte Carlo (in vector y) and strike-price (in vector x). So, it is not really "real" data, but it is generated data. b) It is not so easy. I do calibration of option prices which are calculated by using Monte-Carlo Method (as I wrote above). I can write my model, but I think it would quite difficult to reproduce it. |
Author: | Sergey.Bochkanov [ Mon Oct 01, 2012 11:36 am ] |
Post subject: | Re: ALGLIB and C++ |
It is very hard to tell without debugging actual code, but I suspect that it is somehow connected with the fact that you optimize function which is calculated using Monte-Carlo methods. As I previously told, Monte-Carlo methods do not guarantee smoothness. And even when run in the deterministic setting (same seed value is used every time) they result in function with many sharp local extrema. I suppose that algorithm stalls in one of these extrema. |
Page 2 of 2 | All times are UTC |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |