Weight Bounds Constraints
PortfolioOptimisers.WeightBounds Type
struct WeightBounds{T1, T2} <: AbstractConstraintResult
lb::T1
ub::T2
endContainer for lower and upper portfolio weight bounds.
WeightBounds stores the lower (lb) and upper (ub) bounds for portfolio weights, which can be scalars, vectors, or nothing. This type is used to represent weight constraints in portfolio optimisation problems, supporting both global and asset-specific bounds.
Fields
lb: Lower bound(s) for portfolio weights.ub: Upper bound(s) for portfolio weights.
Constructor
WeightBounds(lb::Option{<:Num_VecNum},
ub::Option{<:Num_VecNum})Validation
all(lb .<= ub).
Details
If
lborubisnothing, it indicates no bound in that direction.Supports scalar bounds (same for all assets) or vector bounds (asset-specific).
Examples
julia> WeightBounds(0.0, 1.0)
WeightBounds
lb ┼ Float64: 0.0
ub ┴ Float64: 1.0
julia> WeightBounds([0.0, 0.1], [0.8, 1.0])
WeightBounds
lb ┼ Vector{Float64}: [0.0, 0.1]
ub ┴ Vector{Float64}: [0.8, 1.0]Related
sourcePortfolioOptimisers.UniformlyDistributedBounds Type
struct UniformlyDistributedBounds <: CustomWeightBoundsAlgorithm endCustom weight bounds constraint for uniformly distributing asset weights, 1/N for lower bounds and 1 for upper bounds, where N is the number of assets.
Examples
julia> sets = AssetSets(; dict = Dict("nx" => ["A", "B", "C"]));
julia> PortfolioOptimisers.estimator_to_val(UniformlyDistributedBounds(), sets)
0.3333333333333333Related
sourcePortfolioOptimisers.WeightBoundsEstimator Type
struct WeightBoundsEstimator{T1, T2, T3, T4} <: AbstractConstraintEstimator
lb::T1
ub::T2
dlb::T3
dub::T4
endEstimator for portfolio weight bounds constraints.
WeightBoundsEstimator constructs lower (lb) and upper (ub) bounds for portfolio weights, supporting scalars, vectors, dictionaries, pairs, or custom constraint types. This estimator enables flexible specification of global, asset-specific, or algorithmic bounds for use in portfolio optimisation workflows.
Fields
lb: Lower bound(s) for portfolio weights.ub: Upper bound(s) for portfolio weights.dlb: Default lower bound applied when no specific bound is provided.dub: Default upper bound applied when no specific bound is provided.
Constructor
WeightBoundsEstimator(;
lb::Option{<:EstValType_CustWb} = nothing,
ub::Option{<:EstValType_CustWb} = nothing)Validation
- If
lborubis aAbstractDictorAbstractVector, it must be non-empty.
Details
If
lborubisnothing, it indicates no bound in that direction.If
lborubis notnothing, unspecified assets will usedlbordubrespectively. If these are alsonothing, defaults to0.0fordlband1.0fordub.
Examples
julia> WeightBoundsEstimator(; lb = Dict("A" => 0.1, "B" => 0.2),
ub = Dict("A" => 0.8, "B" => 0.9))
WeightBoundsEstimator
lb ┼ Dict{String, Float64}: Dict("B" => 0.2, "A" => 0.1)
ub ┼ Dict{String, Float64}: Dict("B" => 0.9, "A" => 0.8)
dlb ┼ nothing
dub ┴ nothing
julia> WeightBoundsEstimator(; lb = UniformlyDistributedBounds(), ub = nothing)
WeightBoundsEstimator
lb ┼ UniformlyDistributedBounds()
ub ┼ nothing
dlb ┼ nothing
dub ┴ nothingRelated
sourcePortfolioOptimisers.weight_bounds_constraints Function
weight_bounds_constraints(wb::WeightBoundsEstimator, sets::AssetSets; strict::Bool = false,
datatype::DataType = Float64, kwargs...)Generate portfolio weight bounds constraints from a WeightBoundsEstimator and asset set.
weight_bounds_constraints constructs a WeightBounds object representing lower and upper portfolio weight bounds for the assets in sets, using the specifications in wb. Supports scalar, vector, dictionary, pair, or custom constraint types for flexible bound assignment.
Arguments
wb:WeightBoundsEstimatorspecifying lower and upper bounds.sets:AssetSetscontaining asset names or indices.strict: Iftrue, enforces strict matching between assets and bounds (throws error on mismatch); iffalse, issues a warning.datatype: Output data type for bounds.kwargs...: Additional keyword arguments passed to bound extraction routines.
Returns
wb::WeightBounds: Object containing lower and upper bounds aligned withsets.
Details
Lower and upper bounds are extracted using
estimator_to_val, mapped to assets insets.Supports composable and asset-specific constraints.
If a bound is
nothing, indicates no constraint in that direction.
Examples
julia> sets = AssetSets(; dict = Dict("nx" => ["A", "B", "C"]));
julia> wb = WeightBoundsEstimator(; lb = Dict("A" => 0.1, "B" => 0.2), ub = 1.0);
julia> weight_bounds_constraints(wb, sets)
WeightBounds
lb ┼ Vector{Float64}: [0.1, 0.2, 0.0]
ub ┴ Float64: 1.0Related
sourceweight_bounds_constraints(wb::WeightBounds{<:Any, <:Any}, args...; N::Integer = 0, kwargs...)Propagate or expand portfolio weight bounds constraints from a WeightBounds object.
weight_bounds_constraints returns the input WeightBounds object unchanged if scalar is true or N is zero. Otherwise, it expands scalar or nothing bounds to vectors or ranges of length N using weight_bounds_constraints_side, ensuring per-asset constraints are properly propagated.
Arguments
wb:WeightBoundsobject containing lower and upper bounds.args...: Additional positional arguments (ignored).scalar: Iftrue, treat bounds as scalar and return unchanged.N: Number of assets (length for expansion; if zero, treat as scalar).kwargs...: Additional keyword arguments (ignored).
Returns
wb::WeightBounds: Expanded or unchanged bounds object.
Details
If
scalaristrueorN == 0, returnswbunchanged.Otherwise, expands
lbandubusingweight_bounds_constraints_sideto vectors of lengthN.
Examples
julia> weight_bounds_constraints(WeightBounds(0.0, 1.0); N = 3)
WeightBounds
lb ┼ StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}: StepRangeLen(0.0, 0.0, 3)
ub ┴ StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}: StepRangeLen(1.0, 0.0, 3)
julia> weight_bounds_constraints(WeightBounds([0.1, 0.2, 0.3], 1.0); N = 3)
WeightBounds
lb ┼ Vector{Float64}: [0.1, 0.2, 0.3]
ub ┴ StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}: StepRangeLen(1.0, 0.0, 3)Related
sourceweight_bounds_constraints(wb::WeightBounds{<:VecNum, <:VecNum}, args...;
kwargs...)Propagate asset-specific portfolio weight bounds constraints from a WeightBounds object with vector bounds.
weight_bounds_constraints returns the input WeightBounds object unchanged when both lower and upper bounds are provided as vectors. This method is used to propagate explicit per-asset bounds in constraint generation workflows, ensuring that asset-specific constraints are preserved.
Arguments
wb:WeightBoundsobject with vector lower and upper bounds.args...: Additional positional arguments (ignored).kwargs...: Additional keyword arguments (ignored).
Returns
wb::WeightBounds: The input bounds object, unchanged.
Examples
julia> weight_bounds_constraints(WeightBounds([0.1, 0.2, 0.3], [0.8, 0.9, 1.0]))
WeightBounds
lb ┼ Vector{Float64}: [0.1, 0.2, 0.3]
ub ┴ Vector{Float64}: [0.8, 0.9, 1.0]Related
sourceweight_bounds_constraints(wb::Nothing, args...; N::Integer = 0, kwargs...)Generate unconstrained portfolio weight bounds when no bounds are specified.
weight_bounds_constraints returns a WeightBounds object with lower bounds set to -Inf and upper bounds set to Inf for all assets when wb is nothing.
Arguments
wb::Nothing: Indicates no constraint for portfolio weights.args...: Additional positional arguments (ignored).N::Integer: Number of assets (length for expansion; if zero, treat as scalar).kwargs...: Additional keyword arguments (ignored).
Returns
wb::WeightBounds: Object with unconstrained lower and upper bounds.
Details
If
scalaristrueorN == 0, returnsWeightBounds(-Inf, Inf).Otherwise, returns
WeightBounds(fill(-Inf, N), fill(Inf, N)).
Examples
julia> weight_bounds_constraints(nothing; N = 3)
WeightBounds
lb ┼ Vector{Float64}: [-Inf, -Inf, -Inf]
ub ┴ Vector{Float64}: [Inf, Inf, Inf]Related
sourcePortfolioOptimisers.CustomWeightBoundsAlgorithm Type
abstract type CustomWeightBoundsAlgorithm <: AbstractConstraintAlgorithm endAbstract supertype for custom portfolio weight bounds constraints.
CustomWeightBoundsAlgorithm provides an interface for implementing user-defined or algorithmic portfolio weight bounds. Subtypes can encode advanced or non-standard weight constraints, such as scaled, grouped, or dynamically computed bounds, for use in portfolio optimisation workflows.
Related
sourcePortfolioOptimisers.weight_bounds_constraints_side Function
weight_bounds_constraints_side(::Nothing, N::Integer, val::Number)Generate a vector of portfolio weight bounds when no constraint is specified.
weight_bounds_constraints_side returns a vector of length N filled with the value val when the input bound is nothing. This is used to represent unconstrained portfolio weights (e.g., -Inf for lower bounds, Inf for upper bounds) in constraint generation routines.
Arguments
::Nothing: Indicates no constraint for this bound direction.N: Number of assets (length of the output vector).val: Value to fill (typically-InforInf).
Returns
wb::VecNum: Vector of lengthNfilled withval.
Examples
julia> PortfolioOptimisers.weight_bounds_constraints_side(nothing, 3, -Inf)
3-element Vector{Float64}:
-Inf
-Inf
-InfRelated
sourceweight_bounds_constraints_side(wb::Number, N::Integer, val::Number)Generate a vector of portfolio weight bounds from a scalar bound.
weight_bounds_constraints_side returns a vector of length N filled with val if wb is infinite, or a vector of length N with all elements equal to wb otherwise. This is used to propagate scalar portfolio weight bounds to all assets in constraint generation routines.
Arguments
wb::Number: Scalar bound for portfolio weights (can be finite or infinite).N::Integer: Number of assets (length of the output vector).val::Number: Value to fill ifwbis infinite (typically-InforInf).
Returns
wb::VecNum: Vector of lengthNfilled withwborval.
Examples
julia> PortfolioOptimisers.weight_bounds_constraints_side(0.1, 3, -Inf)
StepRangeLen(0.1, 0.0, 3)
julia> PortfolioOptimisers.weight_bounds_constraints_side(Inf, 3, -Inf)
3-element Vector{Float64}:
-Inf
-Inf
-InfRelated
sourceweight_bounds_constraints_side(wb::VecNum, args...)Propagate asset-specific portfolio weight bounds from a vector.
weight_bounds_constraints_side returns the input vector wb unchanged when asset-specific bounds are provided as a vector. This method is used to propagate explicit per-asset bounds in constraint generation routines.
Arguments
wb: Vector of bounds for portfolio weights (one per asset).args...: Additional positional arguments (ignored).
Returns
wb::AbstractVector: The input vector, unchanged.
Examples
julia> PortfolioOptimisers.weight_bounds_constraints_side([0.1, 0.2, 0.3])
3-element Vector{Float64}:
0.1
0.2
0.3Related
sourcePortfolioOptimisers.EstValType_CustWb Type
const EstValType_CustWb = Union{<:EstValType, <:CustomWeightBoundsAlgorithm}Union type for custom weight bounds estimator values.
EstValType_CustWb is a union type that allows either standard estimator values (EstValType) or custom weight bounds algorithms (CustomWeightBoundsAlgorithm) to be used for specifying portfolio weight bounds. This enables flexible assignment of bounds, supporting both conventional numeric types and advanced, user-defined constraint algorithms in portfolio optimisation workflows.
Related Types
source