import streamlit as st import yfinance as yf import pandas as pd import plotly.graph_objects as go from datetime import datetime def vsa_advanced_analysis(data): signals = [] for i in range(3, len(data)): if data['Close'][i] > data['Close'][i-1] and data['Volume'][i] > data['Volume'][i-1] and data['Close'][i-1] > data['Close'][i-2]: signals.append((data.index[i], 'Buy', data['Close'][i])) elif data['Close'][i] < data['Close'][i-1] and data['Volume'][i] > data['Volume'][i-1] and data['Close'][i-1] < data['Close'][i-2]: signals.append((data.index[i], 'Sell', data['Close'][i])) # Example of adding more advanced patterns if data['Volume'][i] > data['Volume'][i-1] * 1.5 and data['Close'][i] < data['Open'][i]: signals.append((data.index[i], 'Selling Climax', data['Close'][i])) return signals def plot_signals_advanced(data, signals): fig = go.Figure() fig.add_trace(go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], name='Candlestick')) for signal in signals: if signal[1] == 'Buy': fig.add_trace(go.Scatter(x=[signal[0]], y=[signal[2]], mode='markers', marker=dict(color='green', size=10), name='Buy Signal')) elif signal[1] == 'Sell': fig.add_trace(go.Scatter(x=[signal[0]], y=[signal[2]], mode='markers', marker=dict(color='red', size=10), name='Sell Signal')) elif signal[1] == 'Selling Climax': fig.add_trace(go.Scatter(x=[signal[0]], y=[signal[2]], mode='markers', marker=dict(color='orange', size=10), name='Selling Climax')) fig.update_layout(title='Stock Price with Buy and Sell Signals', xaxis_title='Date', yaxis_title='Price') st.plotly_chart(fig) def main(): st.title('Advanced VSA Stock Analyzer') st.write('Input a stock ticker symbol to analyze and generate buy and sell signals using advanced Volume Spread Analysis (VSA).') ticker = st.text_input('Stock Ticker Symbol', 'AAPL') start_date = st.date_input('Start Date', datetime(2020, 1, 1)) end_date = st.date_input('End Date', datetime.now()) if st.button('Analyze'): data = yf.download(ticker, start=start_date, end=end_date) if data.empty: st.write('No data found for the selected stock ticker and date range.') else: signals = vsa_advanced_analysis(data) st.write(f'Found {len(signals)} signals.') if signals: plot_signals_advanced(data, signals) signals_df = pd.DataFrame(signals, columns=['Date', 'Signal', 'Price']) st.write('Buy and Sell Signals:') st.dataframe(signals_df) else: st.write('No buy or sell signals found for the selected stock ticker and date range.') if __name__ == '__main__': main()