臺灣證券市場最大的特色,就是籌碼資訊相當透明,包含法人進出、大戶持股、資券變化,甚至是券商分點買賣資料都是公開的,如果不好好利用這些數據,實在可惜。今天我們將介紹另一個經常被參考的籌碼面數據:集保戶股權分散表。
在過去尚未電子化的年代,股票是像紙一樣看得見的實體資產。而為降低發行成本、提升市場作業效率及環保概念,推行有價證券無實體化後,於是出現「集保」這個名詞。集保就是將股票持有人的股票,經由證券商轉存至集中保管公司,由電腦統一保管以降低不必要的手續和風險。因為過去股票是一張張像紙的實體資產,所以才會聽到一種說法是,當公司經營不善導致下市,股票就變成「壁紙」了。
集保結算所會在每週最後一個營業日結束後,會公布最新的集保戶股權分散表。以台積電 (2330) 在 2022 年 7 月 1 日的集保分佈狀況為例:
Source:臺灣集中保管結算所
集保戶股權分散表將股東持股分級從 1 張以下(1-999 股)至 1,000 張以上 (1,000,0001 股以上) 共分成 15 個持股分級。從集保戶股權分散表呈現的股權分布狀況,我們可以觀察出某檔股票的大戶與散戶持股比例。
定義一檔股票的 大戶 與 散戶,不能單純看持有張數,還需要考量股價高低。市場上比較常見的做法,是當股價大於 50 元時,持股超過 400 張為大戶;當股價小於 50 元,則持股 1000 張以上才是大戶。
一家公司發行的股票總數是固定的,當大戶持股的比例不斷攀升,就代表散戶持股的比例不斷下降,當籌碼愈集中在大戶手裡,股票就愈容易上漲。然而,一般散戶對股價的影響力很小,如果散戶持股比例愈來愈高,股價就不容易上漲。下圖是 2022 年初至 9 月 16 日的台積電(2330)股價與大戶持股比例對照,我們可以發現股價走勢與大戶持股比例變化亦步亦趨。
Source:臺灣證券交易所、臺灣集中保管結算所
台積電是非常典型籌碼高度集中的個股,而大戶在市場上買賣股票,對於股票漲跌有「喊水結凍」的影響力。當大戶持股比例增加,通常代表大股東看好公司後市發展,股票就容易獲得市場正面評價,使得股價上漲;當大戶持股比例降低,可能表示大股東不看好公司未來發展或存在風險,因此導致市場產生疑慮,使得股價下跌。
在集保所網站的 集保戶股權分散表 頁面可以查詢個股的集保戶股權分散表。
首頁 > 資料查詢/統計 > 股務查詢 > 統計資訊 > 集保戶股權分散表
在「集保戶股權分散表」頁面選擇「資料日期」、「證券代號」或「證券名稱」之後,按下「查詢」後,就會列出該股票的股權分散表。
集保結算所提供單一個股近一年的股權分散資料,如果要查詢多檔證券,可以從以下網址下載 CSV 檔案,取得所有證券的股權分散資料:
https://smart.tdcc.com.tw/opendata/getOD.ashx?id=1-5
集保結算所每週最後一個營業日營業結束後會更新這份所有證券股權分散資料的 CSV 檔案,但是這份檔案只保留當週資訊。所果要查詢過去的歷史資料,需要每週自行下載檔案將資料保留下來,或者倚賴查詢第三方網站,例如 神秘金字塔。
我們新增一個 TdccScraperService
表示從臺灣集中保管結算所取得資料的服務。打開終端機,使用 Nest CLI 建立 TdccScraperService
:
$ nest g service scraper/tdcc-scraper --flat --no-spec
Nest CLI 會在 src/scraper
目錄下建立 tdcc-scraper.service.ts
檔案,並且將 TdccScraperService
加入至 ScraperModule
的 providers
設定。
開啟 src/scraper/tdcc-scraper.service.ts
檔案,在 TdccScraperService
實作 fetchEquitiesHolders()
方法,取得最新的集保戶股權分散表:
import * as _ from 'lodash';
import * as numeral from 'numeral';
import * as csvtojson from 'csvtojson';
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
@Injectable()
export class TdccScraperService {
constructor(private httpService: HttpService) {}
async fetchEquitiesHolders() {
const url = 'https://smart.tdcc.com.tw/opendata/getOD.ashx?id=1-5';
// 取得回應資料
const responseData = await firstValueFrom(this.httpService.post(url))
.then(response => csvtojson({ noheader: true, output: 'csv' }).fromString(response.data));
// 若無資料則回傳 null
const [ fields, ...rows ] = responseData;
if (fields[0] !== '資料日期') return null;
// 整理股權分散數據
const distributions = rows.map(row => {
const [ date, symbol, level, holders, shares, proportion ] = row;
return {
date,
symbol,
level: numeral(level).value(),
holders: numeral(holders).value(),
shares: numeral(shares).value(),
proportion: numeral(proportion).value(),
};
});
// 按證券代碼分組後再處理資料格式
const data = _(distributions)
.groupBy('symbol')
.map((rows: any[]) => {
const { date, symbol } = rows[0];
const data = rows.map(row => _.omit(row, ['date', 'symbol']));
return { date, symbol, data };
})
.value();
return data;
}
}
在 fetchEquitiesHolders()
方法會以陣列形式回傳每檔股票的股權分散資料,每個陣列元素的物件包含以下內容:
date
:日期symbol
:股票代號data
:陣列型態,代表集保戶股權分散資料,每個元素物件包含以下欄位:
level
:持股數分級,需要注意 16
表示「差異數調整」;17
表示「合計」holders
:股東人數shares
:持股股數proportion
:占集保庫存數比例 (%)完成後,我們只要呼叫 TdccScraperService
的 fetchEquitiesHolders()
方法,就可以取得最新的集保戶股權分散表:
[
{
date: 20220916,
symbol: '1101',
data: [
{
level: 1,
holders: 115103,
shares: 24558493,
proportion: 0.36
},
{
level: 2,
holders: 218151,
shares: 456407295,
proportion: 6.77
},
{
level: 3,
holders: 47963,
shares: 328427748,
proportion: 4.87
},
{
level: 4,
holders: 21517,
shares: 255928965,
proportion: 3.79
},
{
level: 5,
holders: 7680,
shares: 132639941,
proportion: 1.96
},
{
level: 6,
holders: 8803,
shares: 210808317,
proportion: 3.12
},
{
level: 7,
holders: 3731,
shares: 128375673,
proportion: 1.9
},
{
level: 8,
holders: 2019,
shares: 90485163,
proportion: 1.34
},
{
level: 9,
holders: 3520,
shares: 238533456,
proportion: 3.54
},
{
level: 10,
holders: 1539,
shares: 206938241,
proportion: 3.07
},
{
level: 11,
holders: 651,
shares: 179721432,
proportion: 2.66
},
{
level: 12,
holders: 208,
shares: 101893198,
proportion: 1.51
},
{
level: 13,
holders: 103,
shares: 71336550,
proportion: 1.05
},
{
level: 14,
holders: 66,
shares: 58968770,
proportion: 0.87
},
{
level: 15,
holders: 404,
shares: 4251158500,
proportion: 63.1
},
{
level: 16,
holders: 0,
shares: 0,
proportion: 0
},
{
level: 17,
holders: 431458,
shares: 6736181742,
proportion: 100
}
]
},
... 3167 more items
]
本系列文已正式出版為《Node.js 量化投資全攻略:從資料收集到自動化交易系統建構實戰》。本書新增了全新內容和實用範例,為你提供更深入的學習體驗!歡迎參考選購,開始你的量化投資之旅!
天瓏網路書店連結:https://www.tenlong.com.tw/products/9786263336070