1
+ import numpy as np
2
+
3
+ def rsi (Data , rsi_lookback , what1 , what2 ):
4
+
5
+ # From exponential to smoothed
6
+ rsi_lookback = (rsi_lookback * 2 ) - 1
7
+
8
+ # Get the difference in price from previous step
9
+ delta = []
10
+
11
+ for i in range (len (Data )):
12
+ try :
13
+ diff = Data [i , what1 ] - Data [i - 1 , what1 ]
14
+ delta = np .append (delta , diff )
15
+ except IndexError :
16
+ pass
17
+
18
+ delta = np .insert (delta , 0 , 0 , axis = 0 )
19
+ delta = delta [1 :]
20
+
21
+ # Make the positive gains (up) and negative gains (down) Series
22
+ up , down = delta .copy (), delta .copy ()
23
+ up [up < 0 ] = 0
24
+ down [down > 0 ] = 0
25
+
26
+ up = np .array (up )
27
+ down = np .array (down )
28
+
29
+ roll_up = up
30
+ roll_down = down
31
+
32
+ roll_up = np .reshape (roll_up , (- 1 , 1 ))
33
+ roll_down = np .reshape (roll_down , (- 1 , 1 ))
34
+
35
+ roll_up = adder (roll_up , 3 )
36
+ roll_down = adder (roll_down , 3 )
37
+
38
+ roll_up = ema (roll_up , 2 , rsi_lookback , what2 , 1 )
39
+ roll_down = ema (abs (roll_down ), 2 , rsi_lookback , what2 , 1 )
40
+
41
+ roll_up = roll_up [rsi_lookback :, 1 :2 ]
42
+ roll_down = roll_down [rsi_lookback :, 1 :2 ]
43
+ Data = Data [rsi_lookback + 1 :,]
44
+
45
+ # Calculate the RS & RSI
46
+ RS = roll_up / roll_down
47
+ RSI = (100.0 - (100.0 / (1.0 + RS )))
48
+ RSI = np .array (RSI )
49
+ RSI = np .reshape (RSI , (- 1 , 1 ))
50
+ RSI = RSI [1 :,]
51
+
52
+ Data = np .concatenate ((Data , RSI ), axis = 1 )
53
+ return Data
54
+
55
+ def ma (Data , lookback , what , where ):
56
+
57
+ for i in range (len (Data )):
58
+ try :
59
+ Data [i , where ] = (Data [i - lookback + 1 :i + 1 , what ].mean ())
60
+ except IndexError :
61
+ pass
62
+
63
+ return Data
64
+
65
+ def ema (Data , alpha , lookback , what , where ):
66
+
67
+ # alpha is the smoothing factor
68
+ # window is the lookback period
69
+ # what is the column that needs to have its average calculated
70
+ # where is where to put the exponential moving average
71
+
72
+ alpha = alpha / (lookback + 1.0 )
73
+ beta = 1 - alpha
74
+
75
+ # First value is a simple SMA
76
+ Data = ma (Data , lookback , what , where )
77
+
78
+ # Calculating first EMA
79
+ Data [lookback + 1 , where ] = (Data [lookback + 1 , what ] * alpha ) + (Data [lookback , where ] * beta )
80
+ # Calculating the rest of EMA
81
+ for i in range (lookback + 2 , len (Data )):
82
+ try :
83
+ Data [i , where ] = (Data [i , what ] * alpha ) + (Data [i - 1 , where ] * beta )
84
+
85
+ except IndexError :
86
+ pass
87
+ return Data
88
+
89
+ # The function to add a certain number of columns
90
+ def adder (Data , times ):
91
+
92
+ for i in range (1 , times + 1 ):
93
+
94
+ z = np .zeros ((len (Data ), 1 ), dtype = float )
95
+ Data = np .append (Data , z , axis = 1 )
96
+ return Data
97
+ # The function to deleter a certain number of columns
98
+ def deleter (Data , index , times ):
99
+
100
+ for i in range (1 , times + 1 ):
101
+
102
+ Data = np .delete (Data , index , axis = 1 )
103
+ return Data
104
+ # The function to delete a certain number of rows from the beginning
105
+ def jump (Data , jump ):
106
+
107
+ Data = Data [jump :, ]
108
+
109
+ return Data
110
+
111
+
112
+ def stochastic (Data , lookback , what , high , low , where ):
113
+
114
+ for i in range (len (Data )):
115
+
116
+ try :
117
+ Data [i , where ] = (Data [i , what ] - min (Data [i - lookback + 1 :i + 1 , low ])) / (max (Data [i - lookback + 1 :i + 1 , high ]) - min (Data [i - lookback + 1 :i + 1 , low ]))
118
+
119
+ except ValueError :
120
+ pass
121
+
122
+ Data [:, where ] = Data [:, where ] * 100
123
+ return Data
124
+
125
+ # The Data variable refers to the OHLC array
126
+ # The lookback variable refers to the period (5, 14, 21, etc.)
127
+ # The what variable refers to the closing price
128
+ # The high variable refers to the high price
129
+ # The low variable refers to the low price
130
+ # The where variable refers to where to put the Oscillator
131
+ def stoch_rsi (Data , lookback , where ):
132
+
133
+ # Calculating RSI of the Closing prices
134
+ Data = rsi (Data , lookback , 3 , 0 )
135
+
136
+ # Adding two columns
137
+ Data = adder (Data , 2 )
138
+
139
+ for i in range (len (Data )):
140
+
141
+ try :
142
+ Data [i , where + 1 ] = (Data [i , where ] - min (Data [i - lookback + 1 :i + 1 , where ])) / (max (Data [i - lookback + 1 :i + 1 , where ]) - min (Data [i - lookback + 1 :i + 1 , where ]))
143
+
144
+ except ValueError :
145
+ pass
146
+
147
+ Data [:, where + 1 ] = Data [:, where + 1 ] * 100
148
+
149
+ # Signal Line using a 3-period moving average
150
+ Data = ma (Data , 3 , where + 1 , where + 2 )
151
+
152
+ Data = deleter (Data , where , 2 )
153
+ Data = jump (Data , lookback )
154
+
155
+ return Data
0 commit comments