omniverse1 commited on
Commit
525527f
Β·
verified Β·
1 Parent(s): 65d5f73

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -46
app.py CHANGED
@@ -1,9 +1,7 @@
1
  import gradio as gr
2
  import pandas as pd
3
  import yfinance as yf
4
- from datetime import datetime
5
  from utils import (
6
- get_indonesian_stocks,
7
  calculate_technical_indicators,
8
  generate_trading_signals,
9
  get_fundamental_data,
@@ -18,11 +16,18 @@ warnings.filterwarnings("ignore")
18
 
19
  def analyze_stock(symbol, prediction_days=30):
20
  try:
 
 
 
 
 
 
21
  stock = yf.Ticker(symbol)
22
  data = stock.history(period="6mo", interval="1d")
 
23
  if data.empty:
24
- raise ValueError("No price data available.")
25
-
26
  indicators = calculate_technical_indicators(data)
27
  signals = generate_trading_signals(data, indicators)
28
  fundamental_info = get_fundamental_data(stock)
@@ -53,42 +58,42 @@ def update_analysis(symbol, prediction_days):
53
 
54
  if not fundamental_info:
55
  return (
56
- "Data unavailable.",
57
  gr.Plot.update(value=None),
58
  gr.Plot.update(value=None),
59
  gr.Plot.update(value=None),
60
  "",
61
- "",
62
- "",
63
- "",
64
  )
65
 
66
  summary_text = f"""
67
- **{fundamental_info.get('name', 'N/A')} ({symbol})**
68
- - Current Price: Rp{fundamental_info.get('current_price', 0):,.2f}
69
- - Market Cap: {fundamental_info.get('market_cap', 0):,}
70
- - P/E Ratio: {fundamental_info.get('pe_ratio', 0):.2f}
71
- - Dividend Yield: {fundamental_info.get('dividend_yield', 0):.2f}%
72
- - Volume: {fundamental_info.get('volume', 0):,}
73
  """
74
 
75
  signal_text = f"""
76
- ### Overall Signal: **{signals.get('overall', 'N/A')}**
77
- Strength: {signals.get('strength', 0):.2f}%
78
- Support: {signals.get('support', 0):,.2f}
79
- Resistance: {signals.get('resistance', 0):,.2f}
80
- Stop Loss: {signals.get('stop_loss', 0):,.2f}
 
81
 
82
  **Signal Details:**
83
  {signals.get('details', '')}
84
  """
85
 
86
  prediction_text = f"""
87
- ### AI Forecast (Chronos-Bolt)
88
- Predicted High (30d): {predictions.get('high_30d', 0):,.2f}
89
- Predicted Low (30d): {predictions.get('low_30d', 0):,.2f}
90
- Expected Change (%): {predictions.get('change_pct', 0):.2f}%
91
- Prediction Analysis:
 
92
  {predictions.get('summary', 'No analysis available')}
93
  """
94
 
@@ -104,17 +109,27 @@ Prediction Analysis:
104
  prediction_text,
105
  )
106
 
107
- stock_options = get_indonesian_stocks()
108
-
109
- with gr.Blocks(title="AI Stock Analysis (Chronos-Bolt Edition)", theme="soft") as app:
110
- gr.Markdown("# πŸ“Š AI Stock Analysis Dashboard (Chronos-Bolt Base Model)")
 
 
 
 
 
 
 
 
 
111
 
112
  with gr.Row():
113
- symbol = gr.Dropdown(
114
- label="Select Stock",
115
- choices=list(stock_options.keys()),
116
- value="BBCA.JK",
117
  interactive=True,
 
118
  )
119
  prediction_days = gr.Slider(
120
  label="Prediction Period (Days)",
@@ -124,22 +139,29 @@ with gr.Blocks(title="AI Stock Analysis (Chronos-Bolt Edition)", theme="soft") a
124
  value=30,
125
  interactive=True,
126
  )
 
127
 
128
- analyze_button = gr.Button("πŸ” Analyze Stock")
129
 
130
- with gr.Tab("Fundamentals & Signals"):
131
- fundamentals_output = gr.Markdown()
132
- signal_output = gr.Markdown()
133
-
134
- with gr.Tab("Charts"):
135
- price_chart = gr.Plot()
136
- technical_chart = gr.Plot()
137
- prediction_chart = gr.Plot()
138
-
139
- with gr.Tab("Predictions"):
140
- predicted_high = gr.Textbox(label="Predicted High (30d)")
141
- predicted_low = gr.Textbox(label="Predicted Low (30d)")
142
- predicted_change = gr.Textbox(label="Expected Change (%)")
 
 
 
 
 
 
143
  prediction_summary = gr.Markdown(label="Prediction Analysis")
144
 
145
  analyze_button.click(
 
1
  import gradio as gr
2
  import pandas as pd
3
  import yfinance as yf
 
4
  from utils import (
 
5
  calculate_technical_indicators,
6
  generate_trading_signals,
7
  get_fundamental_data,
 
16
 
17
  def analyze_stock(symbol, prediction_days=30):
18
  try:
19
+ if not symbol.strip():
20
+ raise ValueError("Please enter a valid stock symbol.")
21
+
22
+ if not symbol.endswith(".JK"):
23
+ symbol = symbol.upper() + ".JK"
24
+
25
  stock = yf.Ticker(symbol)
26
  data = stock.history(period="6mo", interval="1d")
27
+
28
  if data.empty:
29
+ raise ValueError("No price data available for this stock.")
30
+
31
  indicators = calculate_technical_indicators(data)
32
  signals = generate_trading_signals(data, indicators)
33
  fundamental_info = get_fundamental_data(stock)
 
58
 
59
  if not fundamental_info:
60
  return (
61
+ "❌ Unable to fetch stock data.",
62
  gr.Plot.update(value=None),
63
  gr.Plot.update(value=None),
64
  gr.Plot.update(value=None),
65
  "",
66
+ "0", "0", "0", ""
 
 
67
  )
68
 
69
  summary_text = f"""
70
+ ### 🏒 {fundamental_info.get('name', 'N/A')} ({symbol.upper()})
71
+ **Current Price:** Rp{fundamental_info.get('current_price', 0):,.2f}
72
+ **Market Cap:** {fundamental_info.get('market_cap', 0):,}
73
+ **P/E Ratio:** {fundamental_info.get('pe_ratio', 0):.2f}
74
+ **Dividend Yield:** {fundamental_info.get('dividend_yield', 0):.2f}%
75
+ **Volume:** {fundamental_info.get('volume', 0):,}
76
  """
77
 
78
  signal_text = f"""
79
+ ### πŸ“ˆ Technical Trading Signal
80
+ **Overall Signal:** {signals.get('overall', 'N/A')}
81
+ **Strength:** {signals.get('strength', 0):.2f}%
82
+ **Support:** {signals.get('support', 0):,.2f}
83
+ **Resistance:** {signals.get('resistance', 0):,.2f}
84
+ **Stop Loss:** {signals.get('stop_loss', 0):,.2f}
85
 
86
  **Signal Details:**
87
  {signals.get('details', '')}
88
  """
89
 
90
  prediction_text = f"""
91
+ ### πŸ€– AI Forecast (Amazon Chronos-Bolt)
92
+ **Predicted High (30d):** Rp{predictions.get('high_30d', 0):,.2f}
93
+ **Predicted Low (30d):** Rp{predictions.get('low_30d', 0):,.2f}
94
+ **Expected Change:** {predictions.get('change_pct', 0):.2f}%
95
+
96
+ 🧠 **Model Insight:**
97
  {predictions.get('summary', 'No analysis available')}
98
  """
99
 
 
109
  prediction_text,
110
  )
111
 
112
+ with gr.Blocks(
113
+ title="AI Stock Forecast Dashboard",
114
+ theme=gr.themes.Soft(primary_hue="blue", secondary_hue="gray"),
115
+ css="""
116
+ #dashboard {padding: 20px; max-width: 1300px; margin: auto;}
117
+ .gradio-container {font-family: 'Inter', sans-serif;}
118
+ h1, h2, h3 {color: #1e293b;}
119
+ .gr-button {font-weight: 600; border-radius: 8px;}
120
+ .gr-markdown {background: #f8fafc; border-radius: 10px; padding: 15px;}
121
+ """
122
+ ) as app:
123
+ gr.Markdown("# ⚑ AI Stock Analysis Dashboard β€” Chronos-Bolt Edition", elem_id="dashboard")
124
+ gr.Markdown("Enter any **Indonesian stock ticker** (e.g., `BBCA`, `ADRO`, `TLKM`, `BMRI`) to get live market insights and AI-based 30-day forecasts.", elem_id="dashboard")
125
 
126
  with gr.Row():
127
+ symbol = gr.Textbox(
128
+ label="Stock Symbol",
129
+ value="BBCA",
130
+ placeholder="Type e.g. BBCA, ADRO, TLKM ...",
131
  interactive=True,
132
+ lines=1
133
  )
134
  prediction_days = gr.Slider(
135
  label="Prediction Period (Days)",
 
139
  value=30,
140
  interactive=True,
141
  )
142
+ analyze_button = gr.Button("πŸš€ Analyze Stock", scale=0.5)
143
 
144
+ gr.Markdown("---")
145
 
146
+ with gr.Row():
147
+ fundamentals_output = gr.Markdown(label="Fundamentals", scale=1)
148
+ signal_output = gr.Markdown(label="Trading Signals", scale=1)
149
+
150
+ gr.Markdown("---")
151
+
152
+ with gr.Tab("πŸ“Š Charts Overview"):
153
+ with gr.Row():
154
+ price_chart = gr.Plot(label="Price & Moving Averages")
155
+ technical_chart = gr.Plot(label="Technical Indicators")
156
+ gr.Markdown("---")
157
+ prediction_chart = gr.Plot(label="AI Forecast Projection")
158
+
159
+ with gr.Tab("πŸ€– AI Forecast Results"):
160
+ with gr.Row():
161
+ predicted_high = gr.Textbox(label="Predicted High (30d)", scale=1)
162
+ predicted_low = gr.Textbox(label="Predicted Low (30d)", scale=1)
163
+ predicted_change = gr.Textbox(label="Expected Change (%)", scale=1)
164
+ gr.Markdown("---")
165
  prediction_summary = gr.Markdown(label="Prediction Analysis")
166
 
167
  analyze_button.click(