def test_budget(self):
     """test budget"""
     portfolio_optimization = PortfolioOptimization(
         self.expected_returns, self.covariances, self.risk_factor, self.budget
     )
     portfolio_optimization.budget = 3
     self.assertEqual(portfolio_optimization.budget, 3)
 def test_bounds(self):
     """test bounds"""
     portfolio_optimization = PortfolioOptimization(
         self.expected_returns, self.covariances, self.risk_factor, self.budget, self.bounds
     )
     portfolio_optimization.bounds = [(0, 4), (0, 4), (0, 4), (1, 4)]
     self.assertEqual(portfolio_optimization.bounds, [(0, 4), (0, 4), (0, 4), (1, 4)])
 def test_risk_factor(self):
     """test risk factor"""
     portfolio_optimization = PortfolioOptimization(
         self.expected_returns, self.covariances, self.risk_factor, self.budget
     )
     portfolio_optimization.risk_factor = 0.898989
     self.assertEqual(portfolio_optimization.risk_factor, 0.898989)
 def test_interpret(self):
     """test interpret"""
     portfolio_optimization = PortfolioOptimization(
         self.expected_returns, self.covariances, self.risk_factor, self.budget
     )
     result_x = np.array([0, 1, 0, 1])
     self.assertEqual(portfolio_optimization.interpret(result_x), [1, 3])
 def test_portfolio_variance(self):
     """test portfolio_variance"""
     portfolio_optimization = PortfolioOptimization(
         self.expected_returns, self.covariances, self.risk_factor, self.budget
     )
     result_x = np.array([0, 1, 0, 1])
     variance = np.dot(result_x, np.dot(self.covariances, result_x))
     self.assertEqual(portfolio_optimization.portfolio_variance(result_x), variance)
    def test_to_quadratic_program(self):
        """Test to_quadratic_program"""
        portfolio_optimization = PortfolioOptimization(
            self.expected_returns, self.covariances, self.risk_factor, self.budget
        )
        actual_op = portfolio_optimization.to_quadratic_program()

        expected_op = QuadraticProgram(name="Portfolio optimization")
        for i in range(self.num_assets):
            expected_op.binary_var(name="x_{0}".format(i))
        quadratic = {
            (i, j): self.risk_factor * self.covariances[i][j]
            for i in range(self.num_assets)
            for j in range(self.num_assets)
        }
        linear = {i: -self.expected_returns[i] for i in range(self.num_assets)}
        expected_op.minimize(quadratic=quadratic, linear=linear)
        linear = {i: 1 for i in range(self.num_assets)}
        expected_op.linear_constraint(linear=linear, sense="==", rhs=self.budget)
        self.assertEqualQuadraticProgram(actual_op, expected_op)
 def test_to_quadratic_program(self):
     """Test to_quadratic_program"""
     # When bounds is None
     portfolio_optimization = PortfolioOptimization(
         self.expected_returns, self.covariances, self.risk_factor, self.budget
     )
     actual_op = portfolio_optimization.to_quadratic_program()
     expected_op = QuadraticProgram(name="Portfolio optimization")
     for i in range(self.num_assets):
         expected_op.binary_var(name=f"x_{i}")
     quadratic = {
         (i, j): self.risk_factor * self.covariances[i][j]
         for i in range(self.num_assets)
         for j in range(self.num_assets)
     }
     linear = {i: -self.expected_returns[i] for i in range(self.num_assets)}
     expected_op.minimize(quadratic=quadratic, linear=linear)
     linear = {i: 1 for i in range(self.num_assets)}
     expected_op.linear_constraint(linear=linear, sense="==", rhs=self.budget)
     self.assertEqualQuadraticProgram(actual_op, expected_op)
     # When bounds is provided
     portfolio_optimization = PortfolioOptimization(
         self.expected_returns, self.covariances, self.risk_factor, self.budget, self.bounds
     )
     actual_op = portfolio_optimization.to_quadratic_program()
     expected_op = QuadraticProgram(name="Portfolio optimization")
     for i in range(self.num_assets):
         expected_op.integer_var(
             lowerbound=self.bounds[i][0], upperbound=self.bounds[i][1], name=f"x_{i}"
         )
     quadratic = {
         (i, j): self.risk_factor * self.covariances[i][j]
         for i in range(self.num_assets)
         for j in range(self.num_assets)
     }
     linear = {i: -self.expected_returns[i] for i in range(self.num_assets)}
     expected_op.minimize(quadratic=quadratic, linear=linear)
     linear = {i: 1 for i in range(self.num_assets)}
     expected_op.linear_constraint(linear=linear, sense="==", rhs=self.budget)
     self.assertEqualQuadraticProgram(actual_op, expected_op)
 def test_is_compatibility(self, expected_returns, covariances, risk_factor, budget, bounds):
     """Test error cases in _is_compatibility"""
     with self.assertRaises(QiskitFinanceError):
         _ = PortfolioOptimization(expected_returns, covariances, risk_factor, budget, bounds)