文件
開啟 Studio

策略範例

過濾全額交割股

本頁內容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% 單檔上限分散風險,平衡中小型股的高波動。

什麼行情有效

這是典型的台股基本面動能策略:用近期營收創高挑出本業正在加速的公司,再用成交量與全額交割股過濾排除最可能踩雷的名單。預期在營收成長擴散的多頭階段能取得明顯超額報酬。每月再平衡可以快速納入新發布的月營收資料,也能及時剔除被新列入全額交割的股票。

下一步

↑↓ 選擇 Enter 開啟 Esc 關閉