AlanRex commited on
Commit
6d14018
·
verified ·
1 Parent(s): ba62254

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -6
app.py CHANGED
@@ -477,23 +477,60 @@ def update_volume_chart(selected_stock, period):
477
  fig.update_layout(title=f'{stock_name} 成交量', xaxis_title='日期', yaxis_title='成交量', height=300)
478
  return fig
479
 
480
- # 更新產業分析圖表
481
  @app.callback(
482
  dash.dependencies.Output('industry-analysis', 'figure'),
483
- [dash.dependencies.Input('stock-dropdown', 'value')]
484
  )
485
  def update_industry_analysis(selected_stock):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
486
  industry_data = []
487
- for symbol in list(TAIWAN_STOCKS.values())[:10]:
488
  data = get_stock_data(symbol, '1mo')
489
- if not data.empty:
490
  stock_name = [name for name, symbol_code in TAIWAN_STOCKS.items() if symbol_code == symbol][0]
 
491
  return_pct = ((data['Close'].iloc[-1] - data['Close'].iloc[0]) / data['Close'].iloc[0]) * 100
492
  industry_data.append({'股票': stock_name, '代碼': symbol, '月報酬率(%)': return_pct, '產業': INDUSTRY_MAPPING.get(symbol, '其他')})
493
- if not industry_data: return {}
 
 
 
 
 
 
 
494
  df_industry = pd.DataFrame(industry_data)
495
- fig = px.pie(df_industry, values='月報酬率(%)', names='股票', title='各股票月報酬率比較', color_discrete_sequence=px.colors.qualitative.Set3)
 
 
 
 
 
496
  fig.update_layout(height=400)
 
497
  return fig
498
 
499
  # 更新景氣燈號圖表
 
477
  fig.update_layout(title=f'{stock_name} 成交量', xaxis_title='日期', yaxis_title='成交量', height=300)
478
  return fig
479
 
480
+ # 更新產業分析圖表 (修改版本 - 自動抓取波動標的)
481
  @app.callback(
482
  dash.dependencies.Output('industry-analysis', 'figure'),
483
+ [dash.dependencies.Input('stock-dropdown', 'value')] # 這個輸入參數在您原程式碼中,但新邏輯中用不到
484
  )
485
  def update_industry_analysis(selected_stock):
486
+ # 1. 獲取所有股票的近3個月歷史數據,並計算波動性
487
+ all_stocks_volatility = []
488
+ # 這裡的 TAIWAN_STOCKS.values() 包含了您所有的股票代碼
489
+ for symbol in TAIWAN_STOCKS.values():
490
+ # 這裡獲取3個月的數據來計算波動性,確保數據量足夠
491
+ data = get_stock_data(symbol, '3mo')
492
+ if not data.empty and len(data) >= 60: # 確保至少有3個月左右的交易日數據 (約60天)
493
+ # 計算收盤價的標準差,標準差越大,代表波動性越高
494
+ volatility = data['Close'].std()
495
+ stock_name = [name for name, symbol_code in TAIWAN_STOCKS.items() if symbol_code == symbol][0]
496
+ all_stocks_volatility.append({'股票': stock_name, '代碼': symbol, '波動性': volatility})
497
+
498
+ # 如果沒有任何股票數據,則直接返回空圖表
499
+ if not all_stocks_volatility:
500
+ fig = go.Figure().add_annotation(text="無法獲取任何股票數據", showarrow=False)
501
+ fig.update_layout(title="產業表現分析")
502
+ return fig
503
+
504
+ # 2. 根據波動性從高到低排序,並選出前10名
505
+ df_volatility = pd.DataFrame(all_stocks_volatility).sort_values(by='波動性', ascending=False)
506
+ top_10_volatile_stocks = df_volatility.head(10)['代碼'].tolist()
507
+
508
+ # 3. 針對這前10名股票,重新獲取1個月的數據來計算月報酬率
509
  industry_data = []
510
+ for symbol in top_10_volatile_stocks:
511
  data = get_stock_data(symbol, '1mo')
512
+ if not data.empty and len(data) > 1: # 確保有足夠的數據來計算報酬率
513
  stock_name = [name for name, symbol_code in TAIWAN_STOCKS.items() if symbol_code == symbol][0]
514
+ # 計算月報酬率
515
  return_pct = ((data['Close'].iloc[-1] - data['Close'].iloc[0]) / data['Close'].iloc[0]) * 100
516
  industry_data.append({'股票': stock_name, '代碼': symbol, '月報酬率(%)': return_pct, '產業': INDUSTRY_MAPPING.get(symbol, '其他')})
517
+
518
+ # 如果篩選後沒有任何數據,也返回空圖表
519
+ if not industry_data:
520
+ fig = go.Figure().add_annotation(text="無法計算波動較大股票的月報酬率", showarrow=False)
521
+ fig.update_layout(title="產業表現分析")
522
+ return fig
523
+
524
+ # 4. 繪製圓餅圖
525
  df_industry = pd.DataFrame(industry_data)
526
+ fig = px.pie(df_industry,
527
+ values='月報酬率(%)',
528
+ names='股票',
529
+ title='月波動較大股票之報酬率比較',
530
+ color_discrete_sequence=px.colors.qualitative.Set3)
531
+
532
  fig.update_layout(height=400)
533
+
534
  return fig
535
 
536
  # 更新景氣燈號圖表