AI 協力股市爬蟲

stock — 股票歷史資訊

https://twstock.readthedocs.io/zh-tw/latest/reference/stock.html

stock 包含三個重要的元素: DATATUPLE 負責建立歷史股票資料之 namedtuple、 BaseFetcher 作為 TWSEFetcher 以及 TPEXFetcher 之基底 class、 Stock 封裝整個歷史股票資訊供使用者使用,同時 Stock 會針對上市或上櫃的股票代號 自動給予正確的 fetcher。

DATATUPLE

class stock.DATATUPLE(datecapacityturnoveropenhighlowclosechangetransaction)

歷史資料之 nametuple

Attributes:

date

datetime.datetime 格式之時間,例如 datetime.datetime(2017, 6, 12, 0, 0)

capacity

總成交股數 (單位: 股)。

turnover

總成交金額 (單位: 新台幣/元)。

open

開盤價。

high

盤中最高價

low

盤中最低價。

close

收盤價。

change

漲跌價差。

transaction

成交筆數。

Stock

class stock.Stock(sid: strinitial_fetch: bool=True)

有關股票歷史資訊 (開/收盤價,交易量,日期…etc) 以及簡易股票分析。 建立 Stock 實例時,若 initial_fetch 為 True (預設), 會自動呼叫 fetch_31() 抓取近 31 日之歷史股票資料。

Class attributes are:

sid

股票代號。

fetcher

抓取方式之 instance,程式會自動判斷上櫃或上市,使用相對應之 fetcher。

raw_data

經由 TWSEFetcher 或是 TPEXFetcher 抓取之原始資料。

data

將 raw_data 透過 DATATUPLE 處理之歷史股票資料。

Fetcher method:

fetch(selfyear: intmonth: int)

擷取該年、月份之歷史股票資料。

fetch_from(selfyear: intmonth: int)

擷取自該年、月至今日之歷史股票資料。

fetch_31(self)

擷取近 31 日開盤之歷史股票資料。

分析 method:

continuous(selfdata)

data 之持續上升天數。

moving_average(selfdata: listdays: int)

data 之 days 日均數值。

ma_bias_ratio(selfday1day2)

計算 day1 日以及 day2 之乖離值。

ma_bias_ratio_pivot(selfdatasample_size=5position=False)

判斷正負乖離。

Fetcher

class stock.BaseFetcher
fetch(selfyearmonthsidretry)

抓取相對應年月份之股票資料。

_convert_date(selfdate)

回傳西元記年,將民國記年轉換為西元記年。舉例而言:

>>> date = self._convert_date('106/05/01')
>>> print(date)
'2017/05/01'
_make_datatuple(selfdata)

將相對應之單日資料轉換為 DATATUPLE。會將對應之資料轉換為對應型態。

purify(selforiginal_data: list)

將 original_data 內之所有資料轉換為 DATATUPLE 型態。

class stock.TWSEFetcher(BaseFetcher)

台灣上市股票抓取

class stock.TPEXFetcher(BaseFetcher)

台灣上櫃股票抓取

AI協力股票爬蟲


寫一個 google apps script 爬蟲 查詢 https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw json

資料參考 {"msgArray":[{"@":"2330.tw","tv":"8198","ps":"8185","pid":"9.tse.tw|15192","pz":"1000.0000","bp":"0","fv":"97","oa":"1010.0000","ob":"1005.0000","m%":"000000","^":"20250304","key":"tse_2330.tw_20250304","a":"1005.0000_1010.0000_1015.0000_1020.0000_1025.0000_","b":"1000.0000_999.0000_998.0000_997.0000_996.0000_","c":"2330","#":"13.tse.tw|3012","d":"20250304","%":"14:30:00","ch":"2330.tw","tlong":"1741069800000","ot":"14:30:00","f":"915_2344_2240_1949_723_","g":"7496_1304_1706_921_1698_","ip":"0","mt":"000000","ov":"189262","h":"1010.0000","i":"24","it":"12","oz":"1010.0000","l":"996.0000","n":"台積電","o":"996.0000","p":"0","ex":"tse","s":"8198","t":"13:30:00","u":"1120.0000","v":"64283","w":"918.0000","nf":"台灣積體電路製造股份有限公司","y":"1020.0000","z":"1000.0000","ts":"0"}],"referer":"","userDelay":5000,"rtcode":"0000","queryTime":{"sysDate":"20250304","stockInfoItem":3877,"stockInfo":510,"sessionStr":"UserSession","sysTime":"16:41:36","showChart":false,"sessionFromTime":-1,"sessionLatestTime":-1},"rtmessage":"OK","exKey":"if_tse_2330.tw_zh-tw.null","cachedAlive":2265}

 解析後參考 object►cachedAlive object {8} msgArray [1] 0 {44} @ : 2330.tw tv : 8198 ps : 8185 pid : 9.tse.tw|15192 pz : 1000.0000 bp : 0 fv : 97 oa : 1010.0000 ob : 1005.0000 m% : 000000 ^ : 20250304 key : tse_2330.tw_20250304 a : 1005.0000_1010.0000_1015.0000_1020.0000_1025.0000_ b : 1000.0000_999.0000_998.0000_997.0000_996.0000_ c : 2330 # : 13.tse.tw|3012 d : 20250304 % : 14:30:00 ch : 2330.tw tlong : 1741069800000 ot : 14:30:00 f : 915_2344_2240_1949_723_ g : 7496_1304_1706_921_1698_ ip : 0 mt : 000000 ov : 189262 h : 1010.0000 i : 24 it : 12 oz : 1010.0000 l : 996.0000 n : 台積電 o : 996.0000 p : 0 ex : tse s : 8198 t : 13:30:00 u : 1120.0000 v : 64283 w : 918.0000 nf : 台灣積體電路製造股份有限公司 y : 1020.0000 z : 1000.0000 ts : 0 referer : userDelay : 5000 rtcode : 0000 queryTime {8} sysDate : 20250304 stockInfoItem : 3877 stockInfo : 510 sessionStr : UserSession sysTime : 16:41:36 showChart : false sessionFromTime : -1 sessionLatestTime : -1 rtmessage : OK exKey : if_tse_2330.tw_zh-tw.null cachedAlive : 2265



function fetchStockData() {

  // 目標 URL

  var url = "https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw";

 

  // 設定選項(可設定請求方法、逾時等)

  var options = {

    "method": "get",

    "muteHttpExceptions": true

  };

 

  // 發送 HTTP 請求取得資料

  var response = UrlFetchApp.fetch(url, options);

 

  // 檢查 HTTP 狀態碼是否為 200 (成功)

  if (response.getResponseCode() == 200) {

    // 解析回傳的 JSON 字串

    var jsonData = JSON.parse(response.getContentText());

   

    // 檢查資料格式是否正確

    if (jsonData && jsonData.msgArray && jsonData.msgArray.length > 0) {

      var stockInfo = jsonData.msgArray[0];

     

      // 可依需求取用各欄位資料(注意若欄位名稱有特殊字元,需用中括號取值)

      Logger.log("股票代號: " + stockInfo['@']);

      Logger.log("股票名稱: " + stockInfo.n);

      Logger.log("最新成交價: " + stockInfo.z);

      Logger.log("最高價: " + stockInfo.h);

      Logger.log("最低價: " + stockInfo.l);

      Logger.log("成交量: " + stockInfo.v);

      // 其他欄位依需求解析…

     

    } else {

      Logger.log("找不到 msgArray 資料。");

    }

  } else {

    Logger.log("HTTP 錯誤,狀態碼:" + response.getResponseCode());

  }

}




股票資料來源

證交所即時資訊API

API功能

於盤中取得個股、指數之價格、成交量、五檔...等即時資訊,詳細回傳資料如資料名稱對照表

API格式

目前的證交所即時資訊API的URL格式(JSON格式)為:
https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=參數&json=1&delay=0

參數 = 上市別_證券代碼.tw[_日期]
PartDescription
上市別必需參數
上市為tse
上櫃為otc
證券代碼必需參數
例如:
  • 台積電 : 2330.tw
  • 環球晶 : 6488.tw
  • 上市加權指數 : t00.tw
  • 櫃買指數 : o00.tw


註:若要一次取得多個即時資料,參數請用「|」分隔
例如:取得台積電與環球晶,參數=tse _2330.tw|otc_6488.tw

API範例

台積電即時資訊

https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw&json=1&delay=0

環球晶即時資訊

https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=otc_6488.tw&json=1&delay=0

上市加權指數即時資訊

https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_t00.tw&json=1&delay=0

櫃買指數即時資訊

https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=otc_o00.tw&json=1&delay=0

取得台積電與環球晶即時資訊:

https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw|otc_6488.tw&json=1&delay=0

API回傳資料

成功取得資訊時,應該會取得如下的JSON格式資料

{  "msgArray":
  [
    {
      "ts":"0",
      "tk0":"2330.tw_tse_20200106_B_9999280689",
      "tk1":"2330.tw_tse_20200106_B_9999280433",
      "tlong":"1578282160000",
      "f":"1122_1149_759_705_625_",
      "ex":"tse",
      "g":"1400_1778_678_1226_873_",
      "d":"20200106",
      "it":"12",
      "b":"332.50_332.00_331.50_331.00_330.50_",
      "c":"2330",
      "mt":"868332",
      "a":"333.00_333.50_334.00_334.50_335.00_",
      "n":"台積電",
      "o":"333.00",
      "l":"332.50",
      "h":"334.50",
      "ip":"0",
      "i":"24",
      "w":"306.00",
      "v":"29121",
      "u":"373.00",
      "t":"11:42:40",
      "s":"4",
      "pz":"333.00",
      "tv":"4",
      "p":"0",
      "nf":"台灣積體電路製造股份有限公司",
      "ch":"2330.tw",
      "z":"333.00",
      "y":"339.50",
      "ps":"2304"
    }
  ],
  "userDelay":5000,
  "rtmessage":"OK",
  "referer":"",
  "queryTime":
  {
    "sysTime":"11:42:44",
    "sessionLatestTime":-1,
    "sysDate":"20200106",
    "sessionFromTime":-1,
    "stockInfoItem":2607,
    "showChart":false,
    "sessionStr":"UserSession",
    "stockInfo":388257
  },
  "rtcode":"0000"
}
資料名稱對照表
NameDescription
tlongepoch毫秒數
f揭示賣量(配合「a」,以_分隔資料)
ex上市別(上市:tse,上櫃:otc,空白:已下市或下櫃)
g揭示買量(配合「b」,以_分隔資料)
d最近交易日期(YYYYMMDD)
b揭示買價(從高到低,以_分隔資料)
c股票代號
a揭示賣價(從低到高,以_分隔資料)
n公司簡稱
o開盤
l最低
h最高
w跌停價
v累積成交量
u漲停價
t最近成交時刻(HH:MM:SS)
tv當盤成交量
nf公司全名
z當盤成交價
y昨收

相關問題

使用限制

本API來源為證交所基本市況報導網站根據經驗每5秒請求不得超過3次,否則有可能會被鎖IP,請特別留意。

本文為學術研究經驗分享,請在合理、合法情況下使用,如因資料不正確或使用上有任何損害或損失,本站不負法律責任。

如何繞過瀏覽器跨域(CORS)限制?

有跨域(CORS)問題,可參考利用Google Apps Script繞過瀏覽器跨域(CORS)限制

上市證券代碼表

https://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&type=ALLBUT0999[&date=日期]

日期為選用參數格式為YYYYMMDD,省略為最新交易日資料,大約每日16:00更新。

範例

上櫃證券代碼表

https://www.tpex.org.tw/www/zh-tw/afterTrading/dailyQuotes?response=json[&date=日期]
日期為選用參數格式為YYYY/MM/DD(需百分號編碼),省略為最新交易日資料,大約每日16:00更新。
註:「/」以百分號編碼後就是「%2F」

範例