請幫我做一個「台灣股市個股除權息前後三日股價查詢工具」的 Next.js 網頁應用,繁體中文介面,需求如下:
【功能】
使用者輸入台股股票代號(例如 2330、6488),選擇市場(上市 TWSE / 上櫃 TPEx / 自動判斷),選擇查詢年份區間(起始年、結束年,預設近10年),按下查詢後:
務必透過 Next.js API Route(伺服器端 route.ts,使用 fetch 在伺服器端執行,不可以是瀏覽器端 client component 直接 fetch)呼叫台灣證券交易所與證券櫃檯買賣中心的公開資料 API,因為這兩個官方網站不支援瀏覽器跨網域請求(CORS),必須由後端代為請求:
上市個股除權息歷史:
GET https://www.twse.com.tw/exchangeReport/TWT49U?response=json&strDate={YYYYMMDD}&endDate={YYYYMMDD}&stockNo={股票代號}
回傳 JSON 有 fields(欄位名稱陣列)與 data(資料列陣列),第一欄是民國年除權息日期字串(格式如 "113/07/18",民國年+1911=西元年)。
上市個股每日收盤價(一次回傳一整個月):
GET https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date={YYYYMM01}&stockNo={股票代號}
回傳 JSON 的 data 陣列每列依序為:[日期(民國,如"113/07/18"), 成交股數, 成交金額, 開盤價, 最高價, 最低價, 收盤價, 漲跌價差, 成交筆數]。收盤價是索引6,數值字串可能含千分位逗號需要去除再轉數字。
上櫃個股除權息歷史:
GET https://www.tpex.org.tw/web/stock/exright/dailyquo/exDailyQ_result.php?l=zh-tw&d={民國年}/{MM}/{DD}&ed={民國年}/{MM}/{DD}
回傳 JSON 有 aaData 陣列,每列依序為:["除權息日期","代號","名稱","除權息前收盤價","除權息參考價","權值","息值","權值+息值","權/息","漲停價","跌停價","開始交易基準價","減除股利參考價","現金股利","每仟股無償配股","現金增資股數","現金增資認購價","公開承銷股數","員工認購股數","原股東認購股數","按持股比例仟股認購"]。這個 API 不接受股票代號參數,會回傳該日期區間內所有股票的除權息資料,務必在後端用第2欄(代號)過濾出目標股票。
上櫃個股每日收盤價(一次回傳一整個月):
GET https://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43_result.php?l=zh-tw&d={民國年}/{MM}&stkno={股票代號}
回傳 JSON 的 aaData 陣列每列依序為:[日期(民國), 成交股數, 成交金額, 開盤價, 最高價, 最低價, 收盤價, 漲跌價差, 成交筆數]。收盤價是索引6。
「自動判斷」邏輯:後端先嘗試 TWSE 除權息 API,若查到資料則視為上市股票;查不到再嘗試 TPEx,若查到資料則視為上櫃股票;兩者都查不到則回傳查無資料的訊息。
對每一筆除權息紀錄(每年可能一筆),後端抓取該除權息日所在月份、前一個月、後一個月的每日收盤價資料(三個月合併),依日期排序、去重複,找到除權息日在時間序列中的位置,取該日期前3個交易日、除權息當日、後3個交易日,共最多7個交易日的資料。每一日計算「當日漲跌幅」= (今日收盤 - 前一交易日收盤) / 前一交易日收盤 * 100%(需要用到窗口外前一天的收盤價才能算出第一天的漲跌幅,所以抓資料時要涵蓋足夠範圍)。
民國年與西元年轉換:民國年字串如 "113/07/18" 轉換規則為 年+1911。日期字串可能有 "/" 分隔或無分隔符號等格式,請做好容錯解析函式。
頁面依年份(新到舊)列出每一筆除權息事件卡片,卡片內含:
錯誤處理:若外部 API 暫時無法連線、逾時或回傳非 JSON(例如維護頁面),要 catch 起來並回傳清楚的錯誤訊息給前端顯示,不要讓整頁崩潰。查詢期間前端顯示 loading 狀態,並顯示查詢進度(例如「正在抓取第 N/M 筆除權息事件的股價資料」)。
加入簡單的伺服器端記憶體快取(同一分鐘內對同一個月份/股票的重複請求不要重打外部 API),並在對 TWSE 連續請求之間加入約 350ms 延遲,避免觸發證交所的速率限制(大約每5秒3次請求)。
版面設計:乾淨、資料密集、專業風格的財經工具介面,數字用等寬字體(tabular numbers),適合手機與桌面瀏覽,響應式設計。頁首簡短說明資料來源為證交所與櫃買中心公開資訊,即時查詢,僅供研究參考不構成投資建議。
若查無除權息紀錄,顯示友善的提示訊息(確認代號是否正確、市場別是否選對,或該股票在此期間未辦理除權息)。
【技術要求】