OnlineStatsBase.jl icon indicating copy to clipboard operation
OnlineStatsBase.jl copied to clipboard

Prod - Track the overall prod.

Open femtotrader opened this issue 10 months ago • 0 comments

Hello,

quite similar to Sum... Prod could track the overall product.

I haven't find such a statistics.

Implementing it could be interesting.

Kind regards

PS: here is an implementation idea inspired by Sum implementation

"""
    Prod(T::Type = Float64)

Track the overall prod.
"""
mutable struct Prod{T} <: OnlineStat{Number}
    prod::T
    n::Int
end
Prod(T::Type = Float64) = Prod(one(T), 0)
Base.prod(o::Prod) = o.prod
OnlineStatsBase._fit!(o::Prod{T}, x::Real) where {T<:AbstractFloat} = (o.prod *= convert(T, x); o.n += 1)
OnlineStatsBase._fit!(o::Prod{T}, x::Real) where {T<:Integer} =       (o.prod *= round(T, x); o.n += 1)
OnlineStatsBase._fit!(o::Prod{T}, x::Real, n) where {T<:AbstractFloat} = (o.prod *= convert(T, x * n); o.n += n)
OnlineStatsBase._fit!(o::Prod{T}, x::Real, n) where {T<:Integer} =       (o.prod *= round(T, x * n); o.n += n)
OnlineStatsBase._merge!(o::T, o2::T) where {T <: Prod} = (o.prod *= o2.prod; o.n += o2.n; o)

PS2: here is my use cases https://github.com/femtotrader/OnlinePortfolioAnalytics.jl/blob/9ab6010cfb604c1484cd338609c47b643a001750/src/mean_return.jl#L40 https://github.com/femtotrader/OnlinePortfolioAnalytics.jl/blob/9ab6010cfb604c1484cd338609c47b643a001750/src/drawdowns.jl#L14 https://github.com/femtotrader/OnlinePortfolioAnalytics.jl/blob/9ab6010cfb604c1484cd338609c47b643a001750/src/cumulative_return.jl#L12

femtotrader avatar Apr 23 '24 15:04 femtotrader