Python開放資料 – 證交所台股上市證券資訊與產業別下載

本程式利用台灣證交所官方資料,擷取上市證券基本資訊,包含股票代號、名稱、ISIN碼、上市日等。透過網頁爬蟲及資料處理,整理成易於分析的格式,方便進行後續股票分析作業。

要寫程式進行股票分析的時候,除了每日市場交易資訊外,每一支股票的基本資訊也很重要。在以下的Python程式碼中,我採用的是台灣證券交易所(TWSE)的本國上市證券國際證券辨識號碼一覽表,雖然網路上也有很多不錯的資料源,像是撿股讚的股本查詢,但我個人還是比較偏好官方提供的資料。

我在2021年6月14日執行的時候,共有24227筆資料,包含以下欄位:

  • 有價證券代號及名稱
  • 國際證券辨識號碼(ISIN Code)
  • 上市日
  • 市場別
  • 產業別
  • CFICode
  • 備註

來吧,複製貼上

import pandas as pd
import numpy as np
import datetime
def ymd(series):
    '''
    轉換數字轉換成日期格式,如20210614變成2021-06-14
    '''
    
    if isinstance(series, str):
        explode = False
        
        if '-' in series:
            series = series.split('-')
            explode = True
            
        if '/' in series: 
            series = series.split('/')
            explode = True
            
        if explode:            
            series = ["{:02d}".format(int(i)) for i in series]
            series = series[0] + series[1] + series[2]
            
        series = int(series)
    
        # or np.int64 == np.dtype(type(series)).type \\
    if isinstance(series, int) \\
        or isinstance(series, np.int32) \\
        or isinstance(series, np.int64) \\
        or isinstance(series, str):
            
        series = str(series)
        series = datetime.datetime(year = int(series[0:4]), 
                        month = int(series[4:6]), 
                        day = int(series[6:8]))
    
    return series
def get_tw_stock_info():
    '''
    資料來源
    本國上市證券國際證券辨識號碼一覽表
    https://isin.twse.com.tw/isin/C_public.jsp?strMode=2
      
    '''    
      
    # 有價證券代號及名稱	
    # 國際證券辨識號碼(ISIN Code)	
    # 上市日	
    # 市場別	
    # 產業別	
    # CFICode	
    # 備註    
    from bs4 import BeautifulSoup
    import requests
    import re
    
    # 本國上市證券國際證券辨識號碼一覽表
    link = '<https://isin.twse.com.tw/isin/C_public.jsp?strMode=2>'  
          
    r = requests.get(link)
    soup = BeautifulSoup(r.text, 'html.parser')
    
    
    # Parse update date
    update_date = soup.select('.h1 center')[0]
    update_date = update_date.text
    update_date = re.search('(\\d+/\\d+/\\d+)', update_date)
    update_date = update_date.group(1)
    print('get_stock_info資料源更新時間為' + update_date)
    
    
    # Parse table ......
    table = soup.select('table.h4')[0]
    rows = table.find_all('tr')
    
    
    stock_list_raw = []
    
    for i in range(0, len(rows)):
    
        cells = rows[i].find_all('td')
        single_stock = []
        
        for j in range(0, len(cells)):
            single_stock.append(cells[j].text)
            
        stock_list_raw.append(single_stock)
        
    stock_list_pre = pd.DataFrame(stock_list_raw)
    
    
    # 有價證券代號及名稱 STOCK_SYMBOL
    # 國際證券辨識號碼(ISIN Code) ISIN_CODE
    # 上市日 LISTING_DATE
    # 市場別 MARKET
    # 產業別 INDUSTRY
    # CFICode CFI_CODE
    # 備註 NOTE
    cols = ['STOCK_SYMBOL_RAW', 'ISIN_CODE', 'LISTING_DATE',
            'MARKET', 'INDUSTRY', 'CFI_CODE', 'NOTE']
    
    stock_list_pre.columns = cols
    
    stock_list_pre = stock_list_pre.iloc[1:, :]
    stock_list_pre = stock_list_pre[~stock_list_pre['CFI_CODE'].isna()]
    stock_list_pre['ID'] = stock_list_pre.index
    
    
    # 將股票代號和名稱拆開 ......
    stock_symbol = stock_list_pre['STOCK_SYMBOL_RAW'] \\
        .str.split(' ', expand=True)
        
    stock_symbol.columns = ['STOCK_SYMBOL', 'STOCK_NAME']
    stock_symbol['ID'] = stock_symbol.index
    
    # 整理資料 ......
    stock_info = stock_list_pre.merge(stock_symbol, on='ID')
    stock_info['LISTING_DATE'].apply(ymd)
    stock_info = stock_info[['STOCK_SYMBOL', 'STOCK_NAME',
                             'ISIN_CODE', 'LISTING_DATE', 
                             'MARKET', 'INDUSTRY', 'CFI_CODE']]
        
    return stock_info
# 呼叫Function
data = get_tw_stock_info()

🚀 以每年 5 美元解鎖無廣告體驗

✓ 14 天免費試用 ✓ 隨時取消

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *