-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIndicators.py
More file actions
135 lines (108 loc) · 4.79 KB
/
Copy pathIndicators.py
File metadata and controls
135 lines (108 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import numpy as np
from ta.momentum import RSIIndicator
from ta.volume import VolumeWeightedAveragePrice
from ta.trend import CCIIndicator, MACD
from ta.volatility import AverageTrueRange, BollingerBands
class Indicator:
BB = 'bb'
MACD = 'macd'
STD = 'std'
RSI = 'rsi'
VWAP = 'vwap'
ATR = 'atr'
def __init__(self, name, signals):
self.name = name
self.signals = signals
def num_signals(self):
return len(self.signals)
def calculate(self, data):
raise Exception('Unimplemented')
def get_signal_names(self):
return [x for x in self.signals]
class IndicatorSimple(Indicator):
def __init__(self, name, period):
self.signal_name = f'%s_%d' % (name, period)
super().__init__(name, {self.signal_name: period})
class IndicatorMultiSignal(Indicator):
def __init__(self, name, signals):
self.name = name
self.signals = signals
class IndicatorStandardDeviation(IndicatorSimple):
def __init__(self, period):
super().__init__(Indicator.STD, period)
def calculate(self, data, data_column_0='close'):
return [
{'name': self.signal_name, 'value': data[data_column_0].rolling(self.signals[self.signal_name]).apply(lambda x: np.std(x))}
]
class IndicatorRelativeStrengthIndex(IndicatorSimple):
def __init__(self, period):
super().__init__(Indicator.RSI, period)
def calculate(self, data, data_column_0='close'):
return [
{'name': self.signal_name, 'value': RSIIndicator(data[data_column_0], window=self.signals[self.signal_name]).rsi()}
]
class IndicatorVolumeWeightedAveragePrice(IndicatorSimple):
def __init__(self, period):
super().__init__(Indicator.VWAP, period)
def calculate(self, data, data_column_0='high', data_column_1='low', data_column_2='close', data_column_3='volume'):
indicator = VolumeWeightedAveragePrice(
high=data[data_column_0],
low=data[data_column_1],
close=data[data_column_2],
volume=data[data_column_3],
window=self.signals[self.signal_name])
return [
{'name': self.signal_name, 'value': indicator.volume_weighted_average_price()}
]
class IndicatorAverageTrueRange(IndicatorSimple):
def __init__(self, period):
super().__init__(IndicatorSimple.ATR, period)
def calculate(self, data, data_column_0='high', data_column_1='low', data_column_2='close'):
indicator = AverageTrueRange(
high = data[data_column_0],
low = data[data_column_1],
close = data[data_column_2],
window=self.signals[self.signal_name])
return [
{'name': self.signal_name, 'value': indicator.average_true_range()}
]
class IndicatorBollingerBands(IndicatorMultiSignal):
HIGH_BAND = 'hband'
LOW_BAND = 'lband'
def __init__(self, period):
self.upper_signal_name = f'%s_%s_%d' % (Indicator.BB, IndicatorBollingerBands.HIGH_BAND, period)
self.lower_signal_name = f'%s_%s_%d' % (Indicator.BB, IndicatorBollingerBands.LOW_BAND, period)
super().__init__(Indicator.BB, {
self.upper_signal_name: period,
self.lower_signal_name: period
})
def calculate(self, data, data_column_0='close'):
period = self.signals[self.upper_signal_name]
bb = BollingerBands(data[data_column_0], period)
return [
{'name': self.upper_signal_name, 'value': bb.bollinger_hband_indicator()},
{'name': self.lower_signal_name, 'value': bb.bollinger_lband_indicator()}
]
class IndicatorMovingAverageConvergenceDivergence(IndicatorMultiSignal):
PERIOD_LONG = 'period_long'
PERIOD_SHORT = 'period_short'
PERIOD_SIGNAL = 'period_signal'
def __init__(self, period_long, period_short, period_signal):
self.signal_name = f'%s_%d_%d_%d' % (Indicator.MACD, period_long, period_short, period_signal)
super().__init__(Indicator.MACD, {
IndicatorMovingAverageConvergenceDivergence.PERIOD_LONG: period_long,
IndicatorMovingAverageConvergenceDivergence.PERIOD_SHORT: period_short,
IndicatorMovingAverageConvergenceDivergence.PERIOD_SIGNAL: period_signal
})
def get_signal_names(self):
return [self.signal_name]
def calculate(self, data, data_column_0='close'):
macd = MACD(
data[data_column_0],
self.signals[IndicatorMovingAverageConvergenceDivergence.PERIOD_LONG],
self.signals[IndicatorMovingAverageConvergenceDivergence.PERIOD_SHORT],
self.signals[IndicatorMovingAverageConvergenceDivergence.PERIOD_SIGNAL]
).macd()
return [
{'name': self.signal_name, 'value': macd}
]