過濾全額交割股(台股)
美股版本
本策略的美股版本請見 English page,內容改以 penny stock、低成交量與 micro-cap 等美股特有的風險過濾條件為主。
營收動能策略搭配成交量篩選與全額交割股過濾,避免買進流動性不足或有財務問題的標的。
營收動能選股
策略核心是找出近三個月累積營收創兩年新高的股票,代表營收正處於強勁的突破動能。同時要求 10 日均量大於 300 張,排除流動性過小的冷門股。
過濾全額交割股
全額交割股是指因財務狀況異常而被交易所列為變更交易方式的股票,買進時必須預繳全額款項。這類股票通常有較高的財務風險,策略中應予以排除。
FinLab 提供 etl:full_cash_delivery_stock_filter 資料表,每日 08:15 更新全額交割股清單。買進訊號隔日若為全額交割股,則不交易。
程式碼
營收動能條件
from finlab import data
from finlab.backtest import sim
import pandas as pd
rev = data.get("monthly_revenue:當月營收")
rev_rf = data.get("monthly_revenue:去年同月增減(%)")
vol = data.get("price:成交股數") / 1000
rev_recent_3 = rev.rolling(3).sum()
vol_avg = vol.average(10)
cond1 = rev_recent_3 == rev_recent_3.rolling(24, min_periods=12).max()
# 成交量條件,排除流動性過小
cond2 = vol_avg > 300
加入全額交割股過濾
# 過濾全額交割股
full_cash_delivery_stock_filter = data.get("etl:full_cash_delivery_stock_filter")
cond_all = cond1 & cond2 & full_cash_delivery_stock_filter
result = rev_rf * cond_all
position = result[result > 0].is_largest(10).reindex(
rev.index_str_to_date().index, method="ffill"
)
report = sim(position=position, stop_loss=0.3, position_limit=0.1, upload=False)
report.display()
策略特色
- 使用
reindex搭配index_str_to_date()將月頻營收訊號對齊到日頻價格資料 is_largest(10)取營收年增率最高的前 10 檔stop_loss=0.3設定 30% 停損,給予較大的波動容忍度position_limit=0.1限制單檔部位上限為 10%,分散風險full_cash_delivery_stock_filter是布林值 DataFrame,直接用&運算即可過濾
關鍵參數
rev.rolling(3).sum():近三個月累積營收,平滑單月波動,反映短期營收趨勢。rev_recent_3.rolling(24, min_periods=12).max():以 24 個月為窗口取累積營收的最大值,判斷當期是否突破兩年新高。vol_avg > 300:10 日日均量需大於 300 張(30 萬股),剔除流動性過低、買賣易卡住的冷門股。etl:full_cash_delivery_stock_filter:FinLab 每日 08:15 更新的全額交割股布林過濾表,可直接與其他條件做&運算。stop_loss=0.3/position_limit=0.1:30% 個股停損與 10% 單檔部位上限,平衡中小型股的高波動與分散風險。
預期行為
這是典型的台股基本面動能策略:用近期營收創高挑選出本業正在加速的公司,再用成交量與全額交割股過濾排除最可能踩雷的名單。預期在營收成長擴散的多頭階段能取得明顯超額報酬;但在全市場營收同步下滑、或大盤進入盤整震盪時,單靠營收動能可能買在階段高點,此時停損與部位上限的保護就顯得格外重要。每月再平衡可以快速納入新發布的月營收資料,也能及時剔除被新列入全額交割的標的。