# Efficient Frontier¶

FinQuant allows to optimise a given portfolio by minimising a cost/objective function. The module finquant.efficient_frontier contains a class EfficientFrontier that provides public functions to compute and visualise optimised portfolios.

class finquant.efficient_frontier.EfficientFrontier(mean_returns, cov_matrix, risk_free_rate=0.005, freq=252, method='SLSQP')

An object designed to perform optimisations based on minimising a cost/objective function. It can find parameters for portfolios with

• minimum volatility
• maximum Sharpe ratio
• minimum volatility for a given target return
• maximum Sharpe ratio for a given target volatility

It also provides functions to compute the Efficient Frontier between a range of Returns, plot the Efficient Frontier, plot the optimal portfolios (minimum Volatility and maximum Sharpe Ratio).

__init__(mean_returns, cov_matrix, risk_free_rate=0.005, freq=252, method='SLSQP')
Input:
mean_returns: pandas.Series, individual expected returns for all stocks in the portfolio pandas.DataFrame, covariance matrix of returns int/float (default= 0.005), risk free rate int (default= 252), number of trading days, default value corresponds to trading days in a year string (default= "SLSQP"), type of solver method to use, must be one of: ‘Nelder-Mead’ ‘Powell’ ‘CG’ ‘BFGS’ ‘Newton-CG’ ‘L-BFGS-B’ ‘TNC’ ‘COBYLA’ ‘SLSQP’ ‘trust-constr’ ‘dogleg’ ‘trust-ncg’ ‘trust-exact’ ‘trust-krylov’ all of which are officially supported by scipy.optimize.minimize
efficient_frontier(targets=None)

Gets portfolios for a range of given target returns. If no targets were provided, the algorithm will find the minimum and maximum returns of the portfolio’s individual stocks, and set the target range according to those values. Results in the Efficient Frontier.

Input:
targets: list/numpy.ndarray (default= None) of floats, range of target returns.
Output:
efrontier: numpy.ndarray of (volatility, return) values
efficient_return(target, save_weights=True)

Finds the portfolio with the minimum volatility for a given target return.

Input:
target: float, the target return of the optimised portfolio. boolean (default= True), for internal use only. Whether to save the optimised weights in the instance variable weights (and df_weights). Useful for the case of computing the efficient frontier after doing an optimisation, else the optimal weights would be overwritten by the efficient frontier computations. Best to ignore this argument.
Output:
df_weights: if “save_weights” is True: a pandas.DataFrame of weights/allocation of stocks within the optimised portfolio. if “save_weights” is False: a numpy.ndarray of weights/allocation of stocks within the optimised portfolio.
efficient_volatility(target)

Finds the portfolio with the maximum Sharpe ratio for a given target volatility.

Input:
target: float, the target volatility of the optimised portfolio.
Output:
df_weights: a pandas.DataFrame of weights/allocation of stocks within the optimised portfolio.
maximum_sharpe_ratio(save_weights=True)

Finds the portfolio with the maximum Sharpe Ratio, also called the tangency portfolio.

Input:
save_weights: boolean (default= True), for internal use only. Whether to save the optimised weights in the instance variable weights (and df_weights). Useful for the case of computing the efficient frontier after doing an optimisation, else the optimal weights would be overwritten by the efficient frontier computations. Best to ignore this argument.
Output:
df_weights: if “save_weights” is True: a pandas.DataFrame of weights/allocation of stocks within the optimised portfolio. if “save_weights” is False: a numpy.ndarray of weights/allocation of stocks within the optimised portfolio.
minimum_volatility(save_weights=True)

Finds the portfolio with the minimum volatility.

Input:
save_weights: boolean (default= True), for internal use only. Whether to save the optimised weights in the instance variable weights (and df_weights). Useful for the case of computing the efficient frontier after doing an optimisation, else the optimal weights would be overwritten by the efficient frontier computations. Best to ignore this argument.
Output:
df_weights: if “save_weights” is True: a pandas.DataFrame of weights/allocation of stocks within the optimised portfolio. if “save_weights” is False: a numpy.ndarray of weights/allocation of stocks within the optimised portfolio.
plot_efrontier()

Plots the Efficient Frontier.

plot_optimal_portfolios()

Plots markers of the optimised portfolios for

• minimum Volatility, and
• maximum Sharpe Ratio.
properties(verbose=False)

Calculates and prints out Expected annualised Return, Volatility and Sharpe Ratio of optimised portfolio.

Input:
verbose: boolean (default= False), whether to print out properties or not