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