def spread_pricing(options: 'list of options', quantities: 'list of quantities', events, events_bid, events_ask, mc_iterations=10**6): mc_distribution = get_total_mc_distribution(events, options[0].Expiry, mc_iterations=mc_iterations) mc_distribution_bid = get_total_mc_distribution(events_bid, options[0].Expiry, mc_iterations=mc_iterations) mc_distribution_ask = get_total_mc_distribution(events_ask, options[0].Expiry, mc_iterations=mc_iterations) option_prices = [] for i in range(len(options)): #mc_distribution = get_total_mc_distribution(events, option.Expiry, mc_iterations=mc_iterations) if quantities[i] > 0: option_price = OptionPriceMC(options[i], mc_distribution_bid) side = 'Bid' else: option_price = OptionPriceMC(options[i], mc_distribution_ask) side = 'Ask' print("Strike: {:.3f}, {} Price: {:.3f}".format(options[i].Strike, side, option_price)) """ try: call_spread = option_prices[-1] - option_price print("Call Spread: {:2f}".format(call_spread)) except Exception: pass """ option_prices.append(option_price) spread_price = sum([option_price*quantity for option_price, quantity in zip(option_prices, quantities)]) print("Spread Price: {:.3f}".format(spread_price)) return spread_price
def spread_pricing(options: 'list of options', quantities: 'list of quantities', events, mc_iterations=10**6): mc_distribution = get_total_mc_distribution(events, options[0].Expiry, mc_iterations=mc_iterations) option_prices = [] for option in options: #mc_distribution = get_total_mc_distribution(events, option.Expiry, mc_iterations=mc_iterations) option_price = OptionPriceMC(option, mc_distribution) print("Strike: {:.3f}, Price: {:.3f}".format(option.Strike, option_price)) """ try: call_spread = option_prices[-1] - option_price print("Call Spread: {:2f}".format(call_spread)) except Exception: pass """ option_prices.append(option_price) spread_price = sum([ option_price * quantity for option_price, quantity in zip(option_prices, quantities) ]) print("Spread Price: {:.3f}".format(spread_price)) return spread_price
def get_bid_ask_sheet(event_groupings, event_grouping_names, expiry, metric = 'IV', mc_iterations = 10**5): #labels = ['Bid - {}'.format(metric), 'Mid - {}'.format(metric), 'Ask - {}'.format(metric), 'New - {}'.format(metric)] event_grouping_names = ['{} - {}'.format(label, metric) for label in event_grouping_names] mc_distributions = list(map(lambda events: get_total_mc_distribution(events, expiry, mc_iterations=mc_iterations), event_groupings)) implied_vols = list(map(lambda dist: get_option_sheet_from_mc_distribution(dist, expiry).loc[:, [(expiry, metric)]], mc_distributions)) show_mc_distributions_as_line_chart(mc_distributions, labels = event_grouping_names) return reduce(lambda x,y: pd.merge(x, y, left_index=True, right_index=True), implied_vols)
def option_pricing(): option_type = 'Call' strike = 1.0 expiry = dt.date(2018, 10, 10) option = Option(option_type, strike, expiry) mc_distribution = get_total_mc_distribution(events, expiry, mc_iterations=10**6) option_price = OptionPriceMC(option, mc_distribution) print("Expiry: {}, Price: {}".format(expiry, option_price))
def spread_pricing(options: 'list of options', quantities: 'list of quantities', events, description = None, mc_iterations=10**6): mc_distribution = get_total_mc_distribution(events, options[0].Expiry, mc_iterations=mc_iterations) option_prices = [] for i in range(len(options)): option_price = OptionPriceMC(options[i], mc_distribution) option_prices.append(option_price) logger.info("Strike: {:.3f}, {} Price: {:.3f}".format(options[i].Strike, description, option_price)) spread_price = sum([option_price*quantity for option_price, quantity in zip(option_prices, quantities)]) logger.info("Spread Price: {:.3f}".format(spread_price)) return spread_price
def term_structure(events, expiries): mc_distributions = list( map(lambda expiry: get_total_mc_distribution(events, expiry), expiries)) implied_vols = list( map( lambda dist, expiry: get_option_sheet_from_mc_distribution( dist, expiry).loc[:, ['IV']], mc_distributions, expiries)) show_mc_distributions_as_line_chart(mc_distributions) return reduce( lambda x, y: pd.merge(x, y, left_index=True, right_index=True), implied_vols)
def individual_option_pricing(): option_type = 'Call' strike = 1.0 expiry = dt.date(2018, 5, 10) expiries = pd.date_range(pd.datetime.today(), periods=100).tolist() expiries = [expiry]*100 print(isinstance(expiries[0], dt.datetime)) for expiry in expiries: option = Option(option_type, strike, expiry) mc_distribution = get_total_mc_distribution(events, expiry, mc_iterations=10**6) option_price = OptionPriceMC(option, mc_distribution) print((expiry, option_price))
def bid_ask(events_bid, events, events_ask, expiry, metric='IV', mc_iterations=10**5): mc_distributions = list( map( lambda events: get_total_mc_distribution( events, expiry, mc_iterations=mc_iterations), [events_bid, events, events_ask])) implied_vols = list( map( lambda dist: get_option_sheet_from_mc_distribution(dist, expiry). loc[:, [(expiry, metric)]], mc_distributions)) show_mc_distributions_as_line_chart(mc_distributions, labels=[ 'Bid - {}'.format(metric), 'Mid - {}'.format(metric), 'Ask - {}'.format(metric) ]) return reduce( lambda x, y: pd.merge(x, y, left_index=True, right_index=True), implied_vols)