def compute_best_positions_for_num_legs(num_legs, options, distribution, allow_uncapped_risk, num_to_return): best_positions = [] option_combos = list(itertools.combinations(options, num_legs)) direction_combos = list( itertools.product(['Long', 'Short'], repeat=num_legs)) for option_combo in option_combos: for direction_combo in direction_combos: option_position = [] for i in range(0, num_legs): leg = { 'option': option_combo[i], 'direction': direction_combo[i] } option_position.append(leg) if is_position_allowed(option_position, allow_uncapped_risk): metrics = option_position_metrics.compute_position_metrics( option_position, distribution) option_position_results = OptionPositionResults( option_position, metrics) update_best_positions_list(option_position_results, best_positions, num_to_return) return best_positions
def compute_best_positions_for_num_legs(num_legs, options, distribution, allow_uncapped_risk, num_to_return): best_positions = [] option_combos = list(itertools.combinations(options, num_legs)) direction_combos = list(itertools.product(['Long', 'Short'], repeat=num_legs)) for option_combo in option_combos: for direction_combo in direction_combos: option_position = [] for i in range(0, num_legs): leg = { 'option': option_combo[i], 'direction': direction_combo[i] } option_position.append(leg) if is_position_allowed(option_position, allow_uncapped_risk): metrics = option_position_metrics.compute_position_metrics(option_position, distribution) option_position_results = OptionPositionResults(option_position, metrics) update_best_positions_list(option_position_results, best_positions, num_to_return) return best_positions
def test_compute_position_metrics(self): leg1 = { 'option': { 'type': 'Call', 'strike': 100, 'price': 5 }, 'direction': 'Long' } option_position = [leg1] cdf = lambda x: (x - 95) / (115 - 95) pdf = lambda x: 1 / (115 - 95) my_distribution = distribution.Distribution(95, 115, cdf, pdf) actual_result = option_position_metrics.compute_position_metrics( option_position, my_distribution) expected_win_pct = 0.5 expected_rr = 2.5 / 1.875 expected_max_loss = -5.0 expected_ev = expected_win_pct * expected_rr - (1 - expected_win_pct) self.assertAlmostEqual(expected_win_pct, actual_result['win_pct'], 4) self.assertAlmostEqual(expected_max_loss, actual_result['max_loss'], 4) self.assertAlmostEqual(expected_rr, actual_result['rr'], 4) self.assertAlmostEqual(expected_ev, actual_result['ev'], 4)
def test_compute_position_metrics(self): leg1 = { 'option': { 'type': 'Call', 'strike': 100, 'price': 5 }, 'direction': 'Long' } option_position = [ leg1 ] cdf = lambda x: (x - 95) / (115 - 95) pdf = lambda x: 1 / (115 - 95) my_distribution = distribution.Distribution(95, 115, cdf, pdf) actual_result = option_position_metrics.compute_position_metrics(option_position, my_distribution) expected_win_pct = 0.5 expected_rr = 2.5 / 1.875 expected_max_loss = -5.0 expected_ev = expected_win_pct * expected_rr - (1 - expected_win_pct) self.assertAlmostEqual(expected_win_pct, actual_result['win_pct'], 4) self.assertAlmostEqual(expected_max_loss, actual_result['max_loss'], 4) self.assertAlmostEqual(expected_rr, actual_result['rr'], 4) self.assertAlmostEqual(expected_ev, actual_result['ev'], 4)