Project

rbma

0.0
No commit activity in last 3 years
No release in over 3 years
(SimpleMA) Moving average over last n day, (EMA) Exponential moving average, (IEMA) Exponential moving average on irregularly timed events series, N days EMA, Cumulative EMA
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 4.2.0
 Project Readme

RBMA

List of included function

  • SimpleMA(n:) - Moving Average over the last n day/data.
  • EMA(a:) - Exponential Moving Average with "a" as the alpha parameter.
  • IEMA(g:) - Exponential Moving Average over an irregular timed events serie with "a" as the alpha parameter.
  • NDayEMA(n:) - Exponential Moving Average over n day/data as defined in wikipedia. Equivalent to using EMA(a) with a = 2/(n+1).
  • CMA - Cumulative Moving Average.

Usage

Every function is provided as a class, it can either recursively compute the moving average as new value are given or be initialized to continue from a certain point provided you give the necessary information. Let see: ##Exponential Moving Average (EMA) ###Recursive every time you compute the ema with a new event value, you get it. I included only the first and last one here.

e = Ema.new(a: 0.3)
e.compute(current: 11) # => 11
e.compute(current: 13) # => ...
e.compute(current: 15) # => ...
e.compute(current: 9) # => ...
e.compute(current: 8) # => ...
e.compute(current: 8) # => ...
e.compute(current: 7) # => ...
e.compute(current: 9) # => ...
e.compute(current: 10) # => 9.257...

###Non recursive

e = Ema.new(a: 0.3)
e.compute(current: 11) # => ...
e.compute(current: 13) # => ...
e.compute(current: 15) # => ...
e.compute(current: 9) # => ...
e.compute(current: 8) # => ...
e.compute(current: 8) # => ...
e.compute(current: 7) # => ...
# let say the process breaks here, and you need to continue from here
d = e.compute(current: 9)
e = Ema.new(a: 0.3)
e.compute(current: 10, previous: d) # => 9.257

##Irregular timed events serie Exponential Moving Average (IEMA) ###Recursive

i = IEma.new(g: 60)
i.compute(t: 0, current: 17) # => ...
i.compute(t: 1, current: 15) # => ...
i.compute(t: 3, current: 12) # => ...
i.compute(t: 5, current: 11) # => ...
i.compute(t: 9, current: 13) # => ...

###Non Recursive

i = IEma.new(g: 60)
i.compute(t: 0, current: 17) # => ...
i.compute(t: 1, current: 15) # => ...
prev = i.compute(t: 3, current: 12)
j = IEma.new(g: 60)
j.compute(t: 5, current: 11, tprev: 3, prev: prev) # => 16.61...

##SimpleMA ###Recursive

s = SimpleMa.new(n: 5, empty: "-")
s.compute(current: 2) # => "-"
s.compute(current: 3) # => "-"
s.compute(current: 5) # => "-"
s.compute(current: 3) # => "-"
s.compute(current: 3) # => 3.2
...

###Non recursive Non recursive for SimpleMA is not very interesting

lasts = [2,3,5,3]
s = SimpleMa.new(n: 5, empty: "-")
assert s.compute(current: 3, lasts: lasts ) == 3.2

##Cumulative moving average ###Recursive

c = Cma.new()
c.compute(current: 1) # => ...
c.compute(current: 2) # => ...
c.compute(current: 21) # => ...
c.compute(current: 10) # => ...
c.compute(current: 31) # => ...
c.compute(current: 28) # => ...
c.compute(current: 5) # => ...
c.compute(current: 2) # => 12.5
...

###Non recursive Non recursive for SimpleMA is not very interesting

c = Cma.new()
c.compute(current: 1) # => ...
c.compute(current: 2) # => ...
c.compute(current: 21) # => ...
c.compute(current: 10) # => ...
c.compute(current: 31) # => ...
c.compute(current: 28) # => ...
d = c.compute(current: 5)
c = Cma.new()
c.compute(current: 2, last: d, count: 7) # => 12.5

##NDayEMA N days EMA is just an alias of EMA, you can specify the alpha in days/unit of time, instead

days = 6
n = NDayEma.new(n: days)
n.a == 2.0/(days+1) # => true