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
Пример #3
0
 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)