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

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

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

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