Skip to content

Commit 86301ad

Browse files
committed
Add factory functions for propagating previous weights
1 parent 7efe462 commit 86301ad

21 files changed

+129
-15
lines changed

src/20_Optimisation/01_Base_Optimisation.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ const VecOptE = AbstractVector{<:AbstractOptimisationEstimator}
33
abstract type BaseOptimisationEstimator <: AbstractOptimisationEstimator end
44
abstract type OptimisationEstimator <: AbstractOptimisationEstimator end
55
abstract type NonFiniteAllocationOptimisationEstimator <: OptimisationEstimator end
6+
function factory(opt::NonFiniteAllocationOptimisationEstimator, ::Any)
7+
return opt
8+
end
69
abstract type OptimisationAlgorithm <: AbstractAlgorithm end
710
abstract type OptimisationResult <: AbstractResult end
811
abstract type NonFiniteAllocationOptimisationResult <: OptimisationResult end
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
abstract type CrossValidationEstimator <: AbstractEstimator end
22
abstract type CrossValidationResult <: AbstractResult end
33
abstract type CrossValidationAlgorithm <: AbstractAlgorithm end
4+
5+
abstract type SequentialCrossValidationEstimator <: CrossValidationEstimator end
6+
abstract type NonSequentialCrossValidationEstimator <: CrossValidationEstimator end

src/20_Optimisation/02_CrossValidation/02_KFold.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
struct KFold{T1} <: CrossValidationEstimator
1+
struct KFold{T1} <: NonSequentialCrossValidationEstimator
22
n::T1
33
function KFold(n::Integer)
44
assert_nonempty_gt0_finite_val(n, :n)

src/20_Optimisation/02_CrossValidation/04_WalkForward.jl renamed to src/20_Optimisation/02_CrossValidation/03_WalkForward.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
abstract type WalkForwardEstimator <: CrossValidationEstimator end
1+
abstract type WalkForwardEstimator <: SequentialCrossValidationEstimator end
22
struct IndexWalkForward{T1, T2, T3, T4, T5} <: WalkForwardEstimator
33
train_size::T1
44
test_size::T2

src/20_Optimisation/02_CrossValidation/03_Validation.jl renamed to src/20_Optimisation/02_CrossValidation/04_Validation.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
function cross_val_predict(est::OptimisationEstimator, rd::ReturnsResult,
2-
cv::CrossValidationEstimator = KFold(); cols = nothing)
2+
cv::CrossValidationEstimator = KFold(); cols = nothing,
3+
ex::FLoops.Transducers.Executor = FLoops.ThreadedEx())
34
if !isnothing(cols)
45
rd = returns_result_view(rd, cols)
56
end

src/20_Optimisation/03_NaiveOptimisation.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ struct NaiveOptimisationResult{T1, T2, T3, T4, T5, T6} <:
1414
w::T3
1515
fb::T6
1616
end
17-
function factory(res::NaiveOptimisationResult, fb)
17+
function factory(res::NaiveOptimisationResult, fb::Option{<:OptE_Opt})
1818
return NaiveOptimisationResult(res.oe, res.pr, res.wb, res.retcode, res.w, fb)
1919
end
2020
struct InverseVolatility{T1, T2, T3, T4, T5, T6} <: NaiveOptimisationEstimator
@@ -40,6 +40,10 @@ function InverseVolatility(; pr::PrE_Pr = EmpiricalPrior(),
4040
strict::Bool = false, fb::Option{<:OptE_Opt} = nothing)
4141
return InverseVolatility(pr, wb, sets, wf, strict, fb)
4242
end
43+
function factory(opt::InverseVolatility, w::AbstractVector)
44+
return InverseVolatility(; pr = opt.pr, wb = opt.wb, sets = opt.sets, wf = opt.wf,
45+
strict = opt.strict, fb = factory(opt.fb, w))
46+
end
4347
function opt_view(opt::InverseVolatility, i, args...)
4448
pr = prior_view(opt.pr, i)
4549
wb = weight_bounds_view(opt.wb, i)
@@ -93,6 +97,10 @@ function EqualWeighted(; wb::Option{<:WbE_Wb} = WeightBounds(),
9397
strict::Bool = false, fb::Option{<:OptE_Opt} = nothing)
9498
return EqualWeighted(wb, sets, wf, strict, fb)
9599
end
100+
function factory(opt::EqualWeighted, w::AbstractVector)
101+
return EqualWeighted(; wb = opt.wb, sets = opt.sets, wf = opt.wf, strict = opt.strict,
102+
fb = factory(opt.fb, w))
103+
end
96104
function opt_view(opt::EqualWeighted, i, args...)
97105
wb = weight_bounds_view(opt.wb, i)
98106
sets = nothing_asset_sets_view(opt.sets, i)
@@ -139,6 +147,10 @@ function RandomWeighted(; rng::Random.AbstractRNG = Random.default_rng(),
139147
strict::Bool = false, fb::Option{<:OptE_Opt} = nothing)
140148
return RandomWeighted(rng, seed, wb, sets, wf, strict, fb)
141149
end
150+
function factory(opt::RandomWeighted, w::AbstractVector)
151+
return RandomWeighted(; rng = opt.rng, seed = opt.seed, wb = opt.wb, sets = opt.sets,
152+
wf = opt.wf, strict = opt.strict, fb = factory(opt.fb, w))
153+
end
142154
function opt_view(opt::RandomWeighted, i, args...)
143155
wb = weight_bounds_view(opt.wb, i)
144156
sets = nothing_asset_sets_view(opt.sets, i)

src/20_Optimisation/04_Base_ClusteringOptimisation.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct HierarchicalResult{T1, T2, T3, T4, T5, T6, T7, T8} <:
1111
w::T7
1212
fb::T8
1313
end
14-
function factory(res::HierarchicalResult, fb)
14+
function factory(res::HierarchicalResult, fb::Option{<:OptE_Opt})
1515
return HierarchicalResult(res.oe, res.pr, res.clr, res.wb, res.fees, res.retcode, res.w,
1616
fb)
1717
end
@@ -47,6 +47,11 @@ function HierarchicalOptimiser(; pr::PrE_Pr = EmpiricalPrior(),
4747
strict::Bool = false)
4848
return HierarchicalOptimiser(pr, clr, slv, wb, fees, sets, wf, strict)
4949
end
50+
function factory(opt::HierarchicalOptimiser, w::AbstractVector)
51+
return HierarchicalOptimiser(; pr = opt.pr, clr = opt.clr, slv = opt.slv, wb = opt.wb,
52+
fees = factory(opt.fees, w), sets = opt.sets, wf = opt.wf,
53+
strict = opt.strict)
54+
end
5055
function opt_view(hco::HierarchicalOptimiser, i)
5156
pr = prior_view(hco.pr, i)
5257
wb = weight_bounds_view(hco.wb, i)

src/20_Optimisation/05_HierarchicalRiskParity.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ function HierarchicalRiskParity(; opt::HierarchicalOptimiser = HierarchicalOptim
1717
fb::Option{<:OptE_Opt} = nothing)
1818
return HierarchicalRiskParity(opt, r, sca, fb)
1919
end
20+
function factory(hrp::HierarchicalRiskParity, w::AbstractVector)
21+
opt = factory(hrp.opt, w)
22+
r = factory(hrp.r, w)
23+
fb = factory(hrp.fb, w)
24+
return HierarchicalRiskParity(; opt = opt, r = r, sca = hrp.sca, fb = fb)
25+
end
2026
function opt_view(hrp::HierarchicalRiskParity, i, X::MatNum)
2127
X = isa(hrp.opt.pr, AbstractPriorResult) ? hrp.opt.pr.X : X
2228
r = risk_measure_view(hrp.r, i, X)

src/20_Optimisation/06_SchurComplementHierarchicalRiskParity.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ function SchurComplementHierarchicalRiskParity(;
8080
fb::Option{<:OptE_Opt} = nothing)
8181
return SchurComplementHierarchicalRiskParity(opt, params, fb)
8282
end
83+
function factory(sh::SchurComplementHierarchicalRiskParity, w::AbstractVector)
84+
opt = factory(sh.opt, w)
85+
fb = factory(sh.fb, w)
86+
return SchurComplementHierarchicalRiskParity(; opt = opt, params = sh.params, fb = fb)
87+
end
8388
function opt_view(sh::SchurComplementHierarchicalRiskParity, i, X::MatNum)
8489
X = isa(sh.opt.pr, AbstractPriorResult) ? sh.opt.pr.X : X
8590
opt = opt_view(sh.opt, i)

src/20_Optimisation/07_HierarchicalEqualRiskContribution.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ function HierarchicalEqualRiskContribution(;
3232
fb::Option{<:OptE_Opt} = nothing)
3333
return HierarchicalEqualRiskContribution(opt, ri, ro, scai, scao, ex, fb)
3434
end
35+
function factory(hec::HierarchicalEqualRiskContribution, w::AbstractVector)
36+
opt = factory(hec.opt, w)
37+
ri = factory(hec.ri, w)
38+
ro = factory(hec.ro, w)
39+
fb = factory(hec.fb, w)
40+
return HierarchicalEqualRiskContribution(; opt = opt, ri = ri, ro = ro, scai = hec.scai,
41+
scao = hec.scao, ex = hec.ex, fb = fb)
42+
end
3543
function opt_view(hec::HierarchicalEqualRiskContribution, i, X::MatNum)
3644
X = isa(hec.opt.pr, AbstractPriorResult) ? hec.opt.pr.X : X
3745
ri = hec.ri

0 commit comments

Comments
 (0)