2025年8月30日 星期六

Python 學習筆記 : 股票爬蟲-外資投信自營商買賣超彙總表

本篇是閱讀劉承彥老師寫的 "Python股票演算法交易實務 147 個關鍵技巧詳解" (第二版, 博碩 2021) 第二章技巧 35 的實測紀錄. 

本系列爬蟲測試筆記索引參考 :


證交所的三大法人買賣超資訊查詢網址如下 : 


在上方選擇資料年月, 輸入股票代號按 "查詢" 就會顯示該日的買賣超資訊 :












利用瀏覽器的開發者工具分析, 此網頁是透過下列網址從後端伺服器取得資料的 :

# https://www.twse.com.tw/fund/TWT38?response=json&date=20250829  (外資)
# https://www.twse.com.tw/fund/TWT43?response=json&date=20250829  (自營商)
# https://www.twse.com.tw/fund/TWT44?response=json&date=20250829  (投信)

以下測試直接拿之前的程式模組修改. 


1. 外資 (含陸資) 買賣超 : 

# twse_foreign_investors_net.py
import requests
import json
from fake_useragent import UserAgent

def get_foreign_investors_net(date):
    url=f'https://www.twse.com.tw/fund/TWT38U?response=json&date={date}'
    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) :')
    result=get_foreign_investors_net(date)
    if result:
        print(result['title'])
        print(result['fields'])
        print(result['data'])
    else:
        print('爬取網頁失敗')

執行結果如下 :

>>> %Run twse_foreign_investors_net.py   
請輸入日期 (格式 YYYYMMDD) :20250829
114年08月29日 外資及陸資買賣超彙總表
['', '證券代號', '證券名稱', '買進股數', '賣出股數', '買賣超股數', '買進股數', '賣出股數', '買賣超股數', '買進股數', '賣出股數', '買賣超股數']
[[' ', '2498  ', '宏達電          ', '39,427,844', '23,639,820', '15,788,024', '0', '0', '0', '39,427,844', '23,639,820', '15,788,024'], [' ', '00637L', '元大滬深300正2  ', '12,332,000', '650,000', '11,682,000', '0', '0', '0', '12,332,000', '650,000', '11,682,000'], ['*', '3711  ', '日月光投控      ', '15,110,172', '6,926,772', '8,183,400', '0', '0', '0', '15,110,172', '6,926,772', '8,183,400'], [' ', '00715L', '期街口布蘭特正2 ', '7,567,000', '6,000', '7,561,000', '0', '0', '0', '7,567,000', '6,000', '7,561,000'], [' ', '2313  ', 

... (略) ...

 '4439  ', '冠星-KY         ', '2,000', '2,000', '0', '0', '0', '0', '2,000', '2,000', '0'], [' ', '4440  ', '宜新實業        ', '6,000', '6,000', '0', '0', '0', '0', '6,000', '6,000', '0'], [' ', '4552  ', '力達-KY         ', '3,000', '3,000', '0', '0', '0', '0', '3,000', '3,000', '0'], [' ', '5519  ', '隆大            ', '38,000', '38,000', '0', '0', '0', '0', '38,000', '38,000', '0'], [' ', '6201  ', '亞弘電          ', '4,000', '4,000', '0', '0', '0', '0', '4,000', '4,000', '0'], [' ', '6431  ', '光麗-KY         ', '7,000', '7,000', '0', '0', '0', '0', '7,000', '7,000', '0'], [' ', '6796  ', '晉弘            ', '2,000', '2,000', '0', '0', '0', '0', '2,000', '2,000', '0'], [' ', '8162  ', '微矽電子-創     ', '1,000', '1,000', '0', '0', '0', '0', '1,000', '1,000', '0'], [' ', '8481  ', '政伸            ', '3,000', '3,000', '0', '0', '0', '0', '3,000', '3,000', '0']]


2. 自營商買賣超 : 

# twse_securities_firms_net.py
import requests
import json
from fake_useragent import UserAgent

def get_securities_firms_net(date):
    url=f'https://www.twse.com.tw/fund/TWT43U?response=json&date={date}'
    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) :')
    result=get_securities_firms_net(date)
    if result:
        print(result['title'])
        print(result['fields'])
        print(result['data'])
    else:
        print('爬取網頁失敗')

執行結果如下 :

>>> %Run twse_securities_firms_net.py   
請輸入日期 (格式 YYYYMMDD) :20250829
114年08月29日 自營商買賣超彙總表
['證券代號', '證券名稱', '買進股數', '賣出股數', '買賣超股數', '買進股數', '賣出股數', '買賣超股數', '買進股數', '賣出股數', '買賣超股數']

[['00715L', '期街口布蘭特正2 ', '0', '0', '0', '38,820,696', '2,386,000', '36,434,696', '38,820,696', '2,386,000', '36,434,696'], ['00929 ', '復華台灣科技優息', '0', '0', '0', '24,872,879', '3,288,079', '21,584,800', '24,872,879', '3,288,079', '21,584,800'], ['00637L', '元大滬深300正2  ', '689,000', '111,000', '578,000', '32,045,075', '19,554,850', '12,490,225', '32,734,075', '19,665,850', '13,068,225'], ['00940 ', '元大台灣價值高息', '0', '0', '0', '15,534,064', '2,826,000', '12,708,064', '15,534,064', '2,826,000', '12,708,064'], ['00946 ', '群益科技高息成長', '0', '0', '0', '10,821,420', '2,483,000', '8,338,420', '10,821,420', '2,483,000', '8,338,420'], ['00934 ', '中信成長高股息  ', '0', '0', '0', '8,554,790', '451,000', '8,103,790', '8,554,790', '451,000', '8,103,790'], ['009800', '中信NASDAQ      ', '0', '0', '0', '6,017,317', '1,236,303', '4,781,014', '6,017,317', '1,236,303', '4,781,014'], ['071741', '穎崴統一52購01  ', '0', '0', '0', '5,318,000', '1,085,000', '4,233,000', '5,318,000', '1,085,000', '4,233,000'], ['00882 ', '中信中國高股息  ', '0', '0', '0', '6,273,583', '2,281,750', '3,991,833', '6,273,583', '2,281,750', '3,991,833'], ['00830 ', '國泰費城半導體  ', '0', '0', '0', '4,085,451', '234,000', '3,851,451', '4,085,451', '234,000', '3,851,451'], ['00665L', '富邦恒生國企正2 ', '0', '0', '0', '11,302,953', '7,649,228', '3,653,725', '11,302,953', '7,649,228', '3,653,725'], ['00885 ', '富邦越南        ', '0', '0', '0', '4,838,103', '1,382,030', '3,456,073', '4,838,103', '1,382,030', '3,456,073'], ['2498  ', '宏達電          ', '2,642,049', '1,131,503', '1,510,546', '2,510,363', '569,259', '1,941,104', '5,152,412', '1,700,762', '3,451,650'], 

... (略) ...

['089535', '世芯永豐53購06  ', '0', '0', '0', '68,000', '68,000', '0', '68,000', '68,000', '0'], ['089601', '台積電凱基51購29', '0', '0', '0', '2,000', '2,000', '0', '2,000', '2,000', '0'], ['089605', '京元電凱基53購02', '0', '0', '0', '1,000', '1,000', '0', '1,000', '1,000', '0'], ['089748', '鴻海群益53購09  ', '0', '0', '0', '20,000', '20,000', '0', '20,000', '20,000', '0'], ['089828', 'AES元大51購09   ', '0', '0', '0', '196,000', '196,000', '0', '196,000', '196,000', '0'], ['089853', 'T50正2中信54購04', '0', '0', '0', '8,000', '8,000', '0', '8,000', '8,000', '0'], ['089938', '新日興永豐53購03', '0', '0', '0', '6,000', '6,000', '0', '6,000', '6,000', '0'], ['1525  ', '江申            ', '0', '0', '0', '3,000', '3,000', '0', '3,000', '3,000', '0'], ['2305  ', '全友            ', '1,000', '1,000', '0', '0', '0', '0', '1,000', '1,000', '0'], ['2722  ', '夏都            ', '1,000', '1,000', '0', '0', '0', '0', '1,000', '1,000', '0'], ['6671  ', '三能-KY         ', '0', '0', '0', '5,000', '5,000', '0', '5,000', '5,000', '0'], ['7631  ', '聚賢研發-創     ', '0', '0', '0', '9,000', '9,000', '0', '9,000', '9,000', '0']]


3. 投信買賣超 : 

# twse_investment_trusts_net.py
import requests
import json
from fake_useragent import UserAgent

def get_investment_trusts_net(date):
    url=f'https://www.twse.com.tw/fund/TWT44U?response=json&date={date}'
    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) :')
    result=get_investment_trusts_net(date)
    if result:
        print(result['title'])
        print(result['fields'])
        print(result['data'])
    else:
        print('爬取網頁失敗')

執行結果如下 :

>>> %Run twse_investment_trusts_net.py   
請輸入日期 (格式 YYYYMMDD) :20250829
114年08月29日 投信買賣超彙總表
['', '證券代號', '證券名稱', '買進股數', '賣出股數', '買賣超股數']
[[' ', '2892  ', '第一金          ', '9,903,000', '872,000', '9,031,000'], [' ', '3045  ', '台灣大          ', '3,464,000', '25,000', '3,439,000'], [' ', '00981A', '主動統一台股增長', '3,400,000', '0', '3,400,000'], [' ', '4904  ', '遠傳            ', '2,998,000', '26,000', '2,972,000'], [' ', '4958  ', '臻鼎-KY         ', '2,324,000', '12,000', '2,312,000'], [' ', '3706  ', '神達            ', '2,517,000', '219,000', '2,298,000'], [' ', '9904  ', '寶成            ', '2,158,000', '334,000', '1,824,000'], [' ', '2301  ', '光寶科          ', '2,043,000', '392,000', '1,651,000'], [' ', '2618  ', '長榮航          ', '1,398,000', '243,000', '1,155,000'], [' ', '2360  ', '致茂            ', '1,156,000', '6,000', '1,150,000'], [' ', '2912  ', '統一超          ', '1,118,000', '8,000', '1,110,000'], [' ', '2324  ', '仁寶            ', '1,895,000', '981,000', '914,000'], [' ', '3665  ', '貿聯-KY         ', '856,000', '2,000', '854,000'], [' ', '8028  ', '昇陽半導體      ', '757,000', '2,000', '755,000'], [' ', '2887  ', '台新金          ', '2,775,000', '2,041,000', '734,000'], [' ', '2368  ', '金像電          ', '772,000', '83,000', '689,000'], [' ', '00713 ', '元大台灣高息低波', '450,000', '0', '450,000'], [' ', '2915  ', '潤泰全          ', '447,000', '10,000', '437,000'], [' ', '2883  ', '凱基金          ', '1,664,000', '1,228,000', '436,000'], [' ', '2455  ', '全新            ', '407,000', '3,000', '404,000'], [' ', '5234  ', '達興材料        ', '400,000', '1,000', '399,000'], [' ', '1101  ', '台泥            ', '383,000', '61,000', '322,000'], [' ', '8046  ', '南電            ', '322,000', '14,000', '308,000'], [' ', '1536  ', '和大            ', '269,000', '3,000', '266,000'], [' ', '3376  ', '新日興          ', '253,000', '3,000', '250,000'], [' ', '6515  ', '穎崴            ', '218,000', '5,000', '213,000'], [' ', '2376  ', '技嘉            ', '209,000', '4,000', '205,000'], [' ', '2607  ', '榮運            ', '197,000', '9,000', '188,000'], [' ', '1210  ', '大成            ', '199,000', '43,000', '156,000'], [' ', '00708L', '期元大S&P黃金正2', '150,000', '0', '150,000'], [' ', '4164  ', '承業醫          ', '150,000', '0', '150,000'], [' ', '2504  ', '國產            ', '228,000', '95,757', '132,243'], [' ', '2357  ', '華碩            ', '281,000', '149,211', '131,789'], [' ', '2610  ', '華航            ', '175,000', '47,000', '128,000'], [' ', '2006  ', '東和鋼鐵        ', '135,000', '13,000', '122,000'], [' ', '3034  ', '聯詠            ', '249,000', '128,489', '120,511'], [' ', '1326  ', '台化            ', '136,000', '19,000', '117,000'], [' ', '6176  ', '瑞儀            ', '162,000', '45,879', '116,121'], [' ', '2890  ', 

... (略) ...

 [' ', '4583  ', '台灣精銳        ', '0', '1,000', '-1,000'], [' ', '5222  ', '全訊            ', '0', '1,000', '-1,000'], [' ', '5243  ', '乙盛-KY         ', '0', '1,000', '-1,000'], [' ', '5284  ', 'jpp-KY          ', '0', '1,000', '-1,000'], [' ', '5469  ', '瀚宇博          ', '0', '1,000', '-1,000'], [' ', '6449  ', '鈺邦            ', '0', '1,000', '-1,000'], [' ', '6806  ', '森崴能源        ', '0', '1,000', '-1,000'], [' ', '7722  ', 'LINEPAY         ', '0', '1,000', '-1,000'], [' ', '8021  ', '尖點            ', '0', '1,000', '-1,000'], [' ', '8114  ', '振樺電          ', '0', '1,000', '-1,000'], [' ', '9802  ', '鈺齊-KY         ', '0', '1,000', '-1,000'], [' ', '9907  ', '統一實          ', '0', '1,000', '-1,000'], [' ', '9945  ', '潤泰新          ', '0', '1,000', '-1,000'], [' ', '9924  ', '福興            ', '0', '557', '-557'], [' ', '4720  ', '德淵            ', '0', '512', '-512'], [' ', '3038  ', '全台            ', '0', '489', '-489'], [' ', '2527  ', '宏璟            ', '0', '330', '-330'], [' ', '1558  ', '伸興            ', '0', '196', '-196'], [' ', '6754  ', '匯僑設計        ', '0', '71', '-71'], [' ', '1717  ', '長興            ', '6,000', '6,000', '0'], [' ', '2344  ', '華邦電          ', '35,000', '35,000', '0']]

以上有三個程式要分別執行, 也可以整合成一個程式去抓, 但需要用到迴圈. 

沒有留言 :