2025年8月30日 星期六

Python 學習筆記 : 股票爬蟲-融資融券彙總資訊

本篇是閱讀劉承彥老師寫的 "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('爬取網頁失敗')

執行結果與上面相同. 

沒有留言 :