策略範例
過濾全額交割股
本頁內容5
全額交割股是因財務狀況異常、被交易所列為變更交易方式的股票,買進時必須預繳全額款項,通常有較高的財務風險。這一頁在營收動能策略上加入成交量與全額交割股過濾,避免買進流動性不足或有財務問題的股票,適合想讓選股避開這類地雷的人。
策略邏輯
- 營收創兩年新高:近三個月累積營收創兩年新高,代表營收正處於強勁的突破動能。
- 流動性:10 日均量大於 300 張,排除流動性過小的冷門股。
- 排除全額交割股:FinLab 的
etl:full_cash_delivery_stock_filter資料表每日 08:15 更新全額交割股清單。買進訊號隔日若為全額交割股,則不交易。 - 選股:符合條件的股票中,取營收年增率最高的前 10 檔。
- 換股:用
reindex搭配index_str_to_date(),把月頻營收訊號對齊到日頻價格資料,每月換股。 - 風控:個股停損 30%,單檔部位上限 10%。
完整程式碼
strategy.py
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()report.display() 會畫出完整的回測報告。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 萬股),剔除流動性過低、買賣容易卡住的冷門股。 - 持股檔數
is_largest(10):取營收年增率最高的前 10 檔。 - 停損與單檔上限
stop_loss=0.3、position_limit=0.1:30% 停損給予較大的波動容忍度,10% 單檔上限分散風險,平衡中小型股的高波動。
什麼行情有效
這是典型的台股基本面動能策略:用近期營收創高挑出本業正在加速的公司,再用成交量與全額交割股過濾排除最可能踩雷的名單。預期在營收成長擴散的多頭階段能取得明顯超額報酬。每月再平衡可以快速納入新發布的月營收資料,也能及時剔除被新列入全額交割的股票。
下一步
這一頁有幫到你嗎?