[VBA] 自製 市場反指標 : 小台散戶多空比

什麼是「 小台散戶多空比 」?

※ 首先依字面來解釋 —
小台 」: 小型台指期貨,簡稱 : 小台 / 英文代碼 : MTX。( PS. 有關小台合約價值 / 保證金 / 交易成本,請參考 : 認識台指期。)
散戶 」: 是指在金融市場中以個人名義參與投資,資金規模較小,且容易受到市場波動而頻繁交易的投資個體。
多空比 」: 是金融市場的術語,用來描述市場看漲(多頭)和看跌(空頭)的投資比例。

小台散戶多空比整體解釋 :
→ 是指小型投資人針對小型台指( 多 / 空方 )進行的交易( 未平倉 )比例。

觀察「 小台 」的目的

※ 首先我們要先了解 期貨 / 選擇權 交易是屬於一種零和遊戲,意思是 : 一口期貨單要成交,必須有一個人買一口多單,另一個人買一口空單,總和變化為零。這意味著 : 有一人從期貨市場中獲利,代表有另一個人從中虧損。

※ 基於這樣的原則,在 期貨 / 選擇權 交易市場中,就會形成兩種人 : 贏家 / 輸家
[ 贏家 ] : 通常是擁有強大資源和專業知識的投資機構,如 : 外資 / 投信 / 自營商 ( 統稱 : 三大法人 )。
[ 輸家 ] : 通常是指缺乏資源和風險管理的投資個體,稱之為 : 散戶。

☆ 所以,在這樣的零和交易市場中 — 想贏,就必須 跟著贏家走 / 跟輸家對作,才是上策。

◎ 既然如此,如何才能 跟著贏家走 / 跟輸家對作 ?
[ 解答 ] : 收集 小台 (小型台指) 多空籌碼資料。

( PS. 由於小台合約價值較小( 1口大台 = 4口小台 ),容易吸引散戶採用此種低成本的投資方式,進入期貨市場。所以了解散戶(輸家)針對小台的多空佈局,就能跟著贏家(法人)的步調走,增加勝率。)

[ 溫馨提醒 ] :
☆ 期交所每日會公布三大法人交易資訊 — 提供投資人對當日期貨契約交易概況與未平倉數據之參考。
→ 期交所 / 三大法人期貨契約 查詢網址 : https://www.taifex.com.tw/cht/3/futContractsDate

☆ 觀察期貨 / 選擇權多空未平倉( OI )餘額,有助於了解市場的未來走向。

[ 參考畫面 / 小台期貨契約 ] :

計算「 小台散戶多空比 」的目的

※ 了解並計算小台散戶多空未平倉餘額比例,有助於投資人了解散戶對市場的看法,就能跟隨法人的步調投資,增加勝率。

[ 多空比 — 正值 ] : 表示散戶多方留倉口數 > 空方留倉口數,意味著 : 散戶看好市場,代表 : 法人看淡市場,未來趨勢偏空
[ 多空比 — 負值 ] : 表示散戶多方留倉口數 < 空方留倉口數,意味著 : 散戶看淡市場,代表 : 法人看好市場,未來趨勢偏多

[ 疑問 ] :
◎ 期交所網站公告的身份別,並未有「 散戶 」這欄位,那該如何得知其數據 ?
[ 解答 ] : 期交所每日會公布三大法人( 外資 / 投信 / 自營商 )交易資訊,已知期貨 / 選擇權 屬零和市場,代表與三大法人對作的對象,就是 : 散戶

「 小台散戶多空比 」計算公式

[ 計算公式 / 小台散戶多空比 ] :
小台散戶多空比

VBA實作 / 自動計算「 小台散戶多空比

※ 製作 — 自動計算小台散戶多空比的VBA程式,其操作步驟 :
[ 1 ] : 開啟EXCEL / 新增xlsm活頁簿
[ 2 ] : 新增並設定工作表
[ 3 ] : 更新每日交易數據
[ 4 ] : 記錄數據並計算小台散戶多空比
[ 5 ] : 繪製圖表並填寫相關數據

開啟EXCEL / 新增xlsm活頁簿

※ 同標題,操作步驟 :
[ 1 ] : 開啟EXCEL
[ 2 ] : 新增空白活頁簿
[ 3 ] : 另存新檔 : 設定檔案名稱 : 計算小台散戶多空比,存檔類型(副檔名)更改為 : xlsm( 啟用巨集的活頁簿)。

新增並設定工作表

※ 為了方便解說,設定多個工作表,存放上網抓取的小台交易數據。

[ 工作表 / 名稱設定 ] :

更新每日交易數據

※ 運用 Excel 內建的 QueryTable 網路資料擷取工具,爬取當日所需下載的交易數據。

◎ 當日需上網更新的交易數據 :
[ 1 ] : 三大法人小台期貨契約
[ 2 ] : 小台交易行情表
[ 3 ] : 加權股價指數

( PS. 若不清楚 QueryTable 網路資料擷取方法,請參考 : 錄製巨集(舊版) 內的錄製步驟,只需注意在URL網址輸入框內,輸入要擷取的資料網址,即可。)

三大法人小台期貨契約

※ 抓取期交所網站的 三大法人小台(MTX)期貨契約 : 資料網址 — https://www.taifex.com.tw/cht/3/futContractsDateExcel

[ 表格資料 / 三大法人小台(MTX)多空未平倉口數 ] :


[ 程式碼 / 下載 三大法人小台(MTX)期貨契約 ]
Sub 更新三大法人MTX期貨契約()
    Sheets("三大法人MTX期貨契約").Select       
        With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;https://www.taifex.com.tw/cht/3/futContractsDateExcel", Destination:=Range("$A$1"))        
        '.CommandType = 0 '要刪除 --- 不然會產生錯誤
        '.Name = "futContractsDateExcel_1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
        .Delete
    End With    
End Sub

小台交易行情表

※ 抓取期交所網站的 小台交易行情表 : 資料網址 — https://www.taifex.com.tw/cht/3/futDailyMarketExcel?commodity_id=MTX

[ 表格資料 / 小台(MTX)全市場未平倉口數 ] :


[ 程式碼 / 下載 小台(MTX)交易行情表 ]
Sub 更新MTX交易行情表()          
        Sheets("MTX交易行情表").Select
        With ActiveSheet.QueryTables.Add(Connection:= _
            "URL;https://www.taifex.com.tw/cht/3/futDailyMarketExcel?commodity_id=MTX", Destination:=Range("$A$1"))
            '.CommandType = 0
            '.Name = "futDailyMarketExcel_1"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .WebSelectionType = xlEntirePage
            .WebFormatting = xlWebFormattingNone
            .WebPreFormattedTextToColumns = True
            .WebConsecutiveDelimitersAsOne = True
            .WebSingleBlockTextImport = False
            .WebDisableDateRecognition = False
            .WebDisableRedirections = False
            .Refresh BackgroundQuery:=False
            .Delete
        End With
            
End Sub

加權股價指數

※ 抓取證交所網站的 加權股價指數 : 資料網址 — https://www.twse.com.tw/indicesReport/MI_5MINS_HIST?response=html

[ 表格資料 / 大盤(加權股價指數) ] :


[ 程式碼 / 下載 當月加權股價指數 ]
Sub 更新大盤指數()
        Sheets("大盤指數").Select
        With ActiveSheet.QueryTables.Add(Connection:= _
            "URL;https://www.twse.com.tw/indicesReport/MI_5MINS_HIST?response=html", Destination:=Range("$A$1"))
            '.CommandType = 0
            '.Name = "MI_5MINS_HIST?response=html&date=20231215"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .WebSelectionType = xlEntirePage
            .WebFormatting = xlWebFormattingNone
            .WebPreFormattedTextToColumns = True
            .WebConsecutiveDelimitersAsOne = True
            .WebSingleBlockTextImport = False
            .WebDisableDateRecognition = False
            .WebDisableRedirections = False
            .Refresh BackgroundQuery:=False
            .Delete
        End With
End Sub

記錄數據並計算小台散戶多空比

※ 本文採用視覺化(圖表繪製)的方式,讓大家能更好理解與觀察大盤趨勢,所以必須先收集 小台歷史交易數據( 全市場未平倉口數 / 三大法人多空交易數據 ) 及 大盤歷史數據。( PS. 收集歷史數據的步驟,可做可不做。)

[ 記錄數據 / 小台歷史交易數據加權指數) ] :


        [ 程式碼 / 記錄數據並計算小台散戶多空比 ] 
        Sheets("MTX歷史交易數據").Select ' 切換至"MTX歷史交易數據"工作表
        xRow = Range("A65536").End(xlUp).Offset(1, 0).Row ' 新列列號
        TXdate = Right(Sheets("MTX交易行情表").[A3], 10) ' 抓取交易日期
        
        ' 記錄數據        
        Range("A" & xRow) = TXdate ' 日期
        Range("B" & xRow) = Val(Right(Sheets("MTX交易行情表").Range("B10"), 2)) ' 合約月份
        Range("C" & xRow) = Right(WeekdayName(Weekday(TXdate)), 1)  ' 星期

        Range("D" & xRow) = Sheets("MTX交易行情表").[M65536].End(xlUp) ' 小台全市場OI (未平倉)
        totalBuy = Application.Sum(Sheets("三大法人MTX期貨契約").Range("J17:J19")) ' 三大法人多單口數
        totalSell = Application.Sum(Sheets("三大法人MTX期貨契約").Range("L17:L19")) ' 三大法人空單口數
        Range("E" & xRow) = Range("D" & xRow) - totalBuy ' 小台_散戶多單
        Range("F" & xRow) = Range("D" & xRow) - totalSell ' 小台_散戶空單
        Range("G" & xRow) = (Range("E" & xRow) - Range("F" & xRow)) / Range("D" & xRow) * 100 ' 小台散戶多空比值
        Range("H" & xRow) = Sheets("大盤指數").Range("E65536").End(xlUp) ' 大盤(加權指數)

繪製圖表並填寫相關數據

※ 記錄完散戶相關數據,便可開始繪製”小台多空比”圖表。
[ 注意 ] : 先以手動方式建立所需的展示圖表,會簡單於全程式設計。( PS. 手動插入圖表方式,請參考 : 圖表製作。)

※ 為了更好理解,同時也展示當日散戶多空相關數據,讓畫面更為豐富。


        [ 程式碼 / 繪製圖表並填寫相關數據 ]         
        ' 繪製圖表 -- 小台散戶多空比
        Sheets("小台散戶多空比_圖表總覽").Select ' 切換至"小台散戶多空比_圖表總覽"工作表
        ActiveSheet.ChartObjects("小台散戶多空比").Select  ' 選擇 : 小台散戶多空比 圖表
        ActiveChart.FullSeriesCollection("多空比").Values = "=MTX歷史交易數據!$G$3:$G$" & xRow ' 設定"多空比"數列的顯示範圍
        ActiveChart.FullSeriesCollection("加權指數").Values = "=MTX歷史交易數據!$H$3:$H$" & xRow ' 設定"加權指數"數列的顯示範圍
        ActiveChart.FullSeriesCollection("多空比").XValues = "=MTX歷史交易數據!$A$3:$A$" & xRow ' 設定"日期"水平坐標軸的顯示範圍

        ' 數據填入 -- 小台散戶多空比_圖表總覽
        [A27] = TXdate ' 日期
        [C27] = Sheets("MTX歷史交易數據").Range("G" & xRow) ' 小台散戶多空比值
        [E27] = Sheets("MTX歷史交易數據").Range("E" & xRow) ' 小台_散戶多單
        [G27] = Sheets("MTX歷史交易數據").Range("F" & xRow) ' 小台_散戶空單
        [I27] = Sheets("MTX歷史交易數據").Range("D" & xRow) ' 小台全市場OI (未平倉)
        [K27] = Sheets("MTX歷史交易數據").Range("G" & xRow) - Sheets("MTX歷史交易數據").Range("G" & xRow - 1) ' 比值增減

完整圖表

[ 圖表 / 小台散戶多空比 ] :
小台散戶多空比

[ 散戶多空比的判斷方式 ] :
正值 ( 0軸以上 ) : 表示 — 散戶做多 = 法人做空 ( 後市偏空 )。
負值 ( 0軸以下 ) : 表示 — 散戶做空 = 法人做多 ( 後市偏多 )。

[ 補充 ] :
◎「 數據更新 」按鈕的製作方式,請參考 — VBA 按鈕製作
◎ 另外,有關於EXCEL圖表上的 行列寬度 / 顏色 / 排列方式, 就不一一詳述,請自行設計。

完整程式碼


[ 程式碼 / 自動計算小台散戶多空比 ] :
Sub 計算小台散戶多空比()
Dim xRow As Integer, TXdate As String, totalBuy As Integer, totalSell As Integer
        
        Call 更新三大法人MTX期貨契約
        Call 更新MTX交易行情表
        Call 更新大盤指數
        
        Sheets("MTX歷史交易數據").Select
        xRow = Range("A65536").End(xlUp).Offset(1, 0).Row ' 新列列號
        TXdate = Right(Sheets("MTX交易行情表").[A3], 10) ' 抓取交易日期
        
        Range("A" & xRow) = TXdate '日期
        Range("B" & xRow) = Val(Right(Sheets("MTX交易行情表").Range("B10"), 2)) '合約月份
        Range("C" & xRow) = Right(WeekdayName(Weekday(TXdate)), 1)  '星期
        
        ' 記錄 -- 小台散戶多空比
        Range("D" & xRow) = Sheets("MTX交易行情表").[M65536].End(xlUp) ' 小台全市場OI (未平倉)
        totalBuy = Application.Sum(Sheets("三大法人MTX期貨契約").Range("J17:J19")) ' 三大法人多單口數
        totalSell = Application.Sum(Sheets("三大法人MTX期貨契約").Range("L17:L19")) ' 三大法人空單口數
        Range("E" & xRow) = Range("D" & xRow) - totalBuy ' 小台_散戶多單
        Range("F" & xRow) = Range("D" & xRow) - totalSell ' 小台_散戶空單
        Range("G" & xRow) = (Range("E" & xRow) - Range("F" & xRow)) / Range("D" & xRow) * 100 ' 小台散戶多空比值
        Range("H" & xRow) = Sheets("大盤指數").Range("E65536").End(xlUp) ' 大盤(加權指數)
        
        ' 數據填入 -- 小台散戶多空比_圖表總覽
        Sheets("小台散戶多空比_圖表總覽").Select
        [A27] = TXdate '日期
        [C27] = Sheets("MTX歷史交易數據").Range("G" & xRow) ' 小台散戶多空比值
        [E27] = Sheets("MTX歷史交易數據").Range("E" & xRow) ' 小台_散戶多單
        [G27] = Sheets("MTX歷史交易數據").Range("F" & xRow) ' 小台_散戶空單
        [I27] = Sheets("MTX歷史交易數據").Range("D" & xRow) ' 小台全市場OI (未平倉)
        [K27] = Sheets("MTX歷史交易數據").Range("G" & xRow) - Sheets("MTX歷史交易數據").Range("G" & xRow - 1) ' 比值增減
        
        ' 繪製圖表 -- 小台散戶多空比
        ActiveSheet.ChartObjects("小台散戶多空比").Select  ' 選擇"小台散戶多空比"圖表
        ActiveChart.FullSeriesCollection("多空比").Values = "=MTX歷史交易數據!$G$3:$G$" & xRow ' 設定"多空比"數列的顯示範圍
        ActiveChart.FullSeriesCollection("加權指數").Values = "=MTX歷史交易數據!$H$3:$H$" & xRow ' 設定"加權指數"數列的顯示範圍
        ActiveChart.FullSeriesCollection("多空比").XValues = "=MTX歷史交易數據!$A$3:$A$" & xRow ' 設定"日期"水平坐標軸的顯示範圍
        
End Sub

結論

※ 觀察小台散戶多空比指標有助於了解散戶目前在市場內的參與情況,進而推算出未來的市場趨勢走向。文中,為求快速研判多空趨勢,則運用VBA網路爬取功能,擷取期交所的小台期貨契約與交易行情表的多空部位,並加以計算/記錄多空比值,再利用圖表展現,方能一眼辨識多空。

※ 小台雖說是散戶常使用交易工具,但主力有時也會有假動作(作線),干擾投資人的判斷。所以參與 期貨/選擇權 投資之前,投資人請務必深入了解相關市場知識,制定明確的交易策略,同時謹慎控制風險。

V B A 資 源

EXCEL & VBA功能 – 綜合筆記
※ EXCEL & VBA功能 筆記 : 將針對文章中所使用的 EXCEL 及 VBA公式 / 工具操作 / 巨集設定 / 控制項的運用,做個整合記錄,方便大家在學習當下的參考與使用。

VBA指令 – 彙整筆記
※ VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章 中,所用過的 VBA指令,方便學員們對照運用。

VBA程式語法 – 彙整筆記
※ 語法就是程式的文法。 使用者要與電腦溝通,就必須遵守這些規則。VBA程式語法 筆記 : 將針對 VBA文章 中所使用的 VBA程式語法,做個整合記錄,方便大家在學習當下參考與使用。