6 changed files with 81 additions and 1 deletions
@ -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 @@ |
|||||||
|
|
||||||
|
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 @@ |
|||||||
|
|
||||||
|
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 @@ |
|||||||
|
|
||||||
|
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