跳轉到

怎麼問,才問得到你要的東西

所屬章節:入門 三組案例,每組都是「小白版 a」→「進階版 b」的對照 目的不是教 API,是教怎麼把需求講清楚

這頁在講什麼

同一個需求,換個講法,拿到的東西差很多。

以案例 2 為例——同樣是月營收選股,小白版跑出來 +95%(輸給 0050 的 +296%), 進階版是機構等級的多因子輪動。差別不在我會不會寫,在你有沒有講。

小白版 a 進階版 b
講的是 要什麼結果 要什麼規格
長度 一兩句 一頁
我會做的 照字面執行,然後告訴你缺陷 照規格實作
適合 探索、快速試錯 你已經知道要什麼

兩種都對。 a 適合開場,b 適合你看過 a 的結果之後。


萬用句:先照做,再挑錯

如果只記一句,記這個:

先照我說的做,跑完告訴我這個規格有什麼缺陷,以及要達到機構等級還缺什麼

這句話讓你保有規格的控制權,同時讓我把「應該有但你沒提」的東西列出來給你決定。

為什麼我不自己加? 你沒要求時我不加,是刻意的。 你說「每檔 10 萬」我就照做,不會自作主張改成目標權重輪動—— 那是把我的判斷凌駕在你的規格上。但我會在跑完後指出問題。


案例 1:單檔技術指標回測

a. 小白版

0050 的 adjclose ma5 ma10 多頭排列買入,空頭排列賣出
每次買 10 萬
產回測報告給我,並給我儀表板

這句話已經夠好了,四個要素齊全:標的、訊號、部位、輸出。

實跑結果:總報酬 +81.04%、CAGR 16.31%、53 筆交易、成本 20,644。

b. 追問:發現輸給 buy&hold

我發現我輸給 buy&hold,請幫我找到適合的參數

這句追問很關鍵——但答案可能是「參數救不了」。

實測掃描 95 組 MA 參數組合:

buy&hold:  +305.47%   CAGR 40.55%   MDD -27.48%
最佳 MA:   +194.57%   CAGR 34.57%   MDD -20.36%   (MA15/80)

>>> 贏過 buy&hold 的組合:0 / 95
>>> 所有組合平均曝險 72.7%

結構性原因:策略有 39% 時間空手,而 0050 這 4 年漲 3 倍, 空手的每一天都是純虧。曝險越高報酬越高,那極限就是 buy&hold 本身。

這類追問要連著問「是不是結構性問題」,否則我可能真的去掃參數, 掃完才發現方向錯了。

這個案例該補的話

加這句 會得到
「順便掃一下參數空間,我要看全貌不是單一組合」 95 組對照表,而不是一組數字
「同時告訴我曝險率」 直接看出空手成本
「交易次數太少的組合要標出來」 避開只交易 2~3 次的過度配適解

案例 2:選股輪動策略

a. 小白版

給我一個選股策略,用月營收 yoy 作為選股條件,取最好的 10 檔的上市股票,
在每個月的公告日的下個交易日進行換股,每檔 10 萬。

規格完整、時間軸明確(公告日的下個交易日,無未來函數)。我照做了。

結果:

策略 0050 B&H
總報酬 +95.77% +296.42%
MDD -30.32% -27.48%
Sharpe 0.98 1.57

每個維度都輸。 但問題不在執行,在規格本身:

入選股 YoY 中位數 +464%,最大 +1,073,121%
YoY > 200% 佔 83.8%

+1,073,121% 不是成長,是除以零——去年同期營收趨近於零。 純 YoY 排序實質上是在篩選財報異常的公司。

b. 進階版

先是三句原則:

「做多因子,不要單因子」
「要有可交易性過濾:流動性、衝擊成本、最低股價」
「用目標權重輪動,不要固定金額」

然後是完整規格:

做一個台股多因子輪動策略,規格如下:

【因子】用 percentile 排名合成分數,等權平均:
  - 月營收 YoY(正向)
  - 公告累計EPS(正向)
  - ROA 稅後資產報酬率(正向)
  - 營業利益率(正向)
  - 營業利益成長率(正向)
  - 無形資產增加 CFI(反向)

【可交易性】三層過濾,排名前先套遮罩:
  - 20日均成交額排名前 60%
  - 成交額 >= capital × max_w / 0.02(衝擊成本地板)
  - 股價 >= 10 元
  ※ 成交額要用「未還原」Close 算,Volume 是張要 ×1000

【換股】月頻公告日 ∪ 季頻公告日,同月取最新那個
【部位】目標權重 1/N 輪動,每根 bar 把持倉調到目標,差多少補多少
【對齊】財報日期先 union 再 ffill 再 reindex,不要直接 reindex
【成本】手續費 0.001425 × 0.3 折

top_n=20, capital=100萬, max_w=0.20

a 跟 b 差在哪

a b
選股 單因子 YoY 排序 6 因子 percentile 合成
可交易性 成交額 > 0.5 億 三層:流動性排名 + 衝擊成本地板 + 最低股價
部位 每檔固定 10 萬(capital 不生效、無複利) 目標權重輪動(capital 生效、有複利)
換股日 只有月頻 月頻 ∪ 季頻
對齊 直接 reindex union → ffill → reindex

三句原則為什麼有效

①「做多因子,不要單因子」 一句話就從排序變成合成分數。單因子幾乎必然選到極端值—— 案例 2a 有 83.8% 的入選股 YoY > 200%。

②「要有可交易性過濾:流動性、衝擊成本、最低股價」 最關鍵的一句。衝擊成本地板(capital × max_w / impact)這個概念 我不會主動加——除非你說「要考慮衝擊成本」。

③「用目標權重輪動,不要固定金額」 「每檔 10 萬」會走固定口數路徑,capital 不參與計算、沒有複利。 講「目標權重」我才會用 1/N 百分比下單。見 backtest-report.md。


案例 3:期貨策略

a. 小白版

給我一個 txf 的肯特納策略,頻率為一小時,在結算日強制出場。

這句話的資訊密度很高,三個要素都是期貨專屬的:

要素 為什麼重要
txf 資料在 api.MSMP._fut_TXF(底線開頭的私有屬性),不在 api.Data 的 80 張表
頻率一小時 要走 set_tick_period(freq=60) + feed_tick_df,不是 feed_data
結算日強制出場 要 need_settlement=True,判斷式是 row['DateTime'] == row['Settlement']

肯特納通道需要 ema + atr,兩個 self.Ind 都有。

期貨一定要講的四件事

即使沒明講,我也會處理,但講了更保險:

期貨規格要對:
  tick_map=[(np.inf, 1)]     ← 最小跳動 1 點,不設會套用股票規格
  fee=500                     ← 每口固定金額(>= 1 自動切換模式)
  unit=200                    ← 合約乘數
  tax_long/tax_short=0.00002

這個案例該補的話

加這句 會得到
「多空都做」 否則我可能只寫多單
「結算日出場後當天不再進場」 避免結算日當天來回
「跳空時停損以開盤價成交,確認一下」 我會把成交價規則講清楚
「日盤夜盤都要,還是只做日盤」 period 參數差很多

三個最常見的提問錯誤

這樣問 為什麼不好 改成
「幫我找會漲的股票」 沒有可對應的條件,只能猜 講可觀測的條件:營收、法人買超、突破均線
「幫我回測近十年」 日頻硬上限 1000 筆(約 4.1 年) 「近三年」,或明說「可以降到週/月頻」
「順便幫我下單」 SnowyOwl 沒有下單功能,api 上不存在 Order 選股 + 回測到此為止

每次回測都該問的兩句

不管哪個案例,這兩句永遠適用:

① 扣成本前的毛損益是多少?成本佔投入資金幾 %?
② 回測期間實際是哪一段?

為什麼:

  • 案例 1 的 MA20 版本總報酬 -11.31%,但毛損益其實是 +22,000—— 虧損幾乎全是成本(51 筆交易吃掉 32 萬)。看到負數就放棄策略是誤判。
  • 日頻只有 1000 筆,「過去這幾年」實際上是 2022-08 起的 4.08 年, 不是你以為的十年。

提問結構速查

【標的】     0050 / TXF / 上市股票
【訊號】     MA5 > MA10 / 肯特納突破 / 月營收 YoY 排名
【部位】     每檔 10 萬(固定金額)或 目標權重 1/N(有複利)
【換股/出場】公告日下個交易日 / 結算日強制平倉
【成本】     台股個股 / ETF / 台指期(見 backtest-report.md)
【輸出】     報表 + 儀表板 + 逐筆交易
【追問】     毛損益、成本佔比、回測期間、這規格有什麼缺陷

相關頁