No Risk
PortfolioOptimisers.NoRisk Type
struct NoRisk{__T_settings} <: RiskMeasureRisk 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
NoRisk(; settings::RiskMeasureSettings = RiskMeasureSettings()) -> NoRiskKeywords 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
, 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
sourcePortfolioOptimisers.norisk_flag Function
norisk_flag(r) -> BoolReturn true when r is a NoRisk, or a collection holding one.
Related
sourcePortfolioOptimisers.assert_risk_measure_required Function
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
sourcePortfolioOptimisers.assert_no_risk_objective_compatibility Function
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