Download the Jupyter Notebook for this section: optimization.ipynb

Optimization Example

[1]:
import pyblp
import numpy as np

pyblp.__version__
[1]:
'1.1.0'

In this example, we’ll build a L-BFGS-B configuration with a non-default tolerance.

[2]:
optimization = pyblp.Optimization('l-bfgs-b', {'gtol': 1e-3})
optimization
[2]:
Configured to optimize using the L-BFGS-B algorithm implemented in SciPy with analytic gradients and options {gtol: +1.000000E-03}.

Next, instead of using a non-custom routine, we’ll create a custom method that implements a grid search over parameter values between specified bounds.

[3]:
from itertools import product
def custom_method(initial, bounds, objective_function, iteration_callback):
   best_values = initial
   best_objective = np.inf
   for values in product(*(np.linspace(l, u, 10) for l, u in bounds)):
       objective, _, _ = objective_function(values)
       if objective < best_objective:
           best_values = values
           best_objective = objective
       iteration_callback()
   return best_values, True

We can then use this custom method to build an optimization configuration.

[4]:
optimization = pyblp.Optimization(custom_method, compute_gradient=False)
optimization
[4]:
Configured to optimize using a custom method without analytic gradients and options {}.