過濾 KY 股財報(台股)
美股版本
本策略的美股版本請見 English page,改為過濾 ADR 與外國註冊公司(以 us_company_profile 的 country 欄位判斷)。
在台灣第一上市的海外公司(KY 股)經常爆出財報疑慮,對此敏感的投資人可以在財報策略中排除 KY 股。本範例以現金流量策略為基礎,示範如何過濾 KY 股。
現金流量選股策略
策略篩選同時滿足以下條件的標的:
- 營業現金流 > 0 -- 本業有實際現金流入
- 投資現金流 > 0 -- 投資活動帶來正向現金流(例如處分資產)
- 融資現金流 < 0 -- 公司正在償還借款或減資,財務趨於保守
- ROE > 5 -- 股東權益報酬率高於 5%,具備基本獲利能力
- 股價 > 10 元 -- 排除低價股
基本面指標使用 .deadline() 對齊財報公告截止日,確保不使用未來資訊。
過濾 KY 股
透過 security_categories 資料表,找出公司名稱包含「KY」的標的,從持股中剔除。
程式碼
現金流量選股
from finlab import data
from finlab.backtest import sim
營業現金流 = data.get("financial_statement:營業活動之淨現金流入_流出").deadline()
投資現金流 = data.get("financial_statement:投資活動之淨現金流入_流出").deadline()
融資現金流 = data.get("financial_statement:籌資活動之淨現金流入_流出").deadline()
roe = data.get("fundamental_features:ROE稅後").deadline()
close = data.get("price:收盤價")
position = (營業現金流 > 0) & (投資現金流 > 0) & (融資現金流 < 0) & (roe > 5) & (close > 10)
過濾 KY 股
# 過濾 KY股
sc = data.get("security_categories")
position_col = position.columns
ky_filter = position_col[
~position_col.isin(list(sc[sc["name"].str.contains("KY")]["stock_id"]))
]
position = position[ky_filter]
report = sim(position, resample="M", upload=False)
report.display()
策略特色
- 使用
.deadline()將財報資料對齊公告截止日,避免前視偏誤(look-ahead bias) - KY 股過濾透過公司名稱比對實現,因為 KY 股的公司名稱固定包含「KY」字樣
- 每月換股(
resample='M'),等權重持有所有符合條件的標的 - 此過濾方法可套用於任何基本面策略,只需在最終 position 上執行 KY 股過濾即可
關鍵參數
.deadline():將季度財報資料對齊至公告截止日,確保當下只能使用當時已公開的財報,避免前視偏誤。- 營業現金流 > 0 且 投資現金流 > 0 且 融資現金流 < 0:經典的「現金流三角」品質條件,對應本業賺現金、投資活動淨流入(例如處分資產)、公司同時在償還負債或減資,財務結構趨於保守健康。
roe > 5:ROE 高於 5% 的獲利門檻,排除低效率或虧損企業。close > 10:股價大於 10 元,濾掉低價股與殭屍股。security_categories搭配name.str.contains("KY"):用公司名稱欄位判斷 KY 股,因為所有 KY 股在台股資料中命名都固定帶有「KY」字樣。resample='M':每月換股,對應季報節奏並兼顧交易成本。
預期行為
此策略預期在財報品質分散、現金流造假風險較高的階段展現明顯的過濾效果:排除 KY 股之後,持股的財報品質與會計透明度會顯著提升,長期能降低財報爆雷造成的極端回撤。但同時也會犧牲某些 KY 股真實成長帶來的報酬(並非所有 KY 股都有問題),因此這是一個「降低尾端風險、略微壓低平均報酬」的保守型設計。若在整體市場強勢期間,這項過濾會讓策略略微跑輸大盤;但在空頭與財報爆雷季時,避開問題股所獲得的保護通常大於錯失的機會。