本篇是閱讀劉承彥老師寫的 "Python股票演算法交易實務 147 個關鍵技巧詳解" (第二版, 博碩 2021) 第二章技巧 33, 關於抓取融資融券交易資訊的實測紀錄.
證交所的融資融券彙總資訊查詢網址如下 :
在上方選擇資料年月日 (非交易日無資料), 輸入信用交易統計分類群組代碼後, 按 "查詢" 就會顯示該群組的融資融券資訊 :
利用瀏覽器的開發者工具分析, 此網頁是透過下列網址從後端伺服器取得資料的 :
# https://www.twse.com.tw/exchangeReport/MI_MARGN?response=json&date=20250801&selectType=15
此處 selectType 就是分類群組代號, 全部代碼如下表 :
| 群組代碼 | 說明 | 群組代碼 | 說明 |
|---|---|---|---|
| 01 | 水泥工業 | 02 | 食品工業 |
| 03 | 塑膠工業 | 04 | 紡織纖維 |
| 05 | 電機機械 | 06 | 電器電纜 |
| 08 | 玻璃陶瓷 | 09 | 造紙工業 |
| 10 | 鋼鐵工業 | 11 | 橡膠工業 |
| 12 | 汽車工業 | 13 | 電子工業 |
| 14 | 建材營造業 | 15 | 航運業 |
| 16 | 觀光餐旅 | 17 | 金融保險業 |
| 18 | 貿易百貨業 | 19 | 綜合 |
| 20 | 其他業 | 21 | 化學工業 |
| 22 | 生技醫療業 | 23 | 油電燃氣業 |
| 24 | 半導體業 | 25 | 電腦及週邊設備業 |
| 26 | 光電業 | 27 | 通信網路業 |
| 28 | 電子零組件業 | 29 | 電子通路業 |
| 30 | 資訊服務業 | 31 | 其他電子業 |
| 32 | 文化創意業 | 33 | 農業科技業 |
| 34 | 電子商務 | 35 | 綠能環保 |
| 36 | 數位雲端 | 37 | 運動休閒 |
| 38 | 居家生活 |
可以將此代碼表寫成字典, 如果想輸入群組名稱查找代碼的話就用得上 :
twse_stock_groups={
"水泥工業": "01",
"食品工業": "02",
"塑膠工業": "03",
"紡織纖維": "04",
"電機機械": "05",
"電器電纜": "06",
"玻璃陶瓷": "08",
"造紙工業": "09",
"鋼鐵工業": "10",
"橡膠工業": "11",
"汽車工業": "12",
"電子工業": "13",
"建材營造業": "14",
"航運業": "15",
"觀光餐旅": "16",
"金融保險業": "17",
"貿易百貨業": "18",
"綜合": "19",
"其他業": "20",
"化學工業": "21",
"生技醫療業": "22",
"油電燃氣業": "23",
"半導體業": "24",
"電腦及週邊設備業": "25",
"光電業": "26",
"通信網路業": "27",
"電子零組件業": "28",
"電子通路業": "29",
"資訊服務業": "30",
"其他電子業": "31",
"文化創意業": "32",
"農業科技業": "33",
"電子商務": "34",
"綠能環保": "35",
"數位雲端": "36",
"運動休閒": "37",
"居家生活": "38"
}
首先匯入套件 :
>>> import requests, json
定義日期與群組代碼變數 :
>>> date='20250801'
>>> group='15' # 航運業
將這兩個參數傳入資料取得網址的 f 字串中 :
>>> url=f'https://www.twse.com.tw/exchangeReport/MI_MARGN?response=json&date={date}&selectType={group}'
>>> url
'https://www.twse.com.tw/exchangeReport/MI_MARGN?response=json&date=20250801&selectType=15'
用 requests.get() 爬取資料 :
>>> res=requests.get(url)
>>> dic_obj=json.loads(res.text)
匯入 rich 套件的 print() 以結構化形式顯示字典內容 :
>>> from rich import print as pprint
>>> pprint(dic_obj)
{
'stat': 'OK',
'date': '20250801',
'tables': [
{},
{
'title': '114年08月01日 融資融券彙總 (航運業)',
'fields': [
'代號',
'名稱',
'買進',
'賣出',
'現金償還',
'前日餘額',
'今日餘額',
'次一營業日限額',
'買進',
'賣出',
'現券償還',
'前日餘額',
'今日餘額',
'次一營業日限額',
'資券互抵',
'註記'
],
'data': [
[
'\u3000',
'合計',
'4,535',
'4,189',
'130',
'256,266',
'256,482',
'8,357,094',
'365',
'754',
'82',
'7,557',
'7,864',
'8,357,094',
'22',
'\u3000'
],
[
'2208',
'台船',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'OX '
],
[
'2603',
'長榮',
'193',
'220',
'22',
'17,494',
'17,445',
'541,260',
'47',
'27',
'40',
'731',
'671',
'541,260',
'0',
' '
],
[
'2605',
'新興',
'89',
'133',
'10',
'11,575',
'11,521',
'146,338',
'5',
'9',
'0',
'104',
'108',
'146,338',
'0',
' '
],
[
'2606',
'裕民',
'226',
'176',
'2',
'6,585',
'6,633',
'211,263',
'20',
'0',
'0',
'214',
'194',
'211,263',
'1',
' '
],
[
'2607',
'榮運',
'73',
'147',
'1',
'3,087',
'3,012',
'266,785',
'0',
'1',
'0',
'1',
'2',
'266,785',
'2',
' '
],
[
'2608',
'嘉里大榮',
'2',
'0',
'0',
'943',
'945',
'116,750',
'0',
'0',
'0',
'0',
'0',
'116,750',
'0',
' '
],
[
'2609',
'陽明',
'490',
'402',
'61',
'35,166',
'35,193',
'873,026',
'56',
'93',
'0',
'1,822',
'1,859',
'873,026',
'1',
' '
],
[
'2610',
'華航',
'265',
'121',
'12',
'46,675',
'46,807',
'1,520,980',
'4',
'13',
'0',
'295',
'304',
'1,520,980',
'0',
' '
],
[
'2611',
'志信',
'3',
'3',
'0',
'3,320',
'3,320',
'47,250',
'4',
'1',
'0',
'10',
'7',
'47,250',
'1',
' '
],
[
'2612',
'中航',
'209',
'200',
'0',
'1,848',
'1,857',
'49,371',
'3',
'2',
'0',
'40',
'39',
'49,371',
'4',
' '
],
[
'2613',
'中櫃',
'10',
'89',
'0',
'3,202',
'3,123',
'37,105',
'0',
'0',
'0',
'13',
'13',
'37,105',
'1',
' '
],
[
'2615',
'萬海',
'363',
'630',
'6',
'16,297',
'16,024',
'701,536',
'163',
'406',
'42',
'2,124',
'2,325',
'701,536',
'1',
' '
],
[
'2617',
'台航',
'7',
'2',
'0',
'2,127',
'2,132',
'104,323',
'1',
'0',
'0',
'2',
'1',
'104,323',
'0',
' '
],
[
'2618',
'長榮航',
'699',
'312',
'4',
'49,024',
'49,407',
'1,350,111',
'8',
'49',
'0',
'262',
'303',
'1,350,111',
'1',
' '
],
[
'2630',
'亞航',
'0',
'0',
'0',
'0',
'0',
'52,359',
'0',
'0',
'0',
'0',
'0',
'52,359',
'0',
' '
],
[
'2633',
'台灣高鐵',
'0',
'3',
'0',
'2,521',
'2,518',
'657,073',
'1',
'0',
'0',
'3',
'2',
'657,073',
'0',
' '
],
[
'2634',
'漢翔',
'403',
'549',
'6',
'19,989',
'19,837',
'235,466',
'20',
'79',
'0',
'694',
'753',
'235,466',
'1',
' '
],
[
'2636',
'台驊控股',
'1',
'7',
'0',
'1,040',
'1,034',
'35,458',
'0',
'0',
'0',
'4',
'4',
'35,458',
'0',
' '
],
[
'2637',
'慧洋-KY',
'201',
'349',
'0',
'11,443',
'11,295',
'186,602',
'25',
'9',
'0',
'373',
'357',
'186,602',
'3',
' '
],
[
'2642',
'宅配通',
'6',
'0',
'0',
'433',
'439',
'23,866',
'0',
'0',
'0',
'5',
'5',
'23,866',
'0',
' '
],
[
'2645',
'長榮航太',
'874',
'560',
'4',
'1,558',
'1,868',
'93,642',
'1',
'31',
'0',
'15',
'45',
'93,642',
'1',
' '
],
[
'2646',
'星宇航空',
'36',
'20',
'0',
'1,930',
'1,946',
'752,183',
'0',
'0',
'0',
'7',
'7',
'752,183',
'0',
' '
],
[
'5607',
'遠雄港',
'44',
'10',
'0',
'1,886',
'1,920',
'90,821',
'0',
'0',
'0',
'3',
'3',
'90,821',
'0',
' '
],
[
'5608',
'四維航',
'118',
'82',
'2',
'8,611',
'8,645',
'97,317',
'3',
'4',
'0',
'39',
'40',
'97,317',
'5',
' '
],
[
'6753',
'龍德造船',
'26',
'15',
'0',
'2,199',
'2,210',
'28,284',
'1',
'0',
'0',
'9',
'8',
'28,284',
'0',
' '
],
[
'6757',
'台灣虎航',
'196',
'159',
'0',
'7,190',
'7,227',
'114,882',
'3',
'30',
'0',
'787',
'814',
'114,882',
'0',
' '
],
[
'8367',
'建新國際',
'1',
'0',
'0',
'123',
'124',
'23,043',
'0',
'0',
'0',
'0',
'0',
'23,043',
'0',
' '
]
],
'notes': [
'備註欄係表明成交日次一營業日股票融資融券狀況',
'符號說明: O:停止融資, X:停止融券, @:融資分配, %:融券分配,
!:停止買賣 ',
'限額:<br>\u3000融資餘額達該種股票上市股份
25%時,暫停融資買進。融券餘額達該種股票上市股份25%時,暫停融券賣出。',
'融資、融券餘額達限額之八成時,次一營業日進行額度分配。',
"當日如有臨時新增之變更交易有價證券標的,網頁右
上角會呈現點選框,屆時請點選明細查詢,另外,歷史資料也可點選此 <a
href='/zh/trading/bfihbu.html' target='_blank'>連結</a>
查詢。當日臨時新增之變更交易有價證券,若該證券原得為融資融券交易,將被暫停融資
券。"
],
'groups': [
{'title': '股票', 'span': 2},
{'title': '融資', 'span': 6},
{'title': '融券', 'span': 6},
{'title': '', 'span': 1},
{'title': '', 'span': 1}
]
}
]
}
可見資料放在字典的 tables 屬性 (串列) 的元素 [1] :
>>> data=dic_obj['tables'][1]
>>> data['title']
'114年08月01日 融資融券彙總 (航運業)'
>>> data['fields']
['代號', '名稱', '買進', '賣出', '現金償還', '前日餘額', '今日餘額', '次一營業日限額', '買進', '賣出', '現券償還', '前日餘額', '今日餘額', '次一營業日限額', '資券互抵', '註記']
>>> data['data']
[['\u3000', '合計', '4,535', '4,189', '130', '256,266', '256,482', '8,357,094', '365', '754', '82', '7,557', '7,864', '8,357,094', '22', '\u3000'], ['2208', '台船', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'OX '], ['2603', '長榮', '193', '220', '22', '17,494', '17,445', '541,260', '47', '27', '40', '731', '671', '541,260', '0', ' '], ['2605', '新興', '89', '133', '10', '11,575', '11,521', '146,338', '5', '9', '0', '104', '108', '146,338', '0', ' '], ['2606', '裕民', '226', '176', '2', '6,585', '6,633', '211,263', '20', '0', '0', '214', '194', '211,263', '1', ' '], ['2607', '榮運', '73', '147', '1', '3,087', '3,012', '266,785', '0', '1', '0', '1', '2', '266,785', '2', ' '], ['2608', '嘉里大榮', '2', '0', '0', '943', '945', '116,750', '0', '0', '0', '0', '0', '116,750', '0', ' '], ['2609', '陽明', '490', '402', '61', '35,166', '35,193', '873,026', '56', '93', '0', '1,822', '1,859', '873,026', '1', ' '], ['2610', '華航', '265', '121', '12', '46,675', '46,807', '1,520,980', '4', '13', '0', '295', '304', '1,520,980', '0', ' '], ['2611', '志信', '3', '3', '0', '3,320', '3,320', '47,250', '4', '1', '0', '10', '7', '47,250', '1', ' '], ['2612', '中航', '209', '200', '0', '1,848', '1,857', '49,371', '3', '2', '0', '40', '39', '49,371', '4', ' '], ['2613', '中櫃', '10', '89', '0', '3,202', '3,123', '37,105', '0', '0', '0', '13', '13', '37,105', '1', ' '], ['2615', '萬海', '363', '630', '6', '16,297', '16,024', '701,536', '163', '406', '42', '2,124', '2,325', '701,536', '1', ' '], ['2617', '台航', '7', '2', '0', '2,127', '2,132', '104,323', '1', '0', '0', '2', '1', '104,323', '0', ' '], ['2618', '長榮航', '699', '312', '4', '49,024', '49,407', '1,350,111', '8', '49', '0', '262', '303', '1,350,111', '1', ' '], ['2630', '亞航', '0', '0', '0', '0', '0', '52,359', '0', '0', '0', '0', '0', '52,359', '0', ' '], ['2633', '台灣高鐵', '0', '3', '0', '2,521', '2,518', '657,073', '1', '0', '0', '3', '2', '657,073', '0', ' '], ['2634', '漢翔', '403', '549', '6', '19,989', '19,837', '235,466', '20', '79', '0', '694', '753', '235,466', '1', ' '], ['2636', '台驊控股', '1', '7', '0', '1,040', '1,034', '35,458', '0', '0', '0', '4', '4', '35,458', '0', ' '], ['2637', '慧洋-KY', '201', '349', '0', '11,443', '11,295', '186,602', '25', '9', '0', '373', '357', '186,602', '3', ' '], ['2642', '宅配通', '6', '0', '0', '433', '439', '23,866', '0', '0', '0', '5', '5', '23,866', '0', ' '], ['2645', '長榮航太', '874', '560', '4', '1,558', '1,868', '93,642', '1', '31', '0', '15', '45', '93,642', '1', ' '], ['2646', '星宇航空', '36', '20', '0', '1,930', '1,946', '752,183', '0', '0', '0', '7', '7', '752,183', '0', ' '], ['5607', '遠雄港', '44', '10', '0', '1,886', '1,920', '90,821', '0', '0', '0', '3', '3', '90,821', '0', ' '], ['5608', '四維航', '118', '82', '2', '8,611', '8,645', '97,317', '3', '4', '0', '39', '40', '97,317', '5', ' '], ['6753', '龍德造船', '26', '15', '0', '2,199', '2,210', '28,284', '1', '0', '0', '9', '8', '28,284', '0', ' '], ['6757', '台灣虎航', '196', '159', '0', '7,190', '7,227', '114,882', '3', '30', '0', '787', '814', '114,882', '0', ' '], ['8367', '建新國際', '1', '0', '0', '123', '124', '23,043', '0', '0', '0', '0', '0', '23,043', '0', ' ']]
將上面測試撰寫為如下完整爬蟲程式碼 :
# twse_margin_trading.py
import requests
import json
from fake_useragent import UserAgent
from rich import print as pprint
def get_margin_trading(date, group):
url=f'https://www.twse.com.tw/exchangeReport/MI_MARGN?response=json&date={date}&selectType={group}'
ua=UserAgent()
headers={'User-Agent': ua.random}
res=requests.get(url, headers=headers)
if res.status_code == requests.codes.ok:
data=json.loads(res.text)
return data
else:
print(f'Error: {res.status_code}, Response: {res.text}')
return False
if __name__ == '__main__':
date=input('請輸入日期 (格式 YYYYMMDD) :')
group=input('請輸入群組代碼 (01~38) :')
result=get_margin_trading(date, group)
if result:
data=result['tables'][1]
print(data['title'])
print(data['fields'])
print(data['data'])
else:
print('爬取網頁失敗')
執行結果與上面相同.


沒有留言 :
張貼留言