Solves for the portfolios on the efficient frontier given a specification object.

```
parmafrontier(spec, n.points = 100, miny = NULL, maxy = NULL, type = NULL,
solver = NULL, solver.control = list(), parma.control = list(ubounds = 10000,
mbounds = 1e+05, penalty = 10000), cluster = NULL)
```

n.points

The number of portfolios to solve for along the frontier.

miny

(Optional) Minimum return from which to calculate the frontier. If not provided, will be calculated by a first pass optimization.

maxy

(Optional) Maximum return for which to calculate the frontier. If not provided, will be based on the maximum forecast.

solver

For a GNLP type problem the choice of global solver, either
“cmaes” or “crs” from the `nloptr`

package.

solver.control

A list with optional control parameters passed to the
`nloptr`

or `cmaes`

solver.

parma.control

Internal NLP tuning parameters, where ‘ubounds’ represents the symmetric unconstrained parameter bounds in the fractional problem, ‘mbounds’ the multiplier upper bounds in the fractional formulation, ‘penalty’ the GNLP penalty parameter.

cluster

A precreated cluster object from the parallel package for the parallel evaluation of the frontier portfolios (see note).

A `matrix`

object with columns for the weights, risk, reward and
termination status of the solver (not available for the QP solver), and
n.points rows. The user should investigate the non-converged solutions as well
as remove any NA based rows (non-converged with error).

If using a cluster object, care should be taken since some of the LP based problems are quite memory intensive. Though some care some gone into using slam matrices and forcing garbage collection in intermediate setup steps of these problems, there is no guarantee that memory will not be quickly depleted for large problems using many cores/sockets.