Spaces:
Running
on
Zero
Running
on
Zero
qol improvements, layout, market open/close
Browse files
app.py
CHANGED
@@ -13,6 +13,7 @@ from typing import Dict, List, Tuple, Optional
|
|
13 |
import json
|
14 |
import spaces
|
15 |
import gc
|
|
|
16 |
|
17 |
# Initialize global variables
|
18 |
pipeline = None
|
@@ -44,6 +45,31 @@ def load_pipeline():
|
|
44 |
print(f"Error loading pipeline: {str(e)}")
|
45 |
raise RuntimeError(f"Failed to load model: {str(e)}")
|
46 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
def get_historical_data(symbol: str, timeframe: str = "1d", lookback_days: int = 365) -> pd.DataFrame:
|
48 |
"""
|
49 |
Fetch historical data using yfinance.
|
@@ -57,6 +83,11 @@ def get_historical_data(symbol: str, timeframe: str = "1d", lookback_days: int =
|
|
57 |
pd.DataFrame: Historical data with OHLCV and technical indicators
|
58 |
"""
|
59 |
try:
|
|
|
|
|
|
|
|
|
|
|
60 |
# Map timeframe to yfinance interval and adjust lookback period
|
61 |
tf_map = {
|
62 |
"1d": "1d",
|
@@ -379,6 +410,14 @@ def create_interface():
|
|
379 |
gr.Markdown("# Structured Product Analysis")
|
380 |
gr.Markdown("Analyze stocks for inclusion in structured financial products with extended time horizons.")
|
381 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
382 |
with gr.Tabs() as tabs:
|
383 |
# Daily Analysis Tab
|
384 |
with gr.TabItem("Daily Analysis"):
|
@@ -408,10 +447,11 @@ def create_interface():
|
|
408 |
|
409 |
with gr.Column():
|
410 |
daily_plot = gr.Plot(label="Analysis and Prediction")
|
411 |
-
daily_signals = gr.JSON(label="Trading Signals")
|
412 |
|
413 |
with gr.Row():
|
414 |
with gr.Column():
|
|
|
|
|
415 |
gr.Markdown("### Structured Product Metrics")
|
416 |
daily_metrics = gr.JSON(label="Product Metrics")
|
417 |
|
@@ -420,6 +460,9 @@ def create_interface():
|
|
420 |
|
421 |
gr.Markdown("### Sector Analysis")
|
422 |
daily_sector_metrics = gr.JSON(label="Sector Metrics")
|
|
|
|
|
|
|
423 |
|
424 |
# Hourly Analysis Tab
|
425 |
with gr.TabItem("Hourly Analysis"):
|
@@ -553,7 +596,9 @@ def create_interface():
|
|
553 |
return signals, fig, product_metrics, risk_metrics, sector_metrics
|
554 |
except Exception as e:
|
555 |
error_message = str(e)
|
556 |
-
if "
|
|
|
|
|
557 |
error_message = f"Not enough data available for {symbol} in {timeframe} timeframe. Please try a different timeframe or symbol."
|
558 |
elif "no price data found" in error_message:
|
559 |
error_message = f"No data available for {symbol} in {timeframe} timeframe. Please try a different timeframe or symbol."
|
|
|
13 |
import json
|
14 |
import spaces
|
15 |
import gc
|
16 |
+
import pytz
|
17 |
|
18 |
# Initialize global variables
|
19 |
pipeline = None
|
|
|
45 |
print(f"Error loading pipeline: {str(e)}")
|
46 |
raise RuntimeError(f"Failed to load model: {str(e)}")
|
47 |
|
48 |
+
def is_market_open() -> bool:
|
49 |
+
"""Check if the market is currently open"""
|
50 |
+
now = datetime.now()
|
51 |
+
# Check if it's a weekday (0 = Monday, 6 = Sunday)
|
52 |
+
if now.weekday() >= 5: # Saturday or Sunday
|
53 |
+
return False
|
54 |
+
|
55 |
+
# Check if it's during market hours (9:30 AM - 4:00 PM ET)
|
56 |
+
et_time = now.astimezone(pytz.timezone('US/Eastern'))
|
57 |
+
market_open = et_time.replace(hour=9, minute=30, second=0, microsecond=0)
|
58 |
+
market_close = et_time.replace(hour=16, minute=0, second=0, microsecond=0)
|
59 |
+
|
60 |
+
return market_open <= et_time <= market_close
|
61 |
+
|
62 |
+
def get_next_trading_day() -> datetime:
|
63 |
+
"""Get the next trading day"""
|
64 |
+
now = datetime.now()
|
65 |
+
next_day = now + timedelta(days=1)
|
66 |
+
|
67 |
+
# Skip weekends
|
68 |
+
while next_day.weekday() >= 5: # Saturday or Sunday
|
69 |
+
next_day += timedelta(days=1)
|
70 |
+
|
71 |
+
return next_day
|
72 |
+
|
73 |
def get_historical_data(symbol: str, timeframe: str = "1d", lookback_days: int = 365) -> pd.DataFrame:
|
74 |
"""
|
75 |
Fetch historical data using yfinance.
|
|
|
83 |
pd.DataFrame: Historical data with OHLCV and technical indicators
|
84 |
"""
|
85 |
try:
|
86 |
+
# Check if market is open for intraday data
|
87 |
+
if timeframe in ["1h", "15m"] and not is_market_open():
|
88 |
+
next_trading_day = get_next_trading_day()
|
89 |
+
raise Exception(f"Market is currently closed. Next trading day is {next_trading_day.strftime('%Y-%m-%d')}")
|
90 |
+
|
91 |
# Map timeframe to yfinance interval and adjust lookback period
|
92 |
tf_map = {
|
93 |
"1d": "1d",
|
|
|
410 |
gr.Markdown("# Structured Product Analysis")
|
411 |
gr.Markdown("Analyze stocks for inclusion in structured financial products with extended time horizons.")
|
412 |
|
413 |
+
# Add market status message
|
414 |
+
market_status = "Market is currently closed" if not is_market_open() else "Market is currently open"
|
415 |
+
next_trading_day = get_next_trading_day()
|
416 |
+
gr.Markdown(f"""
|
417 |
+
### Market Status: {market_status}
|
418 |
+
Next trading day: {next_trading_day.strftime('%Y-%m-%d')}
|
419 |
+
""")
|
420 |
+
|
421 |
with gr.Tabs() as tabs:
|
422 |
# Daily Analysis Tab
|
423 |
with gr.TabItem("Daily Analysis"):
|
|
|
447 |
|
448 |
with gr.Column():
|
449 |
daily_plot = gr.Plot(label="Analysis and Prediction")
|
|
|
450 |
|
451 |
with gr.Row():
|
452 |
with gr.Column():
|
453 |
+
|
454 |
+
|
455 |
gr.Markdown("### Structured Product Metrics")
|
456 |
daily_metrics = gr.JSON(label="Product Metrics")
|
457 |
|
|
|
460 |
|
461 |
gr.Markdown("### Sector Analysis")
|
462 |
daily_sector_metrics = gr.JSON(label="Sector Metrics")
|
463 |
+
|
464 |
+
gr.Markdown("### Trading Signals")
|
465 |
+
daily_signals = gr.JSON(label="Trading Signals")
|
466 |
|
467 |
# Hourly Analysis Tab
|
468 |
with gr.TabItem("Hourly Analysis"):
|
|
|
596 |
return signals, fig, product_metrics, risk_metrics, sector_metrics
|
597 |
except Exception as e:
|
598 |
error_message = str(e)
|
599 |
+
if "Market is currently closed" in error_message:
|
600 |
+
error_message = f"{error_message}. Please try again during market hours or use daily timeframe."
|
601 |
+
elif "Insufficient data points" in error_message:
|
602 |
error_message = f"Not enough data available for {symbol} in {timeframe} timeframe. Please try a different timeframe or symbol."
|
603 |
elif "no price data found" in error_message:
|
604 |
error_message = f"No data available for {symbol} in {timeframe} timeframe. Please try a different timeframe or symbol."
|