Spaces:
Running
Running
import streamlit as st | |
import yfinance as yf | |
import pandas as pd | |
import plotly.graph_objects as go | |
import numpy as np | |
st.sidebar.title('Bali Scalping Strategy Analyzer') | |
ticker = st.sidebar.text_input('Enter ticker symbol', 'AAPL') | |
start_date = st.sidebar.date_input('Start date', pd.to_datetime('2020-01-01')) | |
end_date = st.sidebar.date_input('End date', pd.to_datetime('2020-12-31')) | |
time_frame = st.sidebar.selectbox('Select time frame', ['60m', '1d']) | |
analyze_button = st.sidebar.button('Analyze') | |
st.title('Bali Scalping Strategy Visualization') | |
st.markdown(""" | |
This app visualizes the 'Bali' scalping strategy with buy and sell signals. | |
Enter the stock ticker, select the date range and time frame, and click 'Analyze'. | |
""") | |
def fetch_data(ticker, start_date, end_date, interval): | |
data = yf.download(ticker, start=start_date, end=end_date, interval=interval) | |
return data | |
def calculate_lwma(data, period=48): | |
weights = np.arange(1, period + 1) | |
return data.rolling(window=period).apply(lambda prices: np.dot(prices, weights) / weights.sum(), raw=True) | |
def calculate_trend_envelopes(data, period=2): | |
ma = data.rolling(window=period).mean() | |
deviation = data.rolling(window=period).std() | |
upper_band = ma + (0.02 * deviation) | |
lower_band = ma - (0.02 * deviation) | |
return upper_band, lower_band | |
def calculate_dss(data, period=10): | |
stoch = ((data - data.rolling(window=period).min()) / | |
(data.rolling(window=period).max() - data.rolling(window=period).min())) * 100 | |
dss = stoch.rolling(window=period).mean() | |
return dss | |
if analyze_button: | |
data = fetch_data(ticker, start_date, end_date, time_frame) | |
data['LWMA'] = calculate_lwma(data['Close']) | |
upper_band, lower_band = calculate_trend_envelopes(data['Close']) | |
data['DSS'] = calculate_dss(data['Close']) | |
data['Buy'] = ((data['Close'] > data['LWMA']) & (data['Close'] > upper_band.shift()) & (data['DSS'] > 80)) | |
data['Sell'] = ((data['Close'] < data['LWMA']) & (data['Close'] < lower_band.shift()) & (data['DSS'] < 20)) | |
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")) | |
fig.add_trace(go.Scatter(x=data.index, y=data['LWMA'], | |
line=dict(color='red', width=1.5), name='LWMA')) | |
fig.add_trace(go.Scatter(x=data.index, y=upper_band, | |
line=dict(color='blue', width=0.7), name='Upper Band')) | |
fig.add_trace(go.Scatter(x=data.index, y=lower_band, | |
line=dict(color='orange', width=0.7), name='Lower Band')) | |
buy_signals = data[data['Buy']] | |
sell_signals = data[data['Sell']] | |
fig.add_trace(go.Scatter(x=buy_signals.index, y=buy_signals['Close'], | |
mode='markers', marker_symbol='triangle-up', | |
marker_line_color="green", marker_color="green", | |
marker_line_width=2, marker_size=10, name='Buy Signal')) | |
fig.add_trace(go.Scatter(x=sell_signals.index, y=sell_signals['Close'], | |
mode='markers', marker_symbol='triangle-down', | |
marker_line_color="red", marker_color="red", | |
marker_line_width=2, marker_size=10, name='Sell Signal')) | |
fig.update_layout(title='Bali Scalping Strategy Visualization', | |
xaxis_title='Date', | |
yaxis_title='Price', | |
xaxis_rangeslider_visible=False) | |
st.plotly_chart(fig, use_container_width=True) | |