blackopsrepl/portfolio-optimization-python
1
1"""
2Solver Configuration for Portfolio Optimization
3
4This module sets up the SolverForge solver with:
5- Solution class (PortfolioOptimizationPlan)
6- Entity class (StockSelection)
7- Constraint provider (define_constraints)
8- Termination config (configurable, default 30 seconds)
9
10The solver explores different stock selections and finds the best
11portfolio that satisfies all constraints while maximizing return.
12"""
13from solverforge_legacy.solver import SolverManager, SolverFactory, SolutionManager
14from solverforge_legacy.solver.config import (
15 SolverConfig,
16 ScoreDirectorFactoryConfig,
17 TerminationConfig,
18 Duration,
19)
20
21from .domain import PortfolioOptimizationPlan, StockSelection
22from .constraints import define_constraints
23
24
25def create_solver_config(termination_seconds: int = 30) -> SolverConfig:
26 """
27 Create a solver configuration with specified termination time.
28
29 Args:
30 termination_seconds: How long to run the solver (default 30 seconds)
31
32 Returns:
33 SolverConfig configured for portfolio optimization
34 """
35 return SolverConfig(
36 # The solution class that contains all entities
37 solution_class=PortfolioOptimizationPlan,
38
39 # The entity classes that the solver modifies
40 entity_class_list=[StockSelection],
41
42 # The constraint provider that defines business rules
43 score_director_factory_config=ScoreDirectorFactoryConfig(
44 constraint_provider_function=define_constraints
45 ),
46
47 # How long to run the solver
48 termination_config=TerminationConfig(spent_limit=Duration(seconds=termination_seconds)),
49 )
50
51
52# Default solver config (30 seconds)
53solver_config: SolverConfig = create_solver_config()
54
55# Create default solver manager for handling solve requests
56solver_manager: SolverManager = SolverManager.create(SolverFactory.create(solver_config))
57
58# Create solution manager for analyzing solutions
59solution_manager: SolutionManager = SolutionManager.create(solver_manager)
60 