文件
開啟 Studio

策略範例

營建產業專用指標

本頁內容4

合約負債代表建商已簽約但尚未認列的預售屋收入,金額越高,表示未來潛在營收越大。這個策略運用營建股「合約負債」的特性,只在營建產業裡選股,適合想用產業專屬指標研究單一產業的人。詳細說明見原文。

策略邏輯

  • 只看營建股:用 data.universe(category='建材營造') 把回測範圍限定在營建產業,避免跨產業比較不同財報特性的公司,確保指標在同類公司間有可比性。
  • 合約負債佔股本比率(ce_ratio)> 0.5:ce_ratio 代表每單位股本對應的潛在未認列營收,超過 50% 表示未來營收有充足保障。
  • 合約負債成長率介於 5% 至 50%:合約負債正在成長但不過度膨脹,避免異常數據。
  • 選股:同時滿足兩個條件的股票,依 ce_ratio 排序取前 5 名持有。
  • 換股與風控:每月換股,搭配營建業合約負債的季頻更新節奏;單檔上限 30%、停損 10%,手續費以券商三折優惠計算。

完整程式碼

strategy.py
from finlab import data
from finlab.backtest import sim
import pandas as pd

# 限定回測產業範圍
with data.universe(category='建材營造'):
    # 資料引入
    close = data.get('price:收盤價')
    contract_debt = data.get('financial_statement:合約負債_流動')
    contract_debt_gr = contract_debt / (contract_debt.shift()) - 1
    equity = data.get('financial_statement:股本')

    # 計算合約負債佔股本的比率,比率越高代表未來潛在貢獻每股營收越高
    ce_ratio = contract_debt / equity

    # 選股條件
    cond1 = ce_ratio > 0.5
    cond2 = (contract_debt_gr > 0.05) & (contract_debt_gr < 0.5)
    cond_all = cond1 & cond2

    result = ce_ratio * cond_all
    position = result[result > 0].is_largest(5)

    # position_limit 限定單檔標的最多持有30%部位,避免標的數過少時產生重壓的非系統性風險
    report = sim(
        position,
        resample='M',
        position_limit=0.3,
        stop_loss=0.1,
        fee_ratio=1.425 / 1000 * 0.3,
        upload=False,
    )

report.display()

report.display() 會畫出完整的回測報告。

怎麼調整

  • 比率門檻 ce_ratio > 0.5:合約負債至少要佔股本多少。
  • 成長率區間 0.05 到 0.5:下限要求合約負債在成長,上限排除過度膨脹的異常數據。
  • 持股檔數 is_largest(5):依 ce_ratio 取前幾名。
  • 單檔上限 position_limit=0.3:單檔最多 30%,避免標的數過少時產生重壓的非系統性風險。
  • 停損 stop_loss=0.1:10% 停損,控制個股下行風險。
  • 手續費 fee_ratio=1.425/1000*0.3:券商三折優惠的手續費,可以改成你實際的折扣。
  • 產業範圍 category='建材營造':可用的產業名稱見下載資料的市場與類股範圍。

下一步

  • 下載資料 用 data.universe 限定市場與類股,以及找財報欄位名稱。
  • 小資族優等生 結合市值、現金流、ROE 與估值的基本面選股。
  • 本益成長比 在營收趨勢向上的公司中挑 PEG 最低的股票。
  • 歷史回測 單檔上限、停損與手續費的設定。
↑↓ 選擇 Enter 開啟 Esc 關閉