[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 資 源