Browse Source

Basic indicators: rsi and ema

master
Denis Tereshkin 8 years ago
parent
commit
109ee36338
  1. 2
      examples/multiple_assets.py
  2. 0
      src/naiback/indicators/__init__.py
  3. 21
      src/naiback/indicators/ema.py
  4. 20
      src/naiback/indicators/rsi.py
  5. 25
      tests/test_ema.py
  6. 14
      tests/test_rsi.py

2
examples/multiple_assets.py

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
from naiback.strategy import Strategy
from naiback.data.feeds import FinamCSVFeed
from naiback.data.feeds import GenericCSVFeed
from naiback.indicators import SMA, RSI
class MyStrategy(Strategy):

0
src/naiback/indicators/__init__.py

21
src/naiback/indicators/ema.py

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
def _update(v, d, alpha):
return v * (1 - alpha) + d * alpha
def EMA(data, period, alpha=None):
if alpha is None:
alpha = 2. / (period + 1)
result = []
v = None
for d in data:
if d is None:
result.append(None)
elif v is None:
result.append(None)
v = d
else:
v = _update(v, d, alpha)
result.append(v)
return result

20
src/naiback/indicators/rsi.py

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
from naiback.indicators.ema import EMA
def _calc_rsi(g, l):
if g is None or l is None:
return None
if l == 0:
return 100
return 100 - 100 / (1 + g / l)
def RSI(data, period):
diffs = [0]
prevd = data[0]
for d in data[1:]:
diffs.append(d - prevd)
prevd = d
gains = EMA([max(x, 0) for x in diffs], period, 1. / period)
losses = EMA([-min(x, 0) for x in diffs], period, 1. / period)
return [_calc_rsi(g, l) for (g, l) in zip(gains, losses)]

25
tests/test_ema.py

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
import pytest
import datetime
from naiback.indicators.ema import EMA
def test_ema_1():
data = [1, 1, 1]
ema = EMA(data, 1)
assert(ema == [None, 1, 1])
def test_ema_2():
data = [1, 3, 5]
ema = EMA(data, 3)
assert(ema == [None, 2, 3.5])
def test_ema_3():
data = [252.12, 253.97, 253.73, 255.06, 255.14, 256.71, 256.15, 258.51, 255.24, 252.63]
ema = EMA(data, 3)
assert(abs(ema[-1] - 254.43) < 0.01)
assert(len(ema) == len(data))

14
tests/test_rsi.py

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
import pytest
import datetime
from naiback.indicators.rsi import RSI
def test_rsi_1():
data = [252.12, 253.97, 253.73, 255.06, 255.14, 256.71, 256.15, 258.51, 255.24, 252.63, 253.82, 254.16, 253.99, 254.47,
255.93, 255, 253.21, 251.03]
rsi = RSI(data, 3)
assert(abs(rsi[-1] - 14.7) < 0.1)
assert(len(rsi) == len(data))
Loading…
Cancel
Save