cmq_rate_index.py 文件源码

python
阅读 19 收藏 0 点赞 0 评论 0

项目:pyktrader2 作者: harveywwu 项目源码 文件源码
def theta_fn(self, proj, libors, paydate): # theta of one coupon period      
        ts, te, cov = self.__parse_libors(libors)
        eta = (te - paydate.t) / (te - ts) 
        p = 1.0 + np.array([l.forward(proj) for l in libors]) * cov #p = proj(ts) / proj(te) # = (1 + libor * cov)
        xi = self.__xi(proj.t0, ts, te) # proj.t0 is spotdate of curve
        def capfloor(k, s): # forward/undiscounted caplet(s=1)/floorlet(s=-1) price
            zstar = np.log((1 + k) / p) / xi - xi / 2
            return s * (p * norm.cdf(-zstar * s) - (1 + k) * norm.cdf(-(zstar + xi) * s))  
        def digital(k, s): # s=1 ==> 1 for above k; s=-1 ==> 1 for below k
            km = cov * (k - self.digi_gap * s)
            kp = cov * (k + self.digi_gap * s) 
            return (1 + eta * kp) * capfloor(km,s) - (1 + eta * km) * capfloor(kp,s)

        denom = 2 * self.digi_gap * cov #* (1 + eta * (p - 1)) # p - 1 = libor * cov
        if self.rng_type == 'between': # inside; == (digital(rng_high,-1) - digital(rng_low,-1)) / denom            
            ratio = (digital(self.rng_low,1) - digital(self.rng_high,1)) / denom
        elif self.rng_type == 'outside': # outside
            ratio = (digital(self.rng_low,-1) + digital(self.rng_high,1)) / denom
        elif self.rng_type == 'above': # above rate
            ratio = digital(self.rng_rate,1) / denom
        elif self.rng_type == 'below': # below rate
            ratio = digital(self.rng_rate,-1) / denom

        if self.lk_type == 'skipped':
            ratio = ratio[:self.lk_days]
        elif self.lk_type == 'crystallized':
            ratio[self.lk_days:] = ratio[self.lk_days] 
        return np.mean(ratio)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号