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