예제 #1
0
 def clean_price(self):
     ws = 1.0 if (self.otype[0].upper() == 'C') else -1.0
     n = len(self.fixing_dates)
     m = len(self.past_fix)
     if n == m:
         return max((self.past_avg - self.strike) * ws, 0.0)
     strike = (self.strike * n - self.past_avg * m) / float(n - m)
     if strike < 0:
         return max(
             (self.past_avg * m + self.fwd_avg *
              (n - m)) / float(n) - self.strike, 0) if ws > 0 else 0.0
     volnode = cmq_volgrid.Delta5VolNode( self.value_date, \
                                     self.volmark['expiry'], \
                                     self.fwd_avg, \
                                     self.volmark['COMVolATM'], \
                                     self.volmark['COMVolV90'], \
                                     self.volmark['COMVolV75'], \
                                     self.volmark['COMVolV25'], \
                                     self.volmark['COMVolV10'], \
                                     "act365")
     ivol = volnode.GetVolByStrike(strike, self.end)
     cal_str = cmq_crv_defn.COM_Curve_Map[
         self.fwd_index]['calendar'] + '_Holidays'
     hols = getattr(misc, cal_str)
     tau = misc.conv_expiry_date(self.value_date + datetime.timedelta(days = int(self.eod_flag)), \
                                 self.start - datetime.timedelta(days=1), \
                                 self.accrual, hols)
     t_exp = misc.conv_expiry_date(self.value_date + datetime.timedelta(days = int(self.eod_flag)), \
                                 self.end, self.accrual, hols)
     vol_adj = bsopt.asian_vol_adj(ivol, t_exp, tau)
     pr = bsopt.BSFwd((ws > 0), self.fwd_avg, strike, vol_adj, t_exp,
                      0) * self.df * float(n - m) / float(n)
     return pr
예제 #2
0
 def clean_price(self):
     if self.value_date > self.end:
         return 0.0
     ws = 1.0 if (self.otype[0].upper() == 'C') else -1.0
     n = len(self.fixing_dates)
     m = len(self.past_fix)
     if n == m:
         return max((self.past_avg - self.strike) * ws, 0.0)
     strike = (self.strike * n - self.past_avg * m)/float(n - m)
     if strike < 0:
         return max((self.past_avg * m + self.fwd_avg * (n - m))/float(n) - self.strike, 0) if ws > 0 else 0.0
     volnode = cmq_volgrid.Delta5VolNode( self.value_date, \
                                     self.volmark['expiry'], \
                                     self.fwd_avg, \
                                     self.volmark['COMVolATM'], \
                                     self.volmark['COMVolV90'], \
                                     self.volmark['COMVolV75'], \
                                     self.volmark['COMVolV25'], \
                                     self.volmark['COMVolV10'], \
                                     "act365")
     ivol = volnode.GetVolByStrike( strike, self.end)
     cal_str = cmq_crv_defn.COM_Curve_Map[self.fwd_index]['calendar'] + '_Holidays'
     hols = getattr(misc, cal_str)
     tau = misc.conv_expiry_date(self.value_date + datetime.timedelta(days = int(self.eod_flag)), \
                                 self.start - datetime.timedelta(days=1), \
                                 self.accrual, hols)
     t_exp = misc.conv_expiry_date(self.value_date + datetime.timedelta(days = int(self.eod_flag)), \
                                 self.end, self.accrual, hols)
     vol_adj = bsopt.asian_vol_adj(ivol, t_exp, tau)
     pr =  bsopt.BSFwd((ws>0), self.fwd_avg, strike, vol_adj, t_exp, 0) * self.df * float(n - m) / float(n)
     return pr
예제 #3
0
 def initialize(self):
     self.tau = max(0.0, self.calc_texp(datetime.date(self.exp_date.year, self.exp_date.month, 1) \
                                   - datetime.timedelta(days=1)))
     self.vol_adj = bsopt.asian_vol_adj(self.atm, self.time2exp, self.tau)
     super(AsianDelta5VolNode, self).initialize()