| 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])) |
| |
| 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() |
|
|