netflypsb commited on
Commit
e0caec9
·
verified ·
1 Parent(s): cbd6be0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -51
app.py CHANGED
@@ -1,63 +1,70 @@
1
  import streamlit as st
2
  import yfinance as yf
3
  import pandas as pd
4
- import matplotlib.pyplot as plt
5
- from matplotlib import dates as mdates
6
- import plotly.graph_objects as go
7
 
8
- # Initialize the Streamlit app
9
- st.title('Momentum Reversal Trading Strategy Analysis')
 
10
 
11
- # User input for asset ticker, start date, and end date
12
- ticker = st.text_input('Enter the ticker symbol of the asset:', 'AAPL')
13
- start_date = st.date_input('Start Date')
14
- end_date = st.date_input('End Date')
15
- analyze_button = st.button('Analyze')
 
 
 
 
 
 
 
 
16
 
17
- if analyze_button:
18
- # Fetch historical data from Yahoo Finance
19
- data = yf.download(ticker, start=start_date, end=end_date)
 
20
 
21
- # Calculate RSI
22
- delta = data['Adj Close'].diff()
23
- gain = (delta.where(delta > 0, 0)).fillna(0)
24
- loss = (-delta.where(delta < 0, 0)).fillna(0)
25
- avg_gain = gain.rolling(window=14, min_periods=14).mean()
26
- avg_loss = loss.rolling(window=14, min_periods=14).mean()
27
- rs = avg_gain / avg_loss
28
- rsi = 100 - (100 / (1 + rs))
29
-
30
- # Calculate MACD
31
- exp1 = data['Adj Close'].ewm(span=12, adjust=False).mean()
32
- exp2 = data['Adj Close'].ewm(span=26, adjust=False).mean()
33
- macd = exp1 - exp2
34
- signal = macd.ewm(span=9, adjust=False).mean()
35
-
36
- # Identify buy and sell signals
37
- buy_signals = (macd > signal) & (macd.shift(1) <= signal.shift(1))
38
- sell_signals = (macd < signal) & (macd.shift(1) >= signal.shift(1))
39
- data['Buy Signal'] = buy_signals
40
- data['Sell Signal'] = sell_signals
41
-
42
- # Plotting
43
  fig = go.Figure()
 
 
44
  fig.add_trace(go.Candlestick(x=data.index,
45
  open=data['Open'],
46
  high=data['High'],
47
  low=data['Low'],
48
- close=data['Close'], name='Market data'))
49
- fig.add_trace(go.Scatter(x=data.index, y=rsi, name='RSI'))
50
- fig.add_trace(go.Scatter(x=data.index, y=macd, name='MACD', line=dict(color='blue')))
51
- fig.add_trace(go.Scatter(x=data.index, y=signal, name='Signal Line', line=dict(color='orange')))
52
- fig.update_layout(title='Trading Signals', xaxis_title='Date', yaxis_title='Price')
53
- st.plotly_chart(fig)
54
-
55
- # Display Buy and Sell Signals in a table
56
- signals = pd.DataFrame(index=data.index)
57
- signals['Price'] = data['Adj Close']
58
- signals['Buy'] = data['Buy Signal']
59
- signals['Sell'] = data['Sell Signal']
60
- signals_filtered = signals[(signals['Buy'] | signals['Sell'])]
61
- st.table(signals_filtered)
62
-
63
- # Streamlit app will run when this script is called
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
  import yfinance as yf
3
  import pandas as pd
4
+ import plotly.graph_objs as go
 
 
5
 
6
+ def fetch_data(ticker, start_date, end_date):
7
+ data = yf.download(ticker, start=start_date, end=end_date)
8
+ return data
9
 
10
+ def calculate_indicators(data):
11
+ # Exponential Moving Averages for trend
12
+ data['EMA50'] = data['Close'].ewm(span=50, adjust=False).mean()
13
+ data['EMA200'] = data['Close'].ewm(span=200, adjust=False).mean()
14
+
15
+ # Relative Strength Index for momentum
16
+ delta = data['Close'].diff()
17
+ gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
18
+ loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
19
+ rs = gain / loss
20
+ data['RSI'] = 100 - (100 / (1 + rs))
21
+
22
+ return data
23
 
24
+ def identify_signals(data):
25
+ data['Buy Signal'] = (data['EMA50'] > data['EMA200']) & (data['RSI'] < 30)
26
+ data['Sell Signal'] = (data['EMA50'] < data['EMA200']) & (data['RSI'] > 70)
27
+ return data
28
 
29
+ def plot_data(data):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  fig = go.Figure()
31
+
32
+ # Adding price trace
33
  fig.add_trace(go.Candlestick(x=data.index,
34
  open=data['Open'],
35
  high=data['High'],
36
  low=data['Low'],
37
+ close=data['Close'], name='Candlestick'))
38
+
39
+ # Adding EMAs
40
+ fig.add_trace(go.Scatter(x=data.index, y=data['EMA50'], name='EMA 50', line=dict(color='blue', width=1.5)))
41
+ fig.add_trace(go.Scatter(x=data.index, y=data['EMA200'], name='EMA 200', line=dict(color='red', width=1.5)))
42
+
43
+ # Adding Buy and Sell signals
44
+ buys = data[data['Buy Signal']]
45
+ sells = data[data['Sell Signal']]
46
+ fig.add_trace(go.Scatter(x=buys.index, y=buys['Close'], mode='markers', name='Buy Signal', marker=dict(symbol='triangle-up', size=12, color='green')))
47
+ fig.add_trace(go.Scatter(x=sells.index, y=sells['Close'], mode='markers', name='Sell Signal', marker=dict(symbol='triangle-down', size=12, color='red')))
48
+
49
+ # Layout updates
50
+ fig.update_layout(title='Momentum Reversal Trading Strategy Visualization', xaxis_title='Date', yaxis_title='Price', template='plotly_dark')
51
+ fig.update_xaxes(rangeslider_visible=True)
52
+
53
+ return fig
54
+
55
+ def main():
56
+ st.title("Momentum Reversal Trading Strategy Visualization")
57
+ ticker = st.text_input("Enter the ticker symbol, e.g., 'AAPL'")
58
+ start_date = st.date_input("Select the start date")
59
+ end_date = st.date_input("Select the end date")
60
+
61
+ if st.button("Analyze"):
62
+ data = fetch_data(ticker, start_date, end_date)
63
+ data = calculate_indicators(data)
64
+ data = identify_signals(data)
65
+ fig = plot_data(data)
66
+ st.plotly_chart(fig, use_container_width=True)
67
+
68
+ if __name__ == "__main__":
69
+ main()
70
+