6 changed files with 81 additions and 1 deletions
@ -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 |
||||
|
||||
|
||||
@ -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)] |
||||
@ -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)) |
||||
|
||||
@ -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…
Reference in new issue