台灣股市選股策略 Python 起手勢

04b54680 486c 4af8 bf9b 20135a3396e0

台灣股市與Python的融合

台灣股市,作為亞洲重要的股票交易市場之一,擁有其獨特的市場結構和交易特性。隨著科技的進步,Python成為了股市分析中不可或缺的工具。然而一般人撰寫 Python 策略時,根據我的經驗,非常容易遇到以下的問題:

  • 不知道要寫哪種策略
  • 策略怎麼寫都表現不好
  • 每次寫策略都從 0 開始,很累!

假如你也有以上的問題,那這篇文章就是來幫助你快速上手台股選股策略,你會獲得一個選股範本,這個範本是針對台股的特性而編寫而成,雖然選取了非常多 (100 檔)以上的股票,但還是維持顯著的超額報酬表現,另外一個重點是,這個範本完全只由價量來篩選,在台股中就已經有顯著的效果。這樣的範本非常適合再修改成其他種類的策略。

本文將介紹如何使用Python進行台灣股市的選股策略分析,並探討高動能與低波動策略在台股市場中的應用及其優勢。

台灣股市概況

台灣股市,以其活躍的交易和廣泛的上市公司種類著稱。從傳統製造業到高科技產業,台股市場匯聚了各行各業的代表企業。瞭解市場的基本結構和運作規則,是進行有效選股的前提。

Python於股市分析的應用

Python以其強大的數據處理和分析能力,在股市數據分析中發揮著重要作用。從數據獲取、數據清洗到複雜的算法運算,Python 提供了一個高效且靈活的平台,幫助投資者深入挖掘數據背後的信息。

選股策略基礎概念

選股策略是指用一定的標準和方法從眾多股票中選擇出投資標的,簡單的例子就是,我只買 10 元以下的股票,且殖利率大於 3 的股票。

然而以上的方法可能不會賺錢,怎麼樣的策略會賺錢呢?有效的選股策略應該考慮市場環境、公司基本面和技術分析等多方面因素。

本文注重在技術分析,會參考在台灣股市中最重要,且最有用的兩個指標,

  1. 投資者通常尋求高動能股票以追求高回報
  2. 同時也會考慮低波動股票以降低投資風險。

利用這兩個概念,來製作選股策略,發現在台股市場中非常的有效果!而且可以篩選出大量的股票標的,這些標的有很好的超額報酬,以下是我們實驗的結果,你可以自行判斷高風險與低波動,在台股市場中的作用。好在,我們 finlab 已經幫你處理好所有資料了,你可以直接安裝 finlab package 來下載 10 年以上的數據進行分析和驗證。

數據獲取與處理

使用Python進行股市分析的第一步是數據的獲取和處理。這包括從各種數據源獲取股票價格、成交量等信息,並進行必要的數據清洗和轉換,以便進一步分析。在 finlab package 的加持之下,使用者可以短短幾行就完成這個步驟:

from finlab import data

close = data.get('price:收盤價')
volume = data.get('price:成交股數')

這篇文章由於是一個選股策略範本,所以目的在於用最簡單的資料,選取最多的股票,並且這些股票大量包含超額報酬。或許資深讀者會覺得這也太簡單了吧!沒錯,起手是就是這麼簡單,但真有效,接下來我們就來製作指標並且來分析。

低波動的計算與回測

短期波動和長期波動的計算是選股策略中的重要部分。短期波動通常反映了市場對某股票近期的反應,而長期波動則顯示了股票在較長時間內的價格穩定性。Python可以幫助快速計算這些指標:

std20 = (close
    .pct_change()
    .rolling(20).std()
    .rank(axis=1, pct=True)
    [close.notna()])

為選股提供參考。一般來說,我們會希望選出來的股票「長期波動低」這並僅僅只是比較安全而已,甚至還可能讓選股策略的報酬率更好,以下是我們將波動程度按照低到高分 5 組進行回測的結果,可以發現波動度越低的股票標的,價格穩定緩步上升,長期來講能夠獲得比較好的報酬率:

image
波動低(藍色)長期持有比較能獲得高報酬率

台股市場的動能分析

台股市場非常單純,大部分的股票流動性低,只需要有幾千萬台幣,拉抬股價是非常簡單的事情,這也造就了主力買股票時,必須要分天買進,這時候就容易造成股票數天上漲,我們在這種狀之下就可以來吃主力的豆腐。我個人最喜歡用的台股指標是「RSV」指標,在分析台股市場中的高動能股票可以幫助投資者捕捉市場上升趨勢,從而獲得潛在的高回報。Python的數據分析能力使得這一過程更加高效和精準:

rsv60 = ((close - close.rolling(60).min()) / (close.rolling(60).max() - close.rolling(60).min())[close.notna()])

跟低波動的分析一樣,我們可以將 RSV 高到低分成五組來回測,可以發現長期下來 RSV 高會優於 RSV 低的報酬率,用這種方式,就可以很好的分辨出高動能,或是說,維持在高檔盤整的股票標的。

image 1

組合條件設定與調整

接下來,我們可以來結合高動能以及低波動,在Python中設定和調整選股策略的條件是至關重要的。這些條件包括但不限於股票的動能、波動性和交易量等。透過靈活調整這些條件,投資者可以根據市場環境和個人風險偏好來優化自己的投資策略。

Python選股模型實作

實際上手實作Python選股模型,可以使理論知識轉化為實際操作。利用Python編寫的選股模型不僅可以進行數據分析,還可以根據設定的條件自動選出潛在的投資標的。

策略回測與分析

策略的回測是檢驗其有效性的關鍵步驟。Python提供的回測工具可以模擬策略在過去的表現,幫助投資者評估其風險和回報潛力。

from functools import reduce
from finlab import data
from finlab import backtest

with data.universe('TSE_OTC'):
  close = data.get('price:收盤價')
  volume = data.get('price:成交股數')

# 短期波動
std20 = (close
    .pct_change()
    .rolling(20).std()
    .rank(axis=1, pct=True)
    [close.notna()])

# 長期波動
std60 = (close
    .pct_change()
    .rolling(60).std()
    .rank(axis=1, pct=True)
    [close.notna()])

# 股價相對高低
rsv60 = ((close - close.rolling(60).min()) 
    / (close.rolling(60).max() 
        - close.rolling(60).min())[close.notna()])

conds = [
    
  # 增加你想測試的選股條件

  # 可調整  
  rsv60.rank(axis=1, pct=True) > 0.9, # 高動能
  std20.rank(axis=1, pct=True) < 0.8, # 低波動
  std20 > std60, # 短期價格變化大

  # 台股必備,不需調整
  close > close.average(60), 
  volume > 100_000,
]

position_cond = reduce(lambda i, j: i & j, conds)

# 也可以做一些排序
position = close[position_cond].is_smallest(200)

r = backtest.sim(position, resample='M', 
                 fee_ratio=1.425/1000*0.3, upload=False)
r.display()
image 2
回測成果

雖然報酬率只有 14%,但是選的標的非常多,有將近100檔左右,這樣的選股效果算是非常顯著的。你只要根據這樣的架構,加入其他的選股條件,相信能夠達到非常不一般的選股績效。

風險控制與管理

在執行任何投資策略時,風險控制都是必不可少的。Python不僅可以幫助識別風險較低的投資機會,還可以進行投資組合的風險管理,以確保投資組合的整體風險水平符合投資者的承受能力。

FAQ

投資組合優化技巧

有效的投資組合優化是提高回報和降低風險的關鍵。使用Python,投資者可以進行資產配置、風險分散等策略,以優化其投資組合。這涉及到對不同股票的相關性分析,以及根據市場環境調整持股比例。

市場動態與策略調整

股市是一個不斷變化的環境,因此及時調整選股策略是非常重要的。Python的數據分析能力可以幫助投資者迅速捕捉市場趨勢的變化,並相應調整其選股策略,以應對市場的變動。

未來趨勢預測與策略調整

展望未來,台灣股市的發展趨勢及其對選股策略的影響是投資者關注的重點。利用Python進行趨勢預測,可以使投資者在市場變化前做出預判,從而及時調整策略,把握投資機會。

https://www.finlab.tw/python-taiwan-stock-market-selection/(在新分頁中開啟)

常見問題與解答

如何使用Python進行台灣股市的選股分析?

可以利用 finlab package 快速實作各式各樣的策略,我們在策略平台上也放了非常多的策略範本供大家使用

高動能與低波動策略在台股市場中的表現如何?

這是非常淺顯易懂,簡單好用長年有效的指標,適合拿來搭配籌碼面、基本面來製作各式各樣的策略。

Python在選股策略中的哪些功能最為關鍵?

回測,因為你才知道選出來的股票有沒有超額報酬,才能進而打敗市場。

如何進行有效的策略回測?

要將每個指標單獨驗證(就像是這篇文章的方式),確保這些單獨的指標,在市場上可以找到超額報酬。胡亂拼湊無效的指標,只會事半功倍喔!

在變化的市場環境中,如何調整選股策略?

用盡量長的歷史資料,回測出可信的績效,才能夠將策略使用的長長久久,適時的衡量策略風險,從低風險的開始研究,再慢慢往上小額嘗試高風險策略。

結論與未來展望

台灣股市擁有其獨特的市場特性,而Python作為一種強大的數據分析工具,在股市選股策略中發揮著重要作用。本文介紹了使用Python進行台灣股市選股策略的方法,包括高動能與低波動策略的分析。隨著技術的進步和市場的變化,未來將有更多機會和挑戰出現在台灣股市投資者面前。透過不斷學習和適應,投資者可以在這個充滿機會的市場中取得成功。

用程式自動下單

這個策略需要每天去看公司實施庫藏股的資料,每天去公開資訊交易站查詢,有點麻煩,為何不用我們提供的下單工具來輕鬆下單呢?其實下單的方式非常簡單,首先要在永豐先通過 API 申請後,只需要短短幾行就可以完成:

import os
from finlab.online.sinopac_account import SinopacAccount
from finlab.online.order_executor import OrderExecutor, Position

# 設定帳號金鑰
os.environ['SHIOAJI_API_KEY'] = '永豐證券API_KEY'
os.environ['SHIOAJI_SECRET_KEY'] = '永豐證券SECRET_KEY'
os.environ['SHIOAJI_CERT_PERSON_ID']= '身份證字號'
os.environ['SHIOAJI_CERT_PATH']= '永豐證券憑證路徑'
os.environ['SHIOAJI_CERT_PASSWORD'] = '永豐證券憑證密碼' # 預設與身份證字號

# 以 30 萬台幣計算當前帳戶應該有的股票
fund = 300000
target_position = Position.from_report(report, fund)

# 進行下單
acc = SinopacAccount()
order_executor = OrderExecutor(target_position, acc)
order_executor.create_orders()

只要短短幾行,程式就會幫你計算現在應該有的部位,並且進行「買賣」只需要在適當的時間(例如開盤、收盤)執行,程式就會自動下單買進賣出,將你的帳戶部位調整成獲利的形狀!再也不用自己計算每檔股票要買幾張了!非常的方便喔!

程式預設使用當前價格進行「限價單」但你也可以透過客製化的方式,調整成「漲跌停」、「零股」、「融資券」,非常的簡單方便,讓你在股市中複製好策略的績效!

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!