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)