Skip to content
11

Detone

Financial data is often responds to broad market conditions. This market-wide behaviour can obscure specific correlation signals. By removing the largest n eigenvalues, the idiosyncratic relationships between assets are allowed to shine through [1].

Detoned matrices may be non-positive definite, so they can be unsuitable for traditional optimisations, but they can be quite effective for clustering ones.

PortfolioOptimisers.AbstractDetoneEstimator Type
julia
abstract type AbstractDetoneEstimator <: AbstractEstimator end

Abstract supertype for all detoning estimators in PortfolioOptimisers.jl.

All concrete and/or abstract types representing detoning estimators should be subtypes of AbstractDetoneEstimator.

Interfaces

In order to implement a new detoning estimator which will work seamlessly with the library, subtype AbstractDetoneEstimator with all necessary parameters as part of the struct, and implement the following methods:

  • detone!(dt::AbstractDetoneEstimator, X::MatNum): In-place detoning.

  • detone(dt::AbstractDetoneEstimator, X::MatNum): Optional out-of-place detoning.

Arguments

  • dt: Optional matrix detoning estimator.

  • X: Covariance-like or correlation-like matrix.

Returns

  • X::MatNum: The detoned input matrix X.

Examples

We can create a dummy detoning estimator as follows:

julia
julia> struct MyDetoneEstimator <: PortfolioOptimisers.AbstractDetoneEstimator end

julia> function PortfolioOptimisers.detone!(dt::MyDetoneEstimator, X::PortfolioOptimisers.MatNum)
           # Implement your in-place detoning estimator here.
           println("Detoning matrix in-place...")
           return X
       end

julia> function PortfolioOptimisers.detone(dt::MyDetoneEstimator, X::PortfolioOptimisers.MatNum)
           X = copy(X)
           println("Copy X...")
           detone!(dt, X)
           return X
       end

julia> detone!(MyDetoneEstimator(), [1.0 2.0; 2.0 1.0])
Detoning matrix in-place...
2×2 Matrix{Float64}:
 1.0  2.0
 2.0  1.0

julia> detone(MyDetoneEstimator(), [1.0 2.0; 2.0 1.0])
Copy X...
Detoning matrix in-place...
2×2 Matrix{Float64}:
 1.0  2.0
 2.0  1.0

Related

source
PortfolioOptimisers.Detone Type
julia
struct Detone{T1, T2} <: AbstractDetoneEstimator
    n::T1
    pdm::T2
end

A concrete detoning estimator for removing the largest n principal components (market modes) from a covariance or correlation matrix in detone! and detone.

For financial data, the leading principal components often represent market-wide movements that can obscure asset-specific signals. The Detone estimator allows users to specify the number of these leading components to remove, thereby enhancing the focus on idiosyncratic relationships between market members [1].

Detoned matrices may not be suitable for non-clustering optimisations because it can make the matrix non-positive definite. However, they can be quite effective for clustering optimsations.

Fields

  • n: Number of leading principal components to remove.

  • pdm: Optional positive definite matrix estimator.

Constructor

julia
Detone(; n::Integer = 1, pdm::Option{<:Posdef} = Posdef())

Keyword arguments correspond to the fields above.

Validation

  • n > 0.

Examples

julia
julia> Detone(; n = 2)
Detone
    n ┼ Int64: 2
  pdm ┼ Posdef
      │      alg ┼ UnionAll: NearestCorrelationMatrix.Newton
      │   kwargs ┴ @NamedTuple{}: NamedTuple()

Related

References

  • [1] M. M. De Prado. Machine learning for asset managers (Cambridge University Press, 2020). Chapter 2.
source
PortfolioOptimisers.detone! Function
julia
detone!(dt::Detone, X::MatNum)
detone!(::Nothing, X::MatNum)

In-place removal of the top n principal components (market modes) from a covariance or correlation matrix.

For matrices without unit diagonal, the function converts them into correlation matrices i.e. matrices with unit diagonal, applies the algorithm, and rescales them back.

Arguments

  • dt: Optional matrix detoning estimator.

    • ::Detone: The top n principal components are removed from X in-place.

    • ::Nothing: No-op and returns nothing.

  • X: Covariance-like or correlation-like matrix.

Returns

  • X::MatNum: The input matrix X is modified in-place.

Validation

  • 0 < dt.n <= size(X, 2).

Examples

julia
julia> using StableRNGs

julia> rng = StableRNG(123456789);

julia> X = rand(rng, 10, 5);

julia> X = X' * X
5×5 Matrix{Float64}:
 3.29494  2.0765   1.73334  2.01524  1.77493
 2.0765   2.46967  1.39953  1.97242  2.07886
 1.73334  1.39953  1.90712  1.17071  1.30459
 2.01524  1.97242  1.17071  2.24818  1.87091
 1.77493  2.07886  1.30459  1.87091  2.44414

julia> detone!(Detone(), X)
5×5 Matrix{Float64}:
  3.29494    -1.14673     0.0868439  -0.502106   -1.71581
 -1.14673     2.46967    -0.876289   -0.0864304   0.274663
  0.0868439  -0.876289    1.90712    -1.18851    -0.750345
 -0.502106   -0.0864304  -1.18851     2.24818    -0.0774753
 -1.71581     0.274663   -0.750345   -0.0774753   2.44414

Related

References

  • [1] M. M. De Prado. Machine learning for asset managers (Cambridge University Press, 2020). Chapter 2.
source
PortfolioOptimisers.detone Function
julia
detone(dt::Detone, X::MatNum)
detone(::Nothing, X::MatNum)

Out-of-place version of detone!.

Related

References

  • [1] M. M. De Prado. Machine learning for asset managers (Cambridge University Press, 2020). Chapter 2.
source