S-Dreamer commited on
Commit
d65815d
Β·
verified Β·
1 Parent(s): e183a08

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -88
app.py CHANGED
@@ -1,120 +1,79 @@
1
  import panel as pn
2
  import pandas as pd
3
  import numpy as np
4
- import hvplot.pandas # noqa: F401
5
- from bokeh.models.formatters import NumeralTickFormatter
6
- from datetime import datetime, timedelta
7
  import asyncio
8
- import holoviews as hv
9
-
10
- # --- Setup ---
11
- pn.extension('tabulator', sizing_mode="stretch_width")
12
- hv.extension("bokeh")
13
 
14
- # --- Dummy Data Generation ---
15
- def generate_dummy_data(n_points=100):
16
- """Generates a DataFrame with simulated stock price data."""
17
- start_time = datetime.now() - timedelta(minutes=n_points)
18
- time_index = pd.date_range(start=start_time, periods=n_points, freq='1min')
19
- prices = 100 + np.random.randn(n_points).cumsum()
20
- return pd.DataFrame({'Time': time_index, 'Price': prices}).set_index('Time')
21
 
 
 
 
 
 
 
22
 
23
- def generate_ai_signal(current_price):
24
- """Simple AI logic to generate trading signals."""
25
- if current_price % 10 < 3:
26
  return 'BUY', 'green'
27
- elif current_price % 10 > 7:
28
  return 'SELL', 'red'
29
  return 'HOLD', 'orange'
30
 
 
 
31
 
32
- # --- Initial Data & Signal ---
33
- df = generate_dummy_data()
34
- current_signal, signal_color = generate_ai_signal(df['Price'].iloc[-1])
35
-
36
- # --- Dashboard Widgets ---
37
- symbol_input = pn.widgets.TextInput(name='Stock Symbol', value='AI_STOCK', width=150)
38
- update_interval = pn.widgets.IntSlider(name='Update Interval (s)', start=1, end=10, step=1, value=2, width=200)
39
 
40
- signal_indicator = pn.indicators.Number(
41
  name='AI Signal',
42
  value=0,
43
- format=f'{current_signal}',
44
  font_size='36pt',
45
- colors=[(9999, signal_color)]
46
  )
47
 
48
- metrics_data = {
49
  'Metric': ['Win Rate', 'Profit Factor', 'Sharpe Ratio'],
50
  'Value': ['62%', '1.85', '1.2']
51
- }
52
- metrics_table = pn.widgets.Tabulator(pd.DataFrame(metrics_data), disabled=True, selectable=False)
53
 
54
- # --- Dynamic Price Stream ---
55
- price_stream_df = df.copy()
56
- price_stream = hv.streams.Buffer(price_stream_df.reset_index(), length=100)
57
-
58
- price_plot = hv.DynamicMap(
59
- lambda data: data.hvplot.line(
60
- x='Time',
61
- y='Price',
62
- line_width=3,
63
- height=400,
64
- xlabel='Time',
65
- ylabel='Price',
66
- title='Live Stock Price',
67
- responsive=True
68
- ).opts(yformatter=NumeralTickFormatter(format="0.00")),
69
- streams=[price_stream]
70
- )
71
 
72
  # --- Layout ---
73
  sidebar = pn.Column(
74
- "## βš™οΈ Controls",
75
- symbol_input,
76
- update_interval,
77
- "## πŸ€– AI Analysis",
78
- signal_indicator,
79
- "## πŸ“ˆ Performance",
80
- metrics_table,
81
  width=300
82
  )
83
 
84
- main = pn.Column(
85
- price_plot
86
- )
87
 
88
- dashboard = pn.template.FastListTemplate(
89
- site="AI Trading Dashboard",
90
- title=lambda: f"Live Analysis for {symbol_input.value}",
91
  sidebar=[sidebar],
92
- main=[main]
93
  )
94
 
95
- # --- Async Update Callback ---
96
- async def update_data():
97
- """Simulate a real-time feed updating price and signal."""
98
  while True:
99
- await asyncio.sleep(update_interval.value)
100
-
101
- last_time = price_stream_df.index[-1]
102
- new_time = last_time + timedelta(minutes=1)
103
- new_price = price_stream_df['Price'].iloc[-1] + np.random.randn() * 0.5
104
- new_row = pd.DataFrame({'Time': [new_time], 'Price': [new_price]})
105
-
106
- # Append to internal df
107
- price_stream_df.loc[new_time] = new_price
108
-
109
- # Update stream
110
- price_stream.send(new_row)
111
-
112
- # Update AI signal
113
- signal, color = generate_ai_signal(new_price)
114
- signal_indicator.format = signal
115
- signal_indicator.colors = [(9999, color)]
116
-
117
-
118
- # --- Launch ---
119
- dashboard.servable()
120
- pn.state.onload(update_data)
 
1
  import panel as pn
2
  import pandas as pd
3
  import numpy as np
4
+ import hvplot.pandas
 
 
5
  import asyncio
6
+ from datetime import datetime, timedelta
 
 
 
 
7
 
8
+ pn.extension('tabulator', 'plotly', sizing_mode="stretch_width")
 
 
 
 
 
 
9
 
10
+ # --- Dummy Data Generator ---
11
+ def generate_dummy_data(n=100):
12
+ start = datetime.now() - timedelta(minutes=n)
13
+ times = [start + timedelta(minutes=i) for i in range(n)]
14
+ prices = 100 + np.random.randn(n).cumsum()
15
+ return pd.DataFrame({'Time': times, 'Price': prices}).set_index('Time')
16
 
17
+ def generate_ai_signal(price):
18
+ mod = price % 10
19
+ if mod < 3:
20
  return 'BUY', 'green'
21
+ elif mod > 7:
22
  return 'SELL', 'red'
23
  return 'HOLD', 'orange'
24
 
25
+ data = generate_dummy_data()
26
+ signal, color = generate_ai_signal(data['Price'].iloc[-1])
27
 
28
+ # --- Widgets ---
29
+ symbol_input = pn.widgets.TextInput(name='Stock Symbol', value='AI_STOCK')
30
+ interval_slider = pn.widgets.IntSlider(name='Update Interval (s)', start=1, end=10, step=1, value=2)
 
 
 
 
31
 
32
+ signal_display = pn.indicators.Number(
33
  name='AI Signal',
34
  value=0,
35
+ format=signal,
36
  font_size='36pt',
37
+ colors=[(999, color)]
38
  )
39
 
40
+ metrics_table = pn.widgets.Tabulator(pd.DataFrame({
41
  'Metric': ['Win Rate', 'Profit Factor', 'Sharpe Ratio'],
42
  'Value': ['62%', '1.85', '1.2']
43
+ }), disabled=True, selectable=False)
 
44
 
45
+ chart = data.hvplot.line(y='Price', title="πŸ“ˆ Live Stock Price", height=400, line_width=3).opts(yformatter="%.2f")
46
+ stream = hvplot.streams.Buffer(data, index=False, length=100)
47
+ chart.update(stream)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  # --- Layout ---
50
  sidebar = pn.Column(
51
+ "## βš™οΈ Controls", symbol_input, interval_slider,
52
+ "## πŸ€– AI Signal", signal_display,
53
+ "## πŸ“Š Metrics", metrics_table,
 
 
 
 
54
  width=300
55
  )
56
 
57
+ main_area = pn.Column(chart)
 
 
58
 
59
+ template = pn.template.FastListTemplate(
60
+ site="AI Trader",
61
+ title="πŸ“Š AI Trading Dashboard",
62
  sidebar=[sidebar],
63
+ main=[main_area]
64
  )
65
 
66
+ # --- Async Update Logic ---
67
+ async def updater():
 
68
  while True:
69
+ await asyncio.sleep(interval_slider.value)
70
+ new_time = data.index[-1] + timedelta(seconds=10)
71
+ new_price = data['Price'].iloc[-1] + np.random.randn() * 0.5
72
+ new_df = pd.DataFrame([{'Time': new_time, 'Price': new_price}]).set_index('Time')
73
+ stream.send(new_df)
74
+ new_signal, new_color = generate_ai_signal(new_price)
75
+ signal_display.format = new_signal
76
+ signal_display.colors = [(999, new_color)]
77
+
78
+ template.servable()
79
+ pn.state.onload(updater)