class calc_weights:
def __init__(self,_r,_sigma):
u,m,d=solve_for_weights_implicit();
discount=exp(-_r*dt);
self.dx=(dt*lam).function(dt,lam);
self.pu=u.subs(r=_r).subs(r=_r,sigma=_sigma).simplify_full().function(dt,lam);
self.pm=m.subs(r=_r).subs(r=_r,sigma=_sigma).simplify_full().function(dt,lam);
self.pd=d.subs(r=_r).subs(r=_r,sigma=_sigma).simplify_full().function(dt,lam);
self.wu=(discount*u).subs(r=_r).subs(r=_r,sigma=_sigma).simplify_full().function(dt,lam);
self.wm=(discount*m).subs(r=_r).subs(r=_r,sigma=_sigma).simplify_full().function(dt,lam);
self.wd=(discount*d).subs(r=_r).subs(r=_r,sigma=_sigma).simplify_full().function(dt,lam);
def __call__(self,_dt,_lam):
return (self.wu(_dt,_lam),self.wm(_dt,_lam),self.wd(_dt,_lam));
def mean(self,dt,lam):
dx=self.dx(dt,lam);
return (self.pu(dt,lam)*dx-self.pd(dt,lam)*dx)*dt;
def stddev(self,dt,lam):
dx=self.dx(dt,lam);
mean=self.mean(dt,lam);
return sqrt((self.pu(dt,lam)*(dx-mean)^2+self.pm(dt,lam)*(-mean)^2+self.pd(dt,lam)*(-dx-mean)^2));
def skewness(self,dt,lam):
dx=self.dx(dt,lam);
mean=self.mean(dt,lam);
stddev=self.stddev(dt,lam);
tmp=(self.pu(dt,lam)*(dx-mean)^3+self.pm(dt,lam)*(-mean)^3+self.pd(dt,lam)*(-dx-mean)^3);
return tmp / (stddev^(3/2));
def kurtosis(self,dt,lam):
dx=self.dx(dt,lam);
mean=self.mean(dt,lam);
stddev=self.stddev(dt,lam);
tmp=(self.pu(dt,lam)*(dx-mean)^4+self.pm(dt,lam)*(-mean)^4+self.pd(dt,lam)*(-dx-mean)^4);
return tmp / stddev^4;
def metric1(self,dt,lam):
eps_u=self.wu(dt,lam)-0.25;
eps_m=self.wm(dt,lam)-0.5;
eps_d=self.wd(dt,lam)-0.25;
return eps_u^2+eps_d^2+eps_m^2;
def metric2(self,dt,lam):
eps_k=(self.kurtosis(dt,lam)-3)/3;
eps_s=self.skewness(dt,lam);
err=max(0,-self.pu(dt,lam),-self.pm(dt,lam),-self.pd(dt,lam));
return eps_k^2+eps_s^2+err^2*100000;