holds latest option data timestamp
        only option price is kept at the moment
        https://www.interactivebrokers.com/en/software/api/apiguide/java/tickoptioncomputation.htm

def handleTickOptionComputation(self, msg):
        """
        holds latest option data timestamp
        only option price is kept at the moment
        https://www.interactivebrokers.com/en/software/api/apiguide/java/tickoptioncomputation.htm
        """
        def calc_generic_val(data, field):
            last_val = data['last_' + field].values[-1]
            bid_val  = data['bid_' + field].values[-1]
            ask_val  = data['ask_' + field].values[-1]
            bid_ask_val = last_val
            if bid_val != 0 and ask_val != 0:
                bid_ask_val = (bid_val + ask_val) / 2
            return max([last_val, bid_ask_val])

        def valid_val(val):
            return float(val) if val < 1000000000 else None

        # create tick holder for ticker
        if msg.tickerId not in self.optionsData.keys():
            self.optionsData[msg.tickerId] = self.optionsData[0].copy()

        col_prepend = ""
        if msg.field == "FIELD_BID_OPTION_COMPUTATION":
            col_prepend = "bid_"
        elif msg.field == "FIELD_ASK_OPTION_COMPUTATION":
            col_prepend = "ask_"
        elif msg.field == "FIELD_LAST_OPTION_COMPUTATION":
            col_prepend = "last_"

        # save side
        self.optionsData[msg.tickerId][col_prepend + 'imp_vol']  = valid_val(msg.impliedVol)
        self.optionsData[msg.tickerId][col_prepend + 'dividend'] = valid_val(msg.pvDividend)
        self.optionsData[msg.tickerId][col_prepend + 'delta'] = valid_val(msg.delta)
        self.optionsData[msg.tickerId][col_prepend + 'gamma'] = valid_val(msg.gamma)
        self.optionsData[msg.tickerId][col_prepend + 'vega'] = valid_val(msg.vega)
        self.optionsData[msg.tickerId][col_prepend + 'theta'] = valid_val(msg.theta)
        self.optionsData[msg.tickerId][col_prepend + 'price'] = valid_val(msg.optPrice)

        # save generic/mid
        data = self.optionsData[msg.tickerId]
        self.optionsData[msg.tickerId]['imp_vol'] = calc_generic_val(data, 'imp_vol')
        self.optionsData[msg.tickerId]['dividend'] = calc_generic_val(data, 'dividend')
        self.optionsData[msg.tickerId]['delta'] = calc_generic_val(data, 'delta')
        self.optionsData[msg.tickerId]['gamma'] = calc_generic_val(data, 'gamma')
        self.optionsData[msg.tickerId]['vega'] = calc_generic_val(data, 'vega')
        self.optionsData[msg.tickerId]['theta'] = calc_generic_val(data, 'theta')
        self.optionsData[msg.tickerId]['price'] = calc_generic_val(data, 'price')
        self.optionsData[msg.tickerId]['underlying'] = valid_val(msg.undPrice)

        # fire callback
        self.ibCallback(caller="handleTickOptionComputation", msg=msg)