[VBA] 每日自動排序前50檔「 強勢股 / 弱勢股 」

如何定義「 強勢股 與 弱勢股 」?

※ 股市中很常聽到「 要追,要追強勢股 / 要殺,要殺弱勢股 」,那麼 …… ,該如何來定義「 強勢股 與 弱勢股 」?

◎ 一般看盤軟體會有每日及五日強勢股的排名,提供給投資人參考。它的作法是 : 利用每日的漲跌幅,作為強弱股的定義標準。

→ 當然也有別的作法,常用的是以技術分析來作評估 :
◎ 依據大盤的強弱表現,來定義 強 / 弱勢股。作法是 : 根據大盤收盤與60MA距離為標準,超越者為 : 強勢股;落後者為 : 弱勢股

( PS. 另外,還有以 基本面分析 / 技術分析(RSI指標) …… 等評估方式,這裡就不一一贅述。)

抓取 強勢股的目的

※ 股市裡有個說法 :「 買不買 」,意思是 : 大盤在上漲下跌的行情下,強勢股容易在多頭行情中,具有創波段高價的能力,若遭遇大盤震盪,也較能承受傷害、降低虧損;反觀,弱勢股在多頭行情中,1並不會有強力的拉升表現,反而在震盪行情中,容易造成嚴重傷害。

[ 分析原由 ] :
◎ 畢竟市場由主力主導,行情一經拉抬,資金全流入強勢股,弱勢族群勢必少受眷顧,一旦遭遇震盪,主力為避免損失,必然出手止跌入手的強勢股;反觀,弱勢股就容易因沒有主力支持,而產生暴跌的情況。

VBA實作 / 每日自動排序前50檔「 強勢股 / 弱勢股 」

※ 製作前50檔「 強/弱勢股 」自動排序的VBA程式,其操作步驟 :
[ 0 ] : 採用漲跌幅 — 定義強弱勢股
[ 1 ] : 爬取上市櫃公司股票代號
[ 2 ] : 設定DDE公式 — 爬取上市櫃股票收盤數據
[ 3 ] : 刪除成交量不足的股票
[ 4 ] : 股票順序依照漲跌幅大小排列
[ 5 ] : 前50檔強弱勢股列表

爬取上市櫃公司股票代號

[ 建立上市櫃所有公司之股票代號 ] :
※ 首先請依照文章 : [VBA] 自動爬取上市櫃股票近16年歷史本益比 的操作方法及程式碼,建立上市櫃股票的股票代號表頭,完成圖如下 :

[ 表頭製作時,須注意的步驟 ] :
◎ 依照上述文章製作表頭時,記得只需複製證券代號及證券名稱,並且在C行填入 : 上市 / 上櫃 的資料,方便之後的股票爬取。


[ 股票代號 / 表頭畫面 ] :


[ 完整程式碼 ] :
※ 請參考 : 上市櫃股票代號 — 表頭製作

設定DDE公式 — 爬取上市櫃股票收盤數據

※ 上一篇文章 : [VBA]「 本益比多少合理 ? 」史上最佛心的VBA教學 / 算出 合理本益比,已經利用過DDE語法 — 爬取上市櫃股票即時數據,本文再次使用,只是多抓取了幾組數據 : 收盤價 (Price) / 漲跌幅 (PriceChangeRatio) / 成交量 (TotalVolume)。

( PS. 利用DDE語法可以爬取即時數據,在盤後便是接收盤後的收盤數據。)

   
    [ 程式碼 / 設定DDE公式 -- 爬取上市櫃股票收盤數據 ]
    Sub DDE_上市櫃股票收盤數據()
    Dim lastRow%, xR%, stockCode% '宣告變數 -- %:整數
        Sheets("股票代號").Select '切換至"股票代號"工作表  
        lastRow = [A65536].End(xlUp).Row '列號最尾數值          
        For xR= 2 To lastRow '迴圈 -- 執行所有上市櫃股票列號。
            stockCode = Range("A" & xR) ' 股票代號
            Range("D" & xR) = "=@XQLITE|Quote!'" & stockCode  & ".TW-Price'" '在D行xR列 -- 填入DDE公式,爬取上市櫃股票收盤價位。
            Range("E" & xR) = "=@XQLITE|Quote!'" & stockCode & ".TW-PriceChangeRatio'" '在E行xR列 -- 填入DDE公式,爬取上市櫃股票漲跌幅。
            Range("F" & xR) = "=@XQLITE|Quote!'" & stockCode & ".TW-TotalVolume'" '在F行xR列 -- 填入DDE公式,爬取上市櫃股票成交量。
        Next
    End Sub

[ DDE語法與參數的用法 ] :
※ 請參考 EXCEL VBA 功能筆記 — DDE / RTD 語法與參數

[ 顯示畫面 / 爬取上市櫃股票盤後數據 ] :

刪除成交量不足的股票

※ 對於成交量不足的股票,本人不建議參與,主因是 : 股票流通性不佳 / 出脫不易,賣出時容易有划價的風險,股價也較容易受主力操控,所以不列入篩選參考。

[ 篩選條件 ] :
◎ 成交量 > 1000 張。


    [ 程式碼 / 刪除成交量不足的股票 ] 
    Sub 刪除成交量不足的股票()
    Dim lastRow%, xR% '宣告變數 -- %:整數
        Sheets("股票代號").Select '切換至"股票代號"工作表 
        lastRow = [A65536].End(xlUp).Row '列號最尾數值
        For xR = lastRow To 2 Step -1 '由下到上迴圈(遞減1) -- 執行所有上市櫃股票列號。
            If Range("F" & xR) < 1000 Then '判別成交量是否小於1。
                Rows(xR).Delete shift:=xlUp '確定--則刪除游標所在列(xR).參數(shift:=xlUp),則是將游標列下方資料往上移動。
            End If
        Next

    End Sub

[ 提醒 ] :
※ 刪除的迴圈,為何要由下往上刪除,其目的為何 ?
→ 主要原因是 : 刪除後的列號往上移動( +1 ),移動過的列號皆變動,若是由上往下做迴圈,便會產生錯誤。

[ 舉例 ] :
◎ 迴圈 xR = 5 時條件成立,刪除第 5 列,第 6 列以下資料往上移動,原第 6 列變成第 5 列,但迴圈會繼續往下計數 xR = 6,此時變換到第 5 列的資料,便不會計算到,資料便產生錯誤。

[ 顯示畫面 / 保留成交量1000張以上的股票 ] :

股票順序依照漲跌幅大小排列

※ 本文「 / 勢股 」是以個股漲跌幅大小來作定義,所以只要再將股票依照漲跌幅大小做排序,便能找出最強與最弱的50檔股票。


    [ 程式碼 / 股票順序依照漲跌幅大小排列 ] 
    Sub 股票順序依照漲跌幅大小排列()
    Dim lastRow% '宣告變數 -- %:整數
        Sheets("股票代號").Select '切換至"股票代號"工作表
        lastRow = [A65536].End(xlUp).Row '列號最尾數值
        Range("A2:F" & lastRow).Sort Key1:=Range("E2"), Order1:=xlDescending, Header:=xlNo '利用 Sort函式 做資料排序--抓取強勢股數據。
    End Sub

[ Sort / 公式解說 ] :
◎ 排序範圍 : A2:F504 (lastRow),由 E2欄位 開始動作,參數 : xlDescending ( 由大到小 ) / Header:=xlNo ( 標頭不列入計算 )。

[ 顯示畫面 / 股票順序依照漲跌幅大小排列 ] :

前50檔「 強勢股 / 弱勢股 」列表

※ 經過排序後,強/弱勢股一目了然,只要將其強弱數據貼於強弱勢股列表,即可。

[ 操作步驟 ] :
1. 新增工作表 : 名稱 : 強弱勢股列表
2. 製作行列表頭 : 表頭資料 — 請參考下圖。
3. 複製強弱數據 : 將數據複製到 “強弱勢股列表” 工作表。


    [ 程式碼 / 前50檔強弱勢股列表 ] -- 延續股票順序依照漲跌幅大小排列程式碼
    Range("A2:F51").Copy '複製前50檔強勢股數據
    Sheets("強弱勢股列表").[B2].PasteSpecial Paste:=xlPasteValues '數據貼於"強弱勢股列表"工作表:[B2]開始欄位--貼上的數據為:數值。

    Range("A2:F" & lastRow).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlNo '再依次排序--這次由小到大,抓取弱勢股數據
    Range("A2:F51").Copy '複製前50檔弱勢股數據
    Sheets("強弱勢股列表").[I2].PasteSpecial Paste:=xlPasteValues '同上,數據複製--由[I2]開始貼上--貼上的數據為:數值。

[ 顯示畫面 / 前50檔強弱勢股列表 ] :

完整程式碼


    [ 程式碼 / 前50檔強弱勢股列表 ] :

    Sub 列表前50檔強弱勢股()
    Dim lastRow%, xR%, stockCode%

        'DDE_上市櫃股票收盤數據
        Sheets("股票代號").Select
        lastRow = [A65536].End(xlUp).Row
        For xR = 2 To lastRow
            stockCode = Range("A" & xR)
            Range("D" & xR) = "=@XQLITE|Quote!'" & stockCode & ".TW-Price'"
            Range("E" & xR) = "=@XQLITE|Quote!'" & stockCode & ".TW-PriceChangeRatio'"
            Range("F" & xR) = "=@XQLITE|Quote!'" & stockCode & ".TW-TotalVolume'"
        Next

        '刪除成交量不足的股票
        For xR = lastRow To 2 Step -1
            If Range("F" & xR) < 1000 Then
                Rows(xR).Delete shift:=xlUp
            End If
        Next

        '股票順序依照漲跌幅大小排列
        lastRow = [A65536].End(xlUp).Row
        Range("A2:F" & lastRow).Sort Key1:=Range("E2"), Order1:=xlDescending, Header:=xlNo
        Range("A2:F51").Copy '複製強勢股數據
        Sheets("強弱勢股列表").[B2].PasteSpecial Paste:=xlPasteValues    
        Range("A2:F" & lastRow).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlNo
        Range("A2:F51").Copy '複製強勢股數據
        Sheets("強弱勢股列表").[I2].PasteSpecial Paste:=xlPasteValues

        Sheets("強弱勢股列表").Select
        [A1].Select

    End Sub

完成圖 / 前50檔強弱勢股排序列表

[ 完成圖 / 前50檔強弱勢股排序列表 ] :
強勢股

注意事項

[ 1 ] : 利用XQ串接數據,必須記得一件事 :
→ 請先開啟XQ程式,再打開EXCEL,才能正常連結數據源。

[ 2 ] : 為了方便講解,程式中省略了一道程序 :
→ 排序上市櫃資料前, 最好先複製/備份一組數據資料,其後的操作,皆在複製的數據中運行,如此每日更新前50檔強弱勢股時,才不需要重新抓取一次數據源。

[ 3 ] : 刪除的條件 :
→ 本文刪除的條件,只列出一條 : 成交量 < 1000張,其目的是 : 擔心股價受主力操控。但同樣股本小的股票,也會有這樣的疑慮,所以在設計時,也可以將此條件列入參考,這樣能更精準的篩選出需要的股票。

[ 4 ] : 程式掛接DDE公式時,可能會發生資訊延遲的問題 :
→ 若有資訊延遲的情況,可以試著在DDE公式掛接後,增加一條暫停5秒的公式 : Application.Wait (Now + TimeValue(“00:00:05”)),以防錯誤產生。

結論

※ 關注「 強勢股 」有助於投資者捕捉市場中表現出色的股票,這些股票通常具有穩健的業績和良好的抗跌能力,最主要的是受到主力的青睞,有助於未來的突破發展。文中,則利用DDE語法串接XQ,取得上市櫃所有股票即時數據,再藉由條件刪除及資料排序,成功篩選出前50檔強弱勢股票。

( PS. 如果喜歡 股小白 的文章,歡迎到 股小白臉書粉絲頁 點讚,衝個人氣,目前不定期分析大盤趨勢,將來會有 每日公報 : 分析並公布跑分的個股資料,讓大家作為投資參考。 )

相 關 文 章

[ 1 ] : [VBA] 每日自動排序前50檔「 強勢股 / 弱勢股 」
※ 關注「 強勢股 」有助於投資者捕捉市場中表現出色的股票,這些股票通常具有穩健的業績和良好的抗跌能力,最主要的是受到主力的青睞,有助於未來的突破發展。文中,則利用DDE語法串接XQ,取得上市櫃所有股票即時數據,再藉由條件刪除及資料排序,成功篩選出前50檔強弱勢股票。

[ 2 ] : [VBA] 自動爬取上市櫃產業類股指數
※ 關注「上市櫃 產業類股 指數」有助於投資人了解不同產業的動態,以及「類股輪動」的現象。文中,則利用IE操控及QueryTable爬蟲工具,取得上市櫃產業類股指數並將其排序,即可捕捉現今表現出色的主流類股,再加以持續監控和分析,則有助於制定投資策略或進行市場研究。

V B A 資 源

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

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

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