策略範例
營建產業專用指標
本頁內容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='建材營造':可用的產業名稱見下載資料的市場與類股範圍。
下一步
這一頁有幫到你嗎?