[VBA] 每日爬取 台指選擇權 簡表 交易資訊
目錄 :
有關 台指選擇權 交易資訊
※ 台指選擇權交易 如同台指期一般,具有槓桿效應,相對於直接買賣股票,使用選擇權可以較少的資金參與市場,從而提高資本運用效率,實現更高的報酬率。
◎ 期交所每日公布的買賣權交易數據,包含了許多重要訊息,如 : 交易量 / 未平倉量。藉由數據的推算,可以得知買賣權的 最大交易量 及 最大未平倉量 的相對履約價位置,進而研判出當前的 支撐 與 壓力點。
台指選擇權 簡表 資訊
※ 期交所每日公布的選擇權交易數據,又分為 : 一般 (日盤) / 盤後 (夜盤) 交易時段。
※ 期交所公布的數據內容,又可以分為 : 總表 與 簡表。
( PS. 顧名思義 : 總表 — 是當日所有履約價的交易記錄,簡表 — 則是只公布價平上下交易量較為活絡的幾檔履約價交易記錄,周選 : 20檔 / 次周選、月選 : 各10檔。)
[ 期交所 / 選擇權數據網址 ] :
◎ 總表 : https://www.taifex.com.tw/cht/3/optDailyMarketReport。
◎ 簡表 : https://www.taifex.com.tw/cht/3/optDailyMarketSummary。
台指選擇權 交易時間
[ 台指選擇權 / 交易時間 ] : 同台指期交易時間。
◎ 電子盤交易 ( 夜盤 ) : 下午 15 : 00 ~ 隔日凌晨 05 : 00。
( PS. 夜盤開始時間 — 下午 03 : 00 是每日交易的開始時間。舉例 : 目前是 2024/04/12 下午 03 : 00 夜盤開始時間,但實際交易日為 : 04/15日。)
◎ 一般交易 ( 日盤 ) : 早上 08 : 45 ~ 下午 13 : 45。
[ 提醒 ] :
※ 未平倉量 的訊息,只公布於每日一般(日盤)交易數據中,盤後(夜盤)不會公布。
※ 有關「 台指選擇權 」的契約規格內容,可參考 : 期交所 — 台指選擇權 契約網站。
QueryTable 實作 — 爬取 台指選擇權 簡表 交易資訊
※ 期交所公布的台指選擇權 簡表交易資料,分二段交易時間 : 夜盤 / 日盤。其網址如下 :
[ 盤後 / 夜盤 ] : 網址 — https://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel。( PS. 夜盤數據更新時間 : 06 : 00。)
[ 一般 / 日盤 ] : 網址 — https://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel。( PS. 日盤數據更新時間 : 15 : 00。)
[ 注意 ] :
◎ 仔細看,你會發現日/夜盤數據更新網址是一樣的,這應該是期交所網頁設計錯誤的問題,已經去信詢問情況;但實際數據無誤,只需要設定自動排程程序,依照日/夜盤數據更新時間,自動上網更新,即可。
→ 製作自動上網更新功能 : 請參考 — Windows 工作排程器。
◎ 台指選擇權 簡表 ( 日 / 夜盤 ) 的網址來源,參考下圖。
[ 1 ] : 選擇權(每日交易行情查詢 網址 : https://www.taifex.com.tw/cht/3/optDailyMarketSummary。
[ 2 ] : 點擊 — 連結查詢 後,會出現 盤後資訊 — 選擇權(簡表) 的日盤 / 夜盤 數據資料,參考下圖。
[ A ] : 夜盤 數據 : 網址 — https://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel。
[ B ] : 日盤 數據 : 網址 — https://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel。
錄製巨集
[ 錄製巨集 — 操作步驟 ] :
A. 錄製巨集 : 請參考 錄製巨集(舊版) 內的錄製步驟,錄製完夜盤後,會新增一個新的工作表。( PS. 也可以事先新增好工作表。)
◎ 在製作過程中,須注意的三點 :
1. 新增活頁簿,設定檔名 : 每日爬取選擇權簡表交易資訊.xlsm。
2. 新增工作表,設定名稱 : 簡表數據。
3. 從WEB(舊版) 抓取資料時,URL 網址輸入框內,需輸入 : https://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel。
( PS. 日盤數據更新時間 — 下午 03 : 00 後,較為穩妥。)
B. 執行巨集 : 執行錄製好的巨集後,於簡表數據工作表內,會顯示期交所擷取出的 簡表 資料,顯示如下 :
[ 巨集程式碼 / 爬取選擇權簡表交易數據 ] :
Sub 更新選擇權簡表數據()
Application.CutCopyMode = False
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;https://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel", Destination:=Range("$A$1"))
' .CommandType = 0
.Name = "futDailyMarketExcel?marketCode=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
[ 注意 ] : 使用舊版爬取出來的資料,會在執行 .CommandType = 0 時,出現錯誤訊號。此時,只要將其註解( ‘ ) 掉,就沒事了。
( PS. 另外,在程式後段加上 .Delete (切斷連線),這樣系統就不會造成連線膨脹,導致當機。)
台指選擇權 簡表 數據擷取/儲存
A. 新增一個名稱 : 選擇權_簡表 的工作表,方便儲存每日選擇權(簡表)之交易數據。
B. 在 選擇權_簡表 工作表內,先設定好需要的數據表頭。表頭資料顯示如下 :
C. 表頭製作好,就可設計 VBA程式,來擷取/儲存當日選擇權的買/賣權(簡表)交易資料。
[ 程式碼 / 爬取選擇權簡表交易數據 ] :
Sub 記錄買賣權數據()
Dim newRow%, VolumnMax&, OiMax&, SellStartRow%, SellEndRow%
Sheets("簡表數據").Select
newRow = Sheets("選擇權_簡表").[A65536].End(xlUp).Row + 1 ' 空白新列列號。
' 買權 (CALL) -- 數據記錄
Sheets("選擇權_簡表").Range("A" & newRow) = Left([A3], 10) ' 日期
Sheets("選擇權_簡表").Range("B" & newRow) = [A9] ' 周選
VolumnMax = WorksheetFunction.Max(Sheets("簡表數據").Range("H9:H28")) ' 找出成交量最大值。
Set xFind = Range("H9:H28").Find(VolumnMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("C" & newRow) = VolumnMax ' 記錄成交量最大值。
Sheets("選擇權_簡表").Range("D" & newRow) = Range("B" & xFind.Row) ' 記錄成交量最大值的履約價。
OiMax = WorksheetFunction.Max(Sheets("簡表數據").Range("I9:I28")) ' 找出未平倉最大值。
Set xFind = Range("I9:I28").Find(OiMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("E" & newRow) = OiMax ' 記錄未平倉最大值。
Sheets("選擇權_簡表").Range("F" & newRow) = Range("B" & xFind.Row) ' 記錄未平倉最大值的履約價。
' 賣權 (PUT) -- 數據記錄
Sheets("選擇權_簡表").Range("H" & newRow) = Left([A3], 10) ' 日期
Sheets("選擇權_簡表").Range("I" & newRow) = [A9] ' 周選
SellStartRow = Range("A:A").Find("賣權").Row + 4 ' 搜尋並定位"賣權"文字的列號位置,+4 : 則是周選數據起始列號。
SellEndRow = SellStartRow + 19 ' 起始列號 +19 = 結束列號。( 總共 : 20組周選賣權履約價數據。)
VolumnMax = WorksheetFunction.Max(Sheets("簡表數據").Range("H" & SellStartRow & ":H" & SellEndRow)) ' 找出成交量最大值。
Set xFind = Range("H" & SellStartRow & ":H" & SellEndRow).Find(VolumnMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("J" & newRow) = VolumnMax ' 記錄成交量最大值。
Sheets("選擇權_簡表").Range("K" & newRow) = Range("B" & xFind.Row) ' 記錄成交量最大值的履約價。
OiMax = WorksheetFunction.Max(Sheets("簡表數據").Range("I" & SellStartRow & ":I" & SellEndRow)) ' 找出未平倉最大值。
Set xFind = Range("I" & SellStartRow & ":I" & SellEndRow).Find(OiMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("L" & newRow) = OiMax ' 記錄未平倉最大值。
Sheets("選擇權_簡表").Range("M" & newRow) = Range("B" & xFind.Row) ' 記錄未平倉最大值的履約價。
Set xFind = Nothing ' 清除設定
End Sub
[ 程式解說 ] :
1. VolumnMax = WorksheetFunction.Max(Sheets(“簡表數據”).Range(“H9:H28”)) : 利用 WorksheetFunction.Max 指令,找出買權(“H9:H28”)欄位中的最大值,再指定給 VolumnMax 變數。
2. Set xFind = Range(“H9:H28”).Find(VolumnMax, LookIn:=xlValues) : ‘ 利用 Set 指令 — 將搜尋( Find )到的成交量最大值,設為一物件。( PS. 目的為方便找到之後需要的履約價位置。)
3. Sheets(“選擇權_簡表”).Range(“K” & newRow) = Range(“B” & xFind.Row) ‘ 記錄成交量最大值的履約價。( PS. xFind 為物件變數, xFind.Row — 則是取得成交量最大值的列號。)
4. SellStartRow = Range(“A:A”).Find(“賣權”).Row + 4 : 搜尋並定位”賣權“文字的列號位置,+4 : 則是周選數據起始列號。
( PS. 為何要以搜尋”賣權”文字的方式,來設定起始列號? 主要原因是 : 牽扯到第三周,賣權的列號數據會有所變動之故。)
5. SellEndRow = SellStartRow + 19 : 起始列號 +19 = 結束列號,總共 : 20組周選賣權履約價數據。( PS. 周選買賣權交易資料,均會展現20組履約價數據。)
D. 日盤資料擷取/儲存完畢後,就等隔日再進行操作。( PS. 不記錄夜盤 — 主要是因為沒有未平倉資料,故不加以記錄。)
E. 至於日盤資料的儲存方式 — 是要採用每周一清,還是持續記錄,就依照自己喜歡的方式記錄,即可。
完整程式碼
Sub 更新選擇權簡表數據()
Dim newRow%, VolumnMax&, OiMax&, SellStartRow%, SellEndRow%
Sheets("簡表數據").Select
Columns("A:I").Delete ' 刪除舊資料
Application.CutCopyMode = False
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;https://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel", Destination:=Range("$A$1"))
' .CommandType = 0
.Name = "optDailyMarketSummaryExcel"
.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
newRow = Sheets("選擇權_簡表").[A65536].End(xlUp).Row + 1 ' 空白新列列號。
' 買權 (CALL) -- 數據記錄
Sheets("選擇權_簡表").Range("A" & newRow) = Left([A3], 10) ' 日期
Sheets("選擇權_簡表").Range("B" & newRow) = [A9] ' 周選
VolumnMax = WorksheetFunction.Max(Sheets("簡表數據").Range("H9:H28")) ' 找出成交量最大值。
Set xFind = Range("H9:H28").Find(VolumnMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("C" & newRow) = VolumnMax ' 記錄成交量最大值。
Sheets("選擇權_簡表").Range("D" & newRow) = Range("B" & xFind.Row) ' 記錄成交量最大值的履約價。
OiMax = WorksheetFunction.Max(Sheets("簡表數據").Range("I9:I28")) ' 找出未平倉最大值。
Set xFind = Range("I9:I28").Find(OiMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("E" & newRow) = OiMax ' 記錄未平倉最大值。
Sheets("選擇權_簡表").Range("F" & newRow) = Range("B" & xFind.Row) ' 記錄未平倉最大值的履約價。
' 賣權 (PUT) -- 數據記錄
Sheets("選擇權_簡表").Range("H" & newRow) = Left([A3], 10) ' 日期
Sheets("選擇權_簡表").Range("I" & newRow) = [A9] ' 周選
SellStartRow = Range("A:A").Find("賣權").Row + 4 ' 搜尋並定位"賣權"文字的列號位置,+4 : 則是周選數據起始列號。
SellEndRow = SellStartRow + 19 ' 起始列號 +19 = 結束列號。( 總共 : 20組周選賣權履約價數據。)
VolumnMax = WorksheetFunction.Max(Sheets("簡表數據").Range("H" & SellStartRow & ":H" & SellEndRow)) ' 找出成交量最大值。
Set xFind = Range("H" & SellStartRow & ":H" & SellEndRow).Find(VolumnMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("J" & newRow) = VolumnMax ' 記錄成交量最大值。
Sheets("選擇權_簡表").Range("K" & newRow) = Range("B" & xFind.Row) ' 記錄成交量最大值的履約價。
OiMax = WorksheetFunction.Max(Sheets("簡表數據").Range("I" & SellStartRow & ":I" & SellEndRow)) ' 找出未平倉最大值。
Set xFind = Range("I" & SellStartRow & ":I" & SellEndRow).Find(OiMax, LookIn:=xlValues) ' 設定 -- 成交量最大值 為一物件。
Sheets("選擇權_簡表").Range("L" & newRow) = OiMax ' 記錄未平倉最大值。
Sheets("選擇權_簡表").Range("M" & newRow) = Range("B" & xFind.Row) ' 記錄未平倉最大值的履約價。
Set xFind = Nothing ' 清除設定
End Sub
結論
台指選擇權(簡表)提供每日買賣權交易數據,為了更精準地了解市場情緒,便可利用電腦爬蟲(QueryTable)技術,每日爬取簡表交易資料,再透過搜尋與擷取的VBA程式語法,自動化地收集簡表相關數據。隨後,再針對數據進行儲存列表,如此便能協助投資者獲得市場趨勢,並制定相應的投資策略。
☆ 如果喜歡 股小白 的文章,歡迎到 股小白臉書粉絲頁 點讚,衝人氣,星期五盤後分析大盤趨勢,將來會有 每日公報 : 分析並公布跑分的個股資料,讓大家作為投資參考。 )
☆ 若您對 股票 / 期貨 / 選擇權 投資有興趣,誠摯邀請您加入LINE群組,每日會提供參考數據與教學文章,供您研究。
相 關 文 章
[ 1 ] : 每日爬取 台指期交易 資訊
※ 台指選擇權(簡表)提供每日買賣權交易數據,為了更精準地了解市場情緒,便可利用電腦爬蟲(QueryTable)技術,每日爬取簡表交易資料,再透過搜尋與擷取的VBA程式語法,自動化地收集簡表相關數據。隨後,再針對數據進行儲存列表,如此便能協助投資者獲得市場趨勢,並制定相應的投資策略。
[ 2 ] : 待續 ……
V B A 資 源