omniverse1 commited on
Commit
05c066f
Β·
verified Β·
1 Parent(s): 380e150

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -19
app.py CHANGED
@@ -11,12 +11,23 @@ from utils import (
11
  )
12
  import pandas as pd
13
 
 
14
  def analyze_stock(symbol, mode, pred_days):
15
  try:
16
  stock = yf.Ticker(symbol)
17
  data = stock.history(period="1y")
 
 
18
  if data.empty:
19
- return "No data found", None, None, None
 
 
 
 
 
 
 
 
20
 
21
  indicators = calculate_technical_indicators(data)
22
  signals = generate_trading_signals(data, indicators)
@@ -31,8 +42,17 @@ def analyze_stock(symbol, mode, pred_days):
31
  return fundamentals, signals, fig_price, fig_technical, fig_prediction, prediction
32
  else:
33
  return fundamentals, signals, fig_price, fig_technical, None, None
 
34
  except Exception as e:
35
- return f"Error analyzing {symbol}: {e}", None, None, None, None, None
 
 
 
 
 
 
 
 
36
 
37
 
38
  def format_fundamental_output(f):
@@ -48,22 +68,23 @@ def format_fundamental_output(f):
48
 
49
 
50
  def format_signal_output(s):
51
- details = s["details"].split("\n")
52
- formatted_details = "<ul>" + "".join(f"<li>{d}</li>" for d in details) + "</ul>"
 
53
  return f"""
54
  <h3>TECHNICAL SIGNAL SUMMARY</h3>
55
- <b>Overall Trend:</b> {s['overall']}<br>
56
- <b>Signal Strength:</b> {s['strength']:.2f}%<br>
57
- <b>Support:</b> Rp{s['support']:,.2f}<br>
58
- <b>Resistance:</b> Rp{s['resistance']:,.2f}<br>
59
- <b>Stop Loss:</b> Rp{s['stop_loss']:,.2f}<br>
60
- <br><b>Detailed Signals:</b>{formatted_details}
61
  """
62
 
63
 
64
  def format_ai_output(p):
65
- if not p:
66
- return ""
67
  tp1 = p["mean_30d"] * 0.97
68
  tp2 = p["mean_30d"] * 1.02
69
  sl = p["low_30d"] * 0.95
@@ -85,7 +106,7 @@ with gr.Blocks(css="""
85
  h3 { color: #003366; border-bottom: 2px solid #d3d3d3; padding-bottom: 5px; }
86
  .panel-box { background: white; padding: 20px; border-radius: 10px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
87
  """) as demo:
88
- gr.HTML("<h1 style='text-align:center;color:#003366;'>πŸ“ˆ STOCK ANALYSIS DASHBOARD</h1>")
89
 
90
  with gr.Row():
91
  stock_input = gr.Textbox(label="Enter Stock Symbol (e.g. BBCA.JK, ADRO.JK)", placeholder="Type your stock symbol here...")
@@ -94,9 +115,9 @@ with gr.Blocks(css="""
94
  analyze_button = gr.Button("Analyze")
95
 
96
  with gr.Row():
97
- fundamentals_output = gr.HTML()
98
- signal_output = gr.HTML()
99
- ai_output = gr.HTML()
100
 
101
  with gr.Row():
102
  chart_price = gr.Plot(label="Price Chart")
@@ -105,15 +126,13 @@ with gr.Blocks(css="""
105
 
106
  def run_analysis(symbol, mode, pred_days):
107
  fundamentals, signals, fig_price, fig_technical, fig_prediction, prediction = analyze_stock(symbol, mode, pred_days)
108
- if isinstance(fundamentals, str):
109
- return fundamentals, "", "", None, None, None
110
  return (
111
  format_fundamental_output(fundamentals),
112
  format_signal_output(signals),
113
  format_ai_output(prediction) if mode == "AI Prediction" else "",
114
  fig_price,
115
  fig_technical,
116
- fig_prediction if mode == "AI Prediction" else None
117
  )
118
 
119
  analyze_button.click(
 
11
  )
12
  import pandas as pd
13
 
14
+
15
  def analyze_stock(symbol, mode, pred_days):
16
  try:
17
  stock = yf.Ticker(symbol)
18
  data = stock.history(period="1y")
19
+
20
+ # βœ… Handle jika tidak ada data (misal salah kode atau delisted)
21
  if data.empty:
22
+ msg = f"No data found for {symbol}. Check the symbol or try adding .JK (e.g., ADRO.JK)"
23
+ return (
24
+ {"name": "N/A", "current_price": 0, "market_cap": 0, "pe_ratio": 0, "dividend_yield": 0, "volume": 0},
25
+ {"overall": "N/A", "strength": 0, "support": 0, "resistance": 0, "stop_loss": 0, "details": msg},
26
+ None,
27
+ None,
28
+ None,
29
+ None,
30
+ )
31
 
32
  indicators = calculate_technical_indicators(data)
33
  signals = generate_trading_signals(data, indicators)
 
42
  return fundamentals, signals, fig_price, fig_technical, fig_prediction, prediction
43
  else:
44
  return fundamentals, signals, fig_price, fig_technical, None, None
45
+
46
  except Exception as e:
47
+ msg = f"Error analyzing {symbol}: {e}"
48
+ return (
49
+ {"name": "N/A", "current_price": 0, "market_cap": 0, "pe_ratio": 0, "dividend_yield": 0, "volume": 0},
50
+ {"overall": "Error", "strength": 0, "support": 0, "resistance": 0, "stop_loss": 0, "details": msg},
51
+ None,
52
+ None,
53
+ None,
54
+ None,
55
+ )
56
 
57
 
58
  def format_fundamental_output(f):
 
68
 
69
 
70
  def format_signal_output(s):
71
+ details = s.get("details", "")
72
+ detail_list = details.split("\n") if details else []
73
+ formatted_details = "<ul>" + "".join(f"<li>{d}</li>" for d in detail_list) + "</ul>"
74
  return f"""
75
  <h3>TECHNICAL SIGNAL SUMMARY</h3>
76
+ <b>Overall Trend:</b> {s.get('overall','N/A')}<br>
77
+ <b>Signal Strength:</b> {s.get('strength',0):.2f}%<br>
78
+ <b>Support:</b> Rp{s.get('support',0):,.2f}<br>
79
+ <b>Resistance:</b> Rp{s.get('resistance',0):,.2f}<br>
80
+ <b>Stop Loss:</b> Rp{s.get('stop_loss',0):,.2f}<br><br>
81
+ <b>Detailed Signals:</b>{formatted_details}
82
  """
83
 
84
 
85
  def format_ai_output(p):
86
+ if not p or not p.get("values"):
87
+ return "<h3>30-DAY AI FORECAST (CHRONOS-BOLT)</h3><p>No AI prediction data available.</p>"
88
  tp1 = p["mean_30d"] * 0.97
89
  tp2 = p["mean_30d"] * 1.02
90
  sl = p["low_30d"] * 0.95
 
106
  h3 { color: #003366; border-bottom: 2px solid #d3d3d3; padding-bottom: 5px; }
107
  .panel-box { background: white; padding: 20px; border-radius: 10px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
108
  """) as demo:
109
+ gr.HTML("<h1 style='text-align:center;color:#003366;'>πŸ“Š STOCK ANALYSIS DASHBOARD</h1>")
110
 
111
  with gr.Row():
112
  stock_input = gr.Textbox(label="Enter Stock Symbol (e.g. BBCA.JK, ADRO.JK)", placeholder="Type your stock symbol here...")
 
115
  analyze_button = gr.Button("Analyze")
116
 
117
  with gr.Row():
118
+ fundamentals_output = gr.HTML(elem_classes="panel-box")
119
+ signal_output = gr.HTML(elem_classes="panel-box")
120
+ ai_output = gr.HTML(elem_classes="panel-box")
121
 
122
  with gr.Row():
123
  chart_price = gr.Plot(label="Price Chart")
 
126
 
127
  def run_analysis(symbol, mode, pred_days):
128
  fundamentals, signals, fig_price, fig_technical, fig_prediction, prediction = analyze_stock(symbol, mode, pred_days)
 
 
129
  return (
130
  format_fundamental_output(fundamentals),
131
  format_signal_output(signals),
132
  format_ai_output(prediction) if mode == "AI Prediction" else "",
133
  fig_price,
134
  fig_technical,
135
+ fig_prediction if mode == "AI Prediction" else None,
136
  )
137
 
138
  analyze_button.click(