def test_get_price(self): call = Option('call', TSLA, 420, datetime(2020, 12, 4)) call.price = 420 chain = OptionChain(TSLA, datetime.now()) chain.add_option(call) self.assertEqual(420, chain.get_price(call))
def parse_chain(self, date, security, path): chain = OptionChain(security, date) df = pd.read_csv(path, parse_dates=['expiration'], date_parser=from_small_date) for index, contract in df.iterrows(): expiration = contract['expiration'] direction = contract['direction'] strike = contract['strike'] option = Option(direction, security, strike, expiration) option.price = contract['price'] option.delta = contract['delta'] option.theta = contract['theta'] option.vega = contract['vega'] chain.add_option(option) return chain
def _parse_chain(self, date, security, contracts): chain = OptionChain(security, date) for contract in contracts: fields = contract.split(' ') match = re.match(r'(\d+)(c|p)(\d+\.\d*)', fields[0]) expiration = datetime.strptime(match[1], '%y%m%d') direction = 'call' if match[2] == 'c' else 'put' strike = float(match[3]) price = float(fields[1]) delta = float(fields[2]) theta = float(fields[3]) option = Option(direction, security, strike, expiration) option.price = price option.delta = delta option.theta = theta chain.add_option(option) return chain
def test_otm(self): security = Security('TSLA') security.add_quote(Quote(420, datetime.now())) o1 = Option('call', security, 500, datetime(2020, 4, 20)) o2 = Option('put', security, 300, datetime(2020, 4, 20)) o3 = Option('call', security, 100, datetime(2020, 4, 20)) # ITM chain = OptionChain(security, datetime.now()) chain.add_option(o1) chain.add_option(o2) chain.add_option(o3) calls, puts = chain.otm(datetime(2020, 4, 20)).values() self.assertEqual(1, len(calls)) self.assertEqual(1, len(puts))
def test_search(self): security = Security('TSLA') o1 = Option('call', security, 500, datetime(2020, 4, 1)) o1.theta = -2.02 o1.delta = 0.83 o2 = Option('put', security, 300, datetime(2020, 4, 20)) o2.theta = -0.16 o2.delta = -0.34 chain = OptionChain(security, datetime.now()) chain.add_option(o1) chain.add_option(o2) result = chain.search(theta=-2, delta=0.8) assert o1.strike == result.strike result = chain.search(theta=-1, delta=-0.5) assert o2.strike == result.strike
def test_iv(self): security = Security('TSLA') security.add_quote(Quote(420, datetime.now())) o1 = Option('call', security, 700, datetime(2020, 4, 20)) o3 = Option('call', security, 500, datetime(2020, 4, 20)) o2 = Option('put', security, 400, datetime(2020, 4, 20)) o1.iv = 5 o1.price = 2 o2.iv = 2 o2.price = 4 o3.iv = 0.5 o3.price = 10 chain = OptionChain(security, datetime.now()) chain.add_option(o1) chain.add_option(o2) chain.add_option(o3) expected = (5 * 2 + 2 * 4 + 0.5 * 10) / (2 + 4 + 10) result = chain.iv(datetime(2020, 4, 20)) self.assertEqual(expected, result)
def _parse_option_chain(self, security, date, json): chain = OptionChain(security, date) for exp_dt, options in json.items(): for option in options: chain.add_option(self._parse_option(security, exp_dt, option)) return chain