Skip to content
18

No Risk

PortfolioOptimisers.NoRisk Type
julia
struct NoRisk{__T_settings} <: RiskMeasure

Risk measure that contributes no risk.

NoRisk measures nothing: its functor returns zero and its optimisation formulation adds a zero risk expression. It exists so that a risk-taking optimiser can express a problem that genuinely has no risk term, without a vestigial one changing the model class.

Fields

  • settings: Risk measure settings.

Constructors

julia
NoRisk(; settings::RiskMeasureSettings = RiskMeasureSettings()) -> NoRisk

Keywords correspond to the struct's fields.

Details

MeanRisk requires a risk measure, so an objective that ignores risk — MaximumReturn — would otherwise still build the default Variance term. That term is discarded by the objective, but it drags second-order cone constraints into the model, forcing a conic solver on a problem that is a linear program. NoRisk keeps such problems linear.

Two families need this:

  • The robust best-characteristic portfolios of [2] — the 1/N, quintile and inverse-volatility portfolios — which are linear programs (see CharacteristicUncertaintySet).

  • The global maximum return portfolio (GMRP), maximize μᵀw subject to w ≥ 0, 1ᵀw = 1.

Notes

NoRisk is only coherent under an objective that does not consult risk. MeanRisk rejects it with MinimumRisk (whose objective would be identically zero, so any feasible portfolio would be optimal) and with MaximumRatio (whose risk-normalisation constraint would become vacuous, leaving the model unbounded). Use it with MaximumReturn, or with MaximumUtility where the risk-aversion term drops out.

Setting settings.ub is legal but pointless: the bound applies to a quantity that is always zero.

Related

source
PortfolioOptimisers.norisk_flag Function
julia
norisk_flag(r) -> Bool

Return true when r is a NoRisk, or a collection holding one.

Related

source
PortfolioOptimisers.assert_risk_measure_required Function
julia
assert_risk_measure_required(r, T::Symbol)

Assert that r is a real risk measure, for optimisers whose formulation is built around one.

NoRisk is only coherent in MeanRisk, under an objective that never consults the risk expression. Every other risk-taking optimiser is its risk measure — a risk budget with nothing to budget, a risk contribution that is always zero, a clustering optimiser dividing by a zero risk — so they reject it rather than return a degenerate answer.

T names the calling optimiser, for the error message. TimeDependent schedules are skipped here and reached instead through assert_time_dependent_substitution.

Related

source
PortfolioOptimisers.assert_no_risk_objective_compatibility Function
julia
assert_no_risk_objective_compatibility(r, obj)

Assert that a NoRisk measure is paired with an objective that ignores risk.

Rejects NoRisk under MinimumRisk — whose objective would be identically zero, so the solver could return any feasible portfolio, silently — and under MaximumRatio, whose risk-normalisation constraint would go vacuous and leave the model unbounded.

Called from MeanRisk's constructor. TimeDependent schedules are skipped here and reached instead through assert_time_dependent_substitution, which re-runs the constructor on each scheduled entry.

Related

source