nie potrzeba reinvent the wheel
http://en.wikipedia.org/wiki/Omega_ratio
Kod: Zaznacz cały
int _tmain(int argc, _TCHAR* argv[])
{
boost::math::normal_distribution<Real> normdist;
//////////////////////////
/*Real spott=100.0;
Rate rr=0.03;
Time tauu=0.5;
Volatility voll=0.20;
Real strikee=110.0;
Real a=strikee, b=strikee*10.0;
boost::function<Real(Real)> ptrF;
ptrF=boost::bind(&callFunc, spott, strikee,rr,voll,tauu,_1);
Real absAcc=0.00001;
Size maxEval=1000;
SimpsonIntegral numInt(absAcc, maxEval);//integrating object
std::cout<<" Call Value : "<<numInt(ptrF,a,b)<<std::endl;*/
//////////////////////////
omega om(normdist,-20,20,2,3);
std::cout<<"Omega : "<<om(2)<<std::endl;
om.distribution();
cout<<endl<<endl;
/*std::vector<double>v1(1000);
std::vector<double>v2(1000);
omega asset1omega(normdist,1.3050-1.0,1.3050+1.0,1.3050,0.0020);
omega asset2omega(normdist,1.3050-1.0,1.3050+1.0,1.3050,0.0040);
std::ofstream f("omega.csv",std::ios::app);
namespace pt = boost::posix_time;
pt::ptime now=pt::second_clock::local_time();
std::stringstream ss;
ss<<static_cast<int>(now.date().month())<<"/"<<now.date().day()<<"/"<<now.date().year();
for(int i=0;i<1000;i++){
double dx=0.00005;
double x=1.2800+i*dx;
v1[i]=asset1omega(x);
v2[i]=asset2omega(x);
f<<std::fixed<<i<<","<<x<<", "<<ss.str()<<", "<<v1[i]<<", "<<v2[i]<<std::endl;
}
f.close();*/
//////////////////////////
nlopt::opt opt(nlopt::GN_ISRES, 4);//LN_COBYLA
std::vector<double> lb(1);
lb[0]=0.0; //lower bounds on x[]=x
opt.set_lower_bounds(lb);
std::vector<double> ub(1);
ub[0]=1.0;//upper bounds on x[]=x
opt.set_upper_bounds(ub);
OmegaPortfolio pOmega(normdist,1.3050-1.0,1.3050+1.0,1.3050,1.3050,0.0020,0.0040);
std::vector<double>v1(1000);
std::vector<double>v2(1000);
OmegaPortfolio pSharpeOptimal(normdist,1.3050-1.0,1.3050+1.0,1.3050,1.3050,0.0020,0.0040);
Real sharpe_a=(0.0040*0.0040*1.3050/(0.0040*0.0040*1.3050+0.0020*0.0020*1.3050));
std::ofstream f("omegaportfolio.csv",std::ios::app);
namespace pt = boost::posix_time;
pt::ptime now=pt::second_clock::local_time();
std::stringstream ss;
ss<<static_cast<int>(now.date().month())<<"/"<<now.date().day()<<"/"<<now.date().year();
for(int i=0;i<1000;i++){
double dt=0.00005;
double t=1.2800+i*dt;
v1[i]=pSharpeOptimal(sharpe_a,1-sharpe_a,t);
//and max omega
std::vector<double> x(1);// x[]=re,rg,ru,xeurusd,xgbpusd
x[0] = 0.5;
opt.set_xtol_rel(0.0000001);
opt.set_ftol_rel(0.0000001);
opt.set_maxeval(1000000);
my_constraint_data data[1] ={{pOmega,t}}; //{ {2,0}, {-1,1} };
opt.add_inequality_constraint(xmin_constraint, &data[0], 0.0000001);
opt.add_inequality_constraint(xmax_constraint, &data[0], 0.0000001);
opt.set_max_objective(omegamax, &data[0]);
double mmax;
clock_t tstart=std::clock();
nlopt::result result = opt.optimize(x, mmax);
clock_t tend=std::clock();
float time_elapsed = ((float)tend - (float)tstart);// /1000000.0F
v2[i]=mmax;
//end max
f<<std::fixed<<i<<","<<t<<", "<<ss.str()<<", "<<v1[i]<<", "<<v2[i]<<", a_max: "<<x[0]<<std::endl;
}
f.close();
//////////////////////////
return 0;
}
Dodano po 16 godzinach 13 minutach:
ciekawy miedzy innymi ze wzgledu na powiazane z cena opcji put. 2, prtfel optymalny w sensie Sharpe'a niekoniecznie jest optymalny w sensie najwyzszej relacji prawdopodobienstwa wzrostow powyzej/ponizej zadanego poziomu.
jak na obrazku
Dodano po 7 godzinach 18 minutach:
aby skorzystac z kodu nalezy podpiac QuantLib, Boost i NLopt. no i jeszcze definicje klas : DD
co jest fajne, to obindowanie funkcji (bind) i obliczenie calki oznaczonej. gra muzyka.
jak to policzylem? to uproszczenie dla rozkladu lacznego:
Dodano po 1 minutach:
ze niby normalny. to wtedy:
Dodano po 1 minutach:
zapraszam do dyskusji. koledzy, czy ktos uzywa omegi? czy macie jakies doswiadczenia z ta dosc nowa (2002?) miara?