azapy.Analyzers package

Submodules

azapy.Analyzers.BTADAnalyzer module

class azapy.Analyzers.BTADAnalyzer.BTADAnalyzer(alpha=[0.0], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='BTAD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, detrended=False, method='ecos', verbose=False)

Bases: _RiskAnalyzer

Mixture BTAD (Below Threshold Absolute Deviation) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio mBTAD risk

  • primary_risk_comp : list - portfolio mBTAD components

  • secondary_risk_comp : list - portfolio thresholds, alpha (input values)

  • sharpe : float - Omega ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primery_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(alpha=[0.0], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='BTAD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, detrended=False, method='ecos', verbose=False)

Constructor

Parameters:
alphalist, optional

List of BTAD thresholds. The default is [0.].

coeflist, optional

List of positive mixture coefficients. Must be the same size as alpha. A None value assumes an equal weighted risk mixture. The vector of coefficients will be normalized to unit. The default is None.

mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘BTAD’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with thier sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

detrendedBoolean, optional

If it set to True then the rates of return are detrended (mean=0). The default value is True.

methodstr, optional

Linear programming numerical method. Could be: ‘ecos’, ‘highs-ds’, ‘highs-ipm’, ‘highs’, ‘interior-point’, ‘glpk’ and ‘cvxopt’. The default is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are: ‘date’, ‘symbol1’, ‘symbol2’, etc.

Returns
——-
`None`
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.BTSDAnalyzer module

class azapy.Analyzers.BTSDAnalyzer.BTSDAnalyzer(alpha=[0.0], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='BTSD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, detrended=False, method='ecos', verbose=False)

Bases: BTADAnalyzer

Mixture BTSD (Below Threshold Standard Deviation) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio mBTSD risk

  • primary_risk_comp : list - portfolio mBTSD components

  • secondary_risk_comp : list - portfolio thresholds, alpha (input values)

  • sharpe : float - Omega ration if rtype is set to ‘Shapre’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primery_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(alpha=[0.0], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='BTSD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, detrended=False, method='ecos', verbose=False)

Constructor

Parameters:
alphalist, optional

List of BTSD thresholds. The default is [0.].

coeflist, optional

List of positive mixture coefficients. Must be the same size as alpha. A None value assumes an equal weighted risk mixture. The vector of coefficients will be normalized to unit. The default is None.

mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘BTSD’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with thier sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

detrendedBoolean, optional

If it set to True then the rates of return are detrended (mean=0). The default value is True.

methodstr, optional

SOCP numerical method. Could be: ‘ecos’, or ‘cvxopt’. The defualt is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are: ‘date’, ‘symbol1’, ‘symbol2’, etc.

Returns
——-
`None`
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.CVaRAnalyzer module

class azapy.Analyzers.CVaRAnalyzer.CVaRAnalyzer(alpha=[0.975], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='CVaR', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Bases: _RiskAnalyzer

Mixture CVaR (Conditional Value at Risk) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio mCVaR risk

  • primary_risk_comp : list - CVaR components of portfolio mCVaR

  • secondary_risk_comp : list - VaR values associated with CVaR components

  • sharpe : float - mCVaR-Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(alpha=[0.975], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='CVaR', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Constructor

Parameters:
alphalist, optional

List of distinct confidence levels. The default is [0.975].

coeflist, optional

List of positive mixture coefficients. Must be the same size as alpha. A None value assumes an equal weighted risk mixture. The vector of coefficients will be normalized to unit. The default is None.

mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘CVaR’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional

Linear programming numerical method. Could be: ‘ecos’, ‘highs-ds’, ‘highs-ipm’, ‘highs’, ‘interior-point’, ‘glpk’ and ‘cvxopt’. The default is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are asset symbols and indexed by observation dates.

Returns:
None
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.EVaRAnalyzer module

class azapy.Analyzers.EVaRAnalyzer.EVaRAnalyzer(alpha=[0.65], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='EVaR', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='excp', verbose=False)

Bases: _RiskAnalyzer

Mixture EVaR (Entropic Value at Risk) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio mEVaR risk

  • primary_risk_comp : list - EVaR components of portfolio mEVaR

  • secondary_risk_comp : list - effective confidence values associated with EVaR components.

  • sharpe : float - mEVaR-Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(alpha=[0.65], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='EVaR', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='excp', verbose=False)

Constructor

Parameters:
alphalist, optional

List of distinct confidence levels. The default is [0.65].

coeflist, optional

List of positive mixture coefficients. Must be the same size as alpha. A None value assumes an equal weighted risk mixture. The vector of coefficients will be normalized to unit. The default is None.

mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘EVaR’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional
Numerical optimization method:

‘ncp’ : nonlinear convex programming (using cvxopt).

‘ncp2’ : nonlinear convex programming (using cvxopt) alternative to ‘ncp’.

‘excp’ : exponential cone programming (using ecos).

The default is ‘excp’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are asset symbols and indexed by observation dates.

Returns:
None
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.GINIAnalyzer module

class azapy.Analyzers.GINIAnalyzer.GINIAnalyzer(mktdata=None, colname='adjusted', freq='Q', hlength=1.25, name='GINI', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Bases: _RiskAnalyzer

GINI based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio GINI risk

  • primary_risk_comp : list - redundant (single element list containing GINI risk value)

  • secondary_risk_comp : list - redundant (same as primary_risk_comp)

  • sharpe : float - GINI-Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets the MkT Data.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(mktdata=None, colname='adjusted', freq='Q', hlength=1.25, name='GINI', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Constructor

Parameters:
mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 1.25 years.

namestr, optional

Portfolio name. The default is ‘GINI’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional

Linear programming numerical method. Could be: ‘ecos’, ‘highs-ds’, ‘highs-ipm’, ‘highs’, ‘interior-point’, ‘glpk’ and ‘cvxopt’. The default is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets the MkT Data.

Parameters:
rratepandas.DataFrame

Market data. It will overwrite the value set by the constructor.

Returns
——-
`None`
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.LSDAnalyzer module

class azapy.Analyzers.LSDAnalyzer.LSDAnalyzer(coef=[1.0], mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='LSD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Bases: MADAnalyzer

m-level LSD (lower Standard Deviation) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio mLSD risk

  • primary_risk_comp : list - delta-risk components of portfolio mLSD

  • secondary_risk_comp : list - cumulative delta-risk components of mLSD

  • sharpe : float - mLSD-Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of MAD for a given portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(coef=[1.0], mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='LSD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Constructor

Parameters:
coeflist, optional

Positive non-increasing list of mixture coefficients. The default is [1.].

mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘LSD’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional

SOCP numerical method. Could be: ‘ecos’ or ‘cvxopt’. The defualt is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of MAD for a given portfolio.

Parameters:
wwlist (numpy.array or pandas.Series)

Portfolio weights.

rratepandas.series, optional

The portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
float
The value of mMAD
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are asset symbols and indexed by observation dates.

Returns:
None
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.MADAnalyzer module

class azapy.Analyzers.MADAnalyzer.MADAnalyzer(coef=[1.0], mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='MAD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Bases: _RiskAnalyzer

m-level MAD (Mean Absolute Deviation) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio mMAD risk

  • primary_risk_comp : list - delta-risk components of portfolio mMAD

  • secondary_risk_comp : list - cumulative delta-risk components of mMAD

  • sharpe : float - mMAD-Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of MAD for a given portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(coef=[1.0], mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='MAD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Constructor

Parameters:
coeflist, optional

Positive non-increasing list of mixture coefficients. The default is [1.].

mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘MAD’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional

Linear programming numerical method. Could be: ‘ecos’, ‘highs-ds’, ‘highs-ipm’, ‘highs’, ‘interior-point’, ‘glpk’ and ‘cvxopt’. The default is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of MAD for a given portfolio.

Parameters:
wwlist (numpy.array or pandas.Series)

Portfolio weights.

rratepandas.series, optional

The portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
float
The value of mMAD
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are asset symbols and indexed by observation dates.

Returns:
None
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.MVAnalyzer module

class azapy.Analyzers.MVAnalyzer.MVAnalyzer(mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='MV', rtype='Sharpe', mu=None, d=1, mu0=0, aversion=None, ww0=None, method='ecos', verbose=False)

Bases: _RiskAnalyzer

MV (Mean-Variance) - Variance based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio MV risk

  • primary_risk_comp : list - redundant (single element list containing MV risk value)

  • secondary_risk_comp : list - redundant (same as primary_risk_comp)

  • sharpe : float - MV-Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='MV', rtype='Sharpe', mu=None, d=1, mu0=0, aversion=None, ww0=None, method='ecos', verbose=False)

Constructor

Parameters:
mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘MV’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional

Quadratic programming numerical method. Could be ‘ecos’ or ‘cvxopt’. The default is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are asset symbols and indexed by observation dates.

Returns:
None
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.SDAnalyzer module

class azapy.Analyzers.SDAnalyzer.SDAnalyzer(mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='SD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Bases: _RiskAnalyzer

SD (Standard Deviation) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio SD risk

  • primary_risk_comp : list - redundant (single element list containing SD risk value)

  • secondary_risk_comp : list - redundant (same as primary_risk_comp)

  • sharpe : float - Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='SD', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Constructor

Parameters:
mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘SD’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional

Quadratic programming numerical method. Could be ‘ecos’ or ‘cvxopt’. The default is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are asset symbols and indexed by observation dates.

Returns:
None
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

azapy.Analyzers.SMCRAnalyzer module

class azapy.Analyzers.SMCRAnalyzer.SMCRAnalyzer(alpha=[0.9], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='SMCR', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Bases: CVaRAnalyzer

Mixture SMCR (Second Momentum Coherent Risk) based optimal portfolio strategies.

Attributes
  • status : int - the computation status (0 - success, any other value signifies an error)

  • ww : pandas.Series - the portfolio weights

  • RR : float - portfolio rate of return

  • risk : float - portfolio mSMCR risk

  • primary_risk_comp : list - SMCR components of portfolio mSMCR

  • secondary_risk_comp : list - SMVaR values associated with SMCR components

  • sharpe : float - mSMCR-Sharpe ration if rtype is set to ‘Sharpe’ or ‘Sharpe2’ otherwise None.

  • diverse : float - diversification factor if rtype is set to ‘Divers’ or ‘MaxDivers’ otherwise None.

  • name : str - portfolio name

Note the following 2 important methods:
  • getWeights : Computes the optimal portfolio weights. During its computations the following class members are also set: risk, primary_risk_comp, secondary_risk_comp, sharpe, RR, divers.

  • getPositions : Provides practical information regarding the portfolio rebalancing delta positions and costs.

Methods

getDiversification(ww[, rrate])

Returns the value of the diversification factor for a give portfolio.

getPositions([nshares, cash, ww, nsh_round, ...])

Computes the rebalanced number of shares.

getRisk(ww[, rrate])

Returns the value of the dispersion (risk) measure for a give portfolio.

getRiskComp()

Returns the risk of each portfolio component.

getWeights([rtype, mu, d, mu0, aversion, ...])

Computes the optimal portfolio weights.

set_method(method)

Sets computation method.

set_mktdata(mktdata[, colname, freq, ...])

Sets historical market data.

set_random_seed([seed])

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

set_rrate(rrate)

Sets portfolio components historical rates of return.

set_rtype([rtype, mu, d, mu0, aversion, ww0])

Sets the optimization type.

viewFrontiers([minrisk, efficient, ...])

Computes the elements of the portfolio frontiers.

__init__(alpha=[0.9], coef=None, mktdata=None, colname='adjusted', freq='Q', hlength=3.25, name='SMCR', rtype='Sharpe', mu=None, d=1, mu0=0.0, aversion=None, ww0=None, method='ecos', verbose=False)

Constructor

Parameters:
alphalist, optional

List of distinct confidence levels. The default is [0.975].

coeflist, optional

List of positive mixture coefficients. Must be the same size as alpha. A None value assumes an equal weighted risk mixture. The vector of coefficients will be normalized to unit. The default is None.

mktdatapandas.DataFrame, optional

Historic daily market data for portfolio components in the format returned by azapy.mktData function. The default is None.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. The default is ‘adjusted’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. The default is ‘Q’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. The default is 3.25 years.

namestr, optional

Portfolio name. The default is ‘SMCR’.

rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

The default is ‘Sharpe’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

methodstr, optional

SOCP numerical method. Could be: ‘ecos’ or ‘cvxopt’. The defualt is ‘ecos’.

verboseBoolean, optional

If it is set to True, then various computation messages (meant as warnings) will be printed. The default is False.

Returns:
The object.
getDiversification(ww, rrate=None)

Returns the value of the diversification factor for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series;

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None then it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The diversification value.
getPositions(nshares=None, cash=0, ww=None, nsh_round=True, verbose=False)

Computes the rebalanced number of shares.

Parameters:
nsharespanda.Series, optional

Initial number of shares per portfolio component. A missing component entry will be considered 0. A None value assumes that all components entries are 0. The name of the components must be present in the mrkdata. The default is None.

cashfloat, optional

Additional cash to be added to the capital. A negative entry assumes a reduction in the total capital available for rebalance. The total capital cannot be < 0. The default is 0.

wwpanda.Series, optional

External overwrite portfolio weights. If it not set to None these weights will overwrite the calibration results. The default is None.

nsh_roundBoolean, optional

If it is True the invested numbers of shares are round to the nearest integer and the residual cash capital (positive or negative) is carried to the next reinvestment cycle. A value of False assumes investments with fractional number of shares (no rounding). The default is True.

verboseBoolean, optional

Is it set to True the function prints the closing prices date. The default is True.

Returns:
`pandas.DataFrame`the rolling information.
Columns:
  • ‘old_nsh’ :

    initial number of shares per portfolio component and the additional cash. These are input values.

  • ‘new_nsh’ :

    the new number of shares per component plus the residual cash (due to the rounding to an integer number of shares). A negative entry means that the investor needs to add more cash to cover for the roundup shortfall. It has a small value.

  • ‘diff_nsh’ :

    number of shares (buy/sale) needed to rebalance the portfolio.

  • ‘weights’ :

    portfolio weights used for rebalancing. The cash entry is the new portfolio value (invested capital).

  • ‘prices’ :

    the share prices used for rebalance evaluations.

Note: Since the prices are closing prices, the rebalance can be computed after the market close and before the trading execution (next day). Additional cash slippage may occur due to share price differential between the previous day closing and execution time.

getRisk(ww, rrate=None)

Returns the value of the dispersion (risk) measure for a give portfolio.

Parameters:
wwlist, numpy.array or pandas.Series

Portfolio weights. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >=0 with sum > 0. If it is a list or a numpy.array, then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series, then the index should be compatible with the rrate.columns or mktdata symbols (not necessarily in the same order).

rratepandas.DataFrame, optional

Contains the portfolio components historical rates of return. If it is not None, it will overwrite the rates of return computed in the constructor from mktdata. The default is None.

Returns:
`float`The dispersion (risk) measure value.
getRiskComp()

Returns the risk of each portfolio component.

Returns:
`pandas.Series`risk per symbol.
getWeights(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None, mktdata=None, **params)

Computes the optimal portfolio weights.

Parameters:
rtypestr, optional

Optimization type. If is not None it will overwrite the value set by the constructor. The default is None. Other possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

mktdatapandas.DataFrame, optional

The portfolio components historical, prices or rates of return, see ‘pclose’ definition below. If it is not None, it will overwrite the set of historical rates of return computed in the constructor from ‘mktdata’. The default is None.

**paramsother optional parameters

Most common:

verboseBoolean, optional

If it set to True, then it will print a message when the optimal portfolio degenerates to a single asset. The default is False.

pcloseBoolean, optional

If it is absent then the mktdata is considered to contain rates of return, with columns the asset symbols and indexed by the observation dates,

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function.

Returns:
`pandas.Series`portfolio weights per symbol.
set_method(method)

Sets computation method.

Parameters:
methodstr;

Must be a valid method name. It will overwrite the value set by the constructor.

Returns:
None
set_mktdata(mktdata, colname=None, freq=None, hlength=None, pclose=False)

Sets historical market data. It will overwrite the choice made in the constructor.

Parameters:
mktdatapandas.DataFrame

Historic daily market data for portfolio components in the format returned by azapy.mktData function.

colnamestr, optional

Name of the price column from mktdata used in the weight’s calibration. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

freqstr, optional

Rate of return horizon. It could be ‘Q’ for a quarter or ‘M’ for a month. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

hlengthfloat, optional

History length in number of years used for calibration. A fractional number will be rounded to an integer number of months. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

pcloseBoolean, optional

True : assumes mktdata contains closing prices only, with columns the asset symbols and indexed by the observation dates,

False : assumes mktdata is in the usual format returned by azapy.mktData function. Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

Returns:
None
set_random_seed(seed=42)

Sets the seed for Dirichlet random generator used in viewFrontiers to select the random inefficient portfolios.

Parameters:
seedint, optional

The random generator seed, in case you want to set it to a weird value other than 42 :). The default is 42.

Returns:
None
set_rrate(rrate)

Sets portfolio components historical rates of return. It will overwrite the value computed by the constructor from mktdata.

Parameters:
rratepandas.DataFrame

Portfolio components historical rates of return. The columns are asset symbols and indexed by observation dates.

Returns:
None
set_rtype(rtype=None, mu=None, d=1, mu0=0.0, aversion=None, ww0=None)

Sets the optimization type. It will overwrite the value set in the constructor.

Parameters:
rtypestr, optional

Optimization type. Possible values:

‘Risk’ : optimal risk portfolio for targeted expected rate of return.

‘Sharpe’ : optimal Sharpe portfolio - maximization solution.

‘Sharpe2’ : optimal Sharpe portfolio - minimization solution.

‘MinRisk’ : minimum risk portfolio.

‘RiskAverse’ : optimal risk portfolio for a fixed risk-aversion factor.

‘InvNrisk’ : optimal risk portfolio with the same risk value as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘Diverse’ : optimal diversified portfolio for targeted expected rate of return (max of inverse 1-Diverse).

‘Diverse2’ : optimal diversified portfolio for targeted expected rate of return (min of 1-Diverse).

‘MaxDiverse’ : maximum diversified portfolio.

‘InvNdiverse’ : optimal diversified portfolio with the same diversification factor as a benchmark portfolio (e.g., same as equal weighted portfolio).

‘InvNdrr’ : optimal diversified portfolio with the same expected rate of return as a benchmark portfolio (e.g., same as equal weighted portfolio).

Unless it is None, it will overwrite the value defined in the constructor. The default is ‘None’.

mufloat, optional

Targeted portfolio expected rate of return. Relevant only if rtype=’Risk’ or rtype=’Divers’. The default is None.

dint, optional

Frontier type. Active only if rtype=’Risk’. A value of 1 will trigger the evaluation of optimal portfolio along the efficient frontier. Otherwise, it will find the portfolio with the lowest rate of return along the inefficient portfolio frontier. The default is 1.

mu0float, optional

Risk-free rate accessible to the investor. Relevant only if rtype=’Sharpe’ or rtype=’Sharpe2’. The default is 0.

aversionfloat, optional

The value of the risk-aversion coefficient. Must be positive. Relevant only if rtype=’RiskAverse’. The default is None.

ww0list, numpy.array or pandas.Series, optional

Targeted portfolio weights. Relevant only if rtype=’InvNrisk’. Its length must be equal to the number of symbols in rrate (mktdata). All weights must be >= 0 with sum > 0. If it is a list or a numpy.array then the weights are assumed to be in order of rrate.columns. If it is a pandas.Series then the index should be compatible with the rrate.columns or mktdata symbols (same symbols, not necessarily in the same order). If it is None then it will be set to equal weights. The default is None.

Returns:
None
viewFrontiers(minrisk=True, efficient=20, inefficient=20, sharpe=True, musharpe=0.0, maxdiverse=False, diverse_efficient=0, diverse_inefficient=0, invN=True, invNrisk=True, invNdiverse=False, invNdrr=False, component=True, randomport=20, addport=None, fig_type='RR_risk', **opt)

Computes the elements of the portfolio frontiers.

Parameters:
minriskBoolean, optional

If it is True then the minimum risk portfolio will be visible. The default is True.

efficientint, optional

Number of points along the efficient risk frontier (equally spaced along the rate of return axis). The default is 20.

inefficientint, optional

Number of points along the inefficient risk frontier (equally spaced along the rate of returns axis). The default is 20.

sharpeBoolean, optional

If it is True then the maximum Sharpe portfolio will be visible. The default is True.

musharpefloat, optional

Risk-free rate value used in the evaluation of generalized Sharpe ratio. The default is 0.

maxdiverseBoolean, optional

If it is True then the maximum diversified portfolio will be visible. The default is True.

diverse_efficientint, optional

Number of points along the efficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

diverse_inefficientint, optional

Number of points along the inefficient diversification frontier (equally spaced along the rate of return axis). The default is 20.

invNBoolean, optional

If it is True, then the equal weighted portfolio and the optimal portfolio with the same risk value are added to the plot. The default is True.

invNriskBoolean, optional

If it is True, then the efficient risk portfolio with same risk as equal weighted portfolio is added to the plot. The default is False.

invNdiverseBoolean, optional

If it is True, then the efficient diversified portfolio with the same diversification factor as the equal weighted portfolio is added to the plot. The default is False.

invNdrrBoolean, optional

If it is True, then the efficient diversified portfolio with the same expected rate of return as the equal weighted portfolio is added to the plot. The default value is False.

componentBoolean, optional

If it is True, then the single component portfolios are added to the plot. The default is True.

randomportint, optional

Number of portfolios with random weights (inefficient) to be added to the plot (for reference). The default is 20.

addportdict or pandas.DataFrame, optional

The weights of additional portfolio to be added to the plot. If it is a dict then the keys are the labels, and the values are list of weights in the order of rrate.columns. If it is a pandas.DataFrame the index are the labels, and each row is a set of weights. The columns names should match the symbols names. The default is None.

fig_typestr, optional

Graphical representation format.

  • ‘RR_risk’ : expected rate of return vs risk

  • ‘Sharpe_RR’ : sharpe vs expected rate of return

  • ‘Diverse_RR’ : diversification vs expected rate of return

The default is ‘RR_risk’.

**optoptional

Additional parameters:

  • ‘title’str

    The default is ‘Portfolio frontiers’.

  • ‘xlabel’str

    The default is

    • ‘risk’ if fig_type=’RR_risk’,

    • ‘rate of returns’ otherwise.

  • ‘ylabel’str

    The default is

    • ‘rate of returns’ if fig_type=’RR_risk’

    • ‘sharpe’ if fig_type=’Sharpe_RR’

    • ‘diversification’ if fig_type=diverse_RR

  • ‘tangent’Boolean

    If set to True, then the tangent (to max sharpe point) is added. It has effect only if fig_type=’RR_risk’. The default is True.

  • savetostr

    File name to save the figure. The extension dictates the format: png, pdf, svg, etc. For more details see the mathplotlib documentation for savefig. The default is None.

  • datadefaultdict

    Numerical data to construct the plot. If it is not None, then it will take precedence and no other numerical evaluations will be performed. It is meant to produce different plot representations without reevaluations. The default is None.

  • invN_labelstr

    The label for equal weighted portfolio. The default is ‘1/N’.

  • invNrisk_labelstr

    The lable for efficient portfolio with same risk as equal weighted portfolio. The default is invNrisk.

  • invNdiverse_labelstr

    The label for diverse-efficient portfolio with the same diversificeation factor as equal weighted porfolio. The default is ‘invNdiv’.

  • invNdrr_labelstr

    The label of diverse-efficient portfolio with the same expected rate of return as equal weighted portolio. The defualt is ‘invNdrr’.

  • maxdiverse_labelstr

    The label of maximum diverified portfolio. The default is ‘MaxD’.

  • minrisk_label‘str’

    The label of minimum risk portfolio. The default is ‘MinR’.

  • sharpe_labelstr

    The label of maximum Sharpe portfolio. The default is ‘Sharpe’.

Returns:
`dict`Numerical data used to make the plots. It can be passed back
to reconstruct the plots without reevaluations.

Module contents