Spaces:
Sleeping
Sleeping
Falcao Zane Vijay
commited on
Commit
Β·
7508b69
1
Parent(s):
9537a59
deploy #10
Browse files- src/streamlit_app.py +28 -0
src/streamlit_app.py
CHANGED
@@ -18,6 +18,8 @@ from indicators.macd import macd
|
|
18 |
|
19 |
from strategy.rule_based_strategy import generate_signals_sma, generate_signals_ema
|
20 |
from utils.backtester import backtest_signals
|
|
|
|
|
21 |
|
22 |
from indicators.enhanced_features import (
|
23 |
create_volatility_features, create_enhanced_lag_features,
|
@@ -34,6 +36,12 @@ st.set_page_config(
|
|
34 |
layout="wide"
|
35 |
)
|
36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
# Stock symbols
|
38 |
STOCK_SYMBOLS = [
|
39 |
'ADANIENT.NS', 'ADANIPORTS.NS', 'APOLLOHOSP.NS', 'ASIANPAINT.NS',
|
@@ -72,13 +80,16 @@ FEATURES = [
|
|
72 |
@st.cache_data
|
73 |
def load_stock_data(symbol, start_date, end_date):
|
74 |
"""Load stock data from Yahoo Finance"""
|
|
|
75 |
try:
|
76 |
data = yf.download(symbol, start=start_date, end=end_date, session=session)
|
77 |
# Flatten the MultiIndex columns
|
78 |
if data.columns.nlevels > 1:
|
79 |
data.columns = [col[0] for col in data.columns]
|
|
|
80 |
return data
|
81 |
except Exception as e:
|
|
|
82 |
st.error(f"Error loading data: {e}")
|
83 |
return None
|
84 |
|
@@ -133,11 +144,15 @@ selected_stock = st.sidebar.selectbox("Select Stock Symbol", STOCK_SYMBOLS, inde
|
|
133 |
start_date = st.sidebar.date_input("Start Date", value=datetime(2023, 1, 1))
|
134 |
end_date = st.sidebar.date_input("End Date", value=datetime.now())
|
135 |
|
|
|
|
|
136 |
st.sidebar.subheader("π Technical Indicators")
|
137 |
rsi_period = st.sidebar.slider("RSI Period", min_value=5, max_value=30, value=14, step=1)
|
138 |
short_period = st.sidebar.slider("Short-term Period", min_value=5, max_value=50, value=20, step=1)
|
139 |
long_period = st.sidebar.slider("Long-term Period", min_value=50, max_value=200, value=50, step=1)
|
140 |
|
|
|
|
|
141 |
# Strategy selection (for trading dashboard)
|
142 |
strategy_type = st.sidebar.selectbox("Strategy Type", ["SMA-based", "EMA-based", "Both"])
|
143 |
|
@@ -148,6 +163,9 @@ stop_loss = st.sidebar.slider("Stop Loss (%)", 0.0, 20.0, 5.0, step=1.0) / 100
|
|
148 |
take_profit = st.sidebar.slider("Take Profit (%)", 0.0, 50.0, 15.0, step=5.0) / 100
|
149 |
use_risk_mgmt = st.sidebar.checkbox("Enable Risk Management", value=True)
|
150 |
|
|
|
|
|
|
|
151 |
# ========================= PRICE PREDICTION TAB =========================
|
152 |
|
153 |
with tab1:
|
@@ -188,10 +206,14 @@ with tab1:
|
|
188 |
# Create feature vector
|
189 |
feature_vector = latest_data[FEATURES].values.reshape(1, -1)
|
190 |
feature_vector_scaled = scaler.transform(feature_vector)
|
|
|
|
|
191 |
|
192 |
# Make prediction
|
193 |
prediction = model.predict(feature_vector_scaled)[0]
|
194 |
probability = model.predict_proba(feature_vector_scaled)[0].max()
|
|
|
|
|
195 |
|
196 |
|
197 |
# Display prediction
|
@@ -325,10 +347,12 @@ with tab2:
|
|
325 |
|
326 |
with tab_sma:
|
327 |
st.subheader("π SMA Strategy Results")
|
|
|
328 |
sma_results, sma_metrics = backtest_signals(
|
329 |
df, signal_col='SMA_Signal', price_col='Close',
|
330 |
initial_cash=initial_cash, transaction_cost=transaction_cost if use_risk_mgmt else 0
|
331 |
)
|
|
|
332 |
|
333 |
# Set variables for common sections
|
334 |
results = sma_results
|
@@ -389,10 +413,12 @@ with tab2:
|
|
389 |
|
390 |
with tab_ema:
|
391 |
st.subheader("π EMA Strategy Results")
|
|
|
392 |
ema_results, ema_metrics = backtest_signals(
|
393 |
df, signal_col='EMA_Signal', price_col='Close',
|
394 |
initial_cash=initial_cash, transaction_cost=transaction_cost if use_risk_mgmt else 0
|
395 |
)
|
|
|
396 |
|
397 |
# Set variables for common sections
|
398 |
results = ema_results
|
@@ -456,10 +482,12 @@ with tab2:
|
|
456 |
signal_col = 'SMA_Signal' if strategy_type == "SMA-based" else 'EMA_Signal'
|
457 |
strategy_name = strategy_type.split('-')[0]
|
458 |
|
|
|
459 |
results, metrics = backtest_signals(
|
460 |
df, signal_col=signal_col, price_col='Close',
|
461 |
initial_cash=initial_cash, transaction_cost=transaction_cost if use_risk_mgmt else 0
|
462 |
)
|
|
|
463 |
|
464 |
# Display metrics
|
465 |
col1, col2, col3, col4 = st.columns(4)
|
|
|
18 |
|
19 |
from strategy.rule_based_strategy import generate_signals_sma, generate_signals_ema
|
20 |
from utils.backtester import backtest_signals
|
21 |
+
from utils.logger import setup_logger
|
22 |
+
import logging
|
23 |
|
24 |
from indicators.enhanced_features import (
|
25 |
create_volatility_features, create_enhanced_lag_features,
|
|
|
36 |
layout="wide"
|
37 |
)
|
38 |
|
39 |
+
# Initialize logging once
|
40 |
+
if 'logging_initialized' not in st.session_state:
|
41 |
+
setup_logger(log_dir="logs", log_level=logging.INFO)
|
42 |
+
st.session_state.logging_initialized = True
|
43 |
+
logging.info("=== Streamlit Trading App Started ===")
|
44 |
+
|
45 |
# Stock symbols
|
46 |
STOCK_SYMBOLS = [
|
47 |
'ADANIENT.NS', 'ADANIPORTS.NS', 'APOLLOHOSP.NS', 'ASIANPAINT.NS',
|
|
|
80 |
@st.cache_data
|
81 |
def load_stock_data(symbol, start_date, end_date):
|
82 |
"""Load stock data from Yahoo Finance"""
|
83 |
+
logging.info(f"Loading stock data for {symbol} from {start_date} to {end_date}")
|
84 |
try:
|
85 |
data = yf.download(symbol, start=start_date, end=end_date, session=session)
|
86 |
# Flatten the MultiIndex columns
|
87 |
if data.columns.nlevels > 1:
|
88 |
data.columns = [col[0] for col in data.columns]
|
89 |
+
logging.info(f"Successfully loaded {len(data)} records for {symbol}")
|
90 |
return data
|
91 |
except Exception as e:
|
92 |
+
logging.error(f"Error loading data for {symbol}: {str(e)}")
|
93 |
st.error(f"Error loading data: {e}")
|
94 |
return None
|
95 |
|
|
|
144 |
start_date = st.sidebar.date_input("Start Date", value=datetime(2023, 1, 1))
|
145 |
end_date = st.sidebar.date_input("End Date", value=datetime.now())
|
146 |
|
147 |
+
logging.info(f"User selected stock: {selected_stock}, date range: {start_date} to {end_date}")
|
148 |
+
|
149 |
st.sidebar.subheader("π Technical Indicators")
|
150 |
rsi_period = st.sidebar.slider("RSI Period", min_value=5, max_value=30, value=14, step=1)
|
151 |
short_period = st.sidebar.slider("Short-term Period", min_value=5, max_value=50, value=20, step=1)
|
152 |
long_period = st.sidebar.slider("Long-term Period", min_value=50, max_value=200, value=50, step=1)
|
153 |
|
154 |
+
logging.info(f"RSI Period: {rsi_period}, Short-term Period: {short_period}, Long-term Period: {long_period}")
|
155 |
+
|
156 |
# Strategy selection (for trading dashboard)
|
157 |
strategy_type = st.sidebar.selectbox("Strategy Type", ["SMA-based", "EMA-based", "Both"])
|
158 |
|
|
|
163 |
take_profit = st.sidebar.slider("Take Profit (%)", 0.0, 50.0, 15.0, step=5.0) / 100
|
164 |
use_risk_mgmt = st.sidebar.checkbox("Enable Risk Management", value=True)
|
165 |
|
166 |
+
logging.info(f"Initial Cash: βΉ{initial_cash}, Transaction Cost: {transaction_cost*100}%, "
|
167 |
+
f"Stop Loss: {stop_loss*100}%, Take Profit: {take_profit*100}%, Risk Management: {use_risk_mgmt}")
|
168 |
+
|
169 |
# ========================= PRICE PREDICTION TAB =========================
|
170 |
|
171 |
with tab1:
|
|
|
206 |
# Create feature vector
|
207 |
feature_vector = latest_data[FEATURES].values.reshape(1, -1)
|
208 |
feature_vector_scaled = scaler.transform(feature_vector)
|
209 |
+
|
210 |
+
logging.info(f"Making price prediction for {selected_stock}")
|
211 |
|
212 |
# Make prediction
|
213 |
prediction = model.predict(feature_vector_scaled)[0]
|
214 |
probability = model.predict_proba(feature_vector_scaled)[0].max()
|
215 |
+
|
216 |
+
logging.info(f"Prediction: {'UP' if prediction == 1 else 'DOWN'} with {probability:.1%} confidence")
|
217 |
|
218 |
|
219 |
# Display prediction
|
|
|
347 |
|
348 |
with tab_sma:
|
349 |
st.subheader("π SMA Strategy Results")
|
350 |
+
logging.info(f"Starting backtest for {selected_stock} with {strategy_type} strategy")
|
351 |
sma_results, sma_metrics = backtest_signals(
|
352 |
df, signal_col='SMA_Signal', price_col='Close',
|
353 |
initial_cash=initial_cash, transaction_cost=transaction_cost if use_risk_mgmt else 0
|
354 |
)
|
355 |
+
logging.info(f"Backtest completed for {selected_stock} with {strategy_type} strategy")
|
356 |
|
357 |
# Set variables for common sections
|
358 |
results = sma_results
|
|
|
413 |
|
414 |
with tab_ema:
|
415 |
st.subheader("π EMA Strategy Results")
|
416 |
+
logging.info(f"Starting backtest for {selected_stock} with {strategy_type} strategy")
|
417 |
ema_results, ema_metrics = backtest_signals(
|
418 |
df, signal_col='EMA_Signal', price_col='Close',
|
419 |
initial_cash=initial_cash, transaction_cost=transaction_cost if use_risk_mgmt else 0
|
420 |
)
|
421 |
+
logging.info(f"Backtest completed for {selected_stock} with {strategy_type} strategy")
|
422 |
|
423 |
# Set variables for common sections
|
424 |
results = ema_results
|
|
|
482 |
signal_col = 'SMA_Signal' if strategy_type == "SMA-based" else 'EMA_Signal'
|
483 |
strategy_name = strategy_type.split('-')[0]
|
484 |
|
485 |
+
logging.info(f"Starting backtest for {selected_stock} with {strategy_type} strategy")
|
486 |
results, metrics = backtest_signals(
|
487 |
df, signal_col=signal_col, price_col='Close',
|
488 |
initial_cash=initial_cash, transaction_cost=transaction_cost if use_risk_mgmt else 0
|
489 |
)
|
490 |
+
logging.info(f"Backtest completed. Final return: {metrics['Total Return']}")
|
491 |
|
492 |
# Display metrics
|
493 |
col1, col2, col3, col4 = st.columns(4)
|