怎麼問,才問得到你要的東西
所屬章節:入門 三組案例,每組都是「小白版 a」→「進階版 b」的對照 目的不是教 API,是教怎麼把需求講清楚
這頁在講什麼
同一個需求,換個講法,拿到的東西差很多。
以案例 2 為例——同樣是月營收選股,小白版跑出來 +95%(輸給 0050 的 +296%), 進階版是機構等級的多因子輪動。差別不在我會不會寫,在你有沒有講。
| 小白版 a | 進階版 b | |
|---|---|---|
| 講的是 | 要什麼結果 | 要什麼規格 |
| 長度 | 一兩句 | 一頁 |
| 我會做的 | 照字面執行,然後告訴你缺陷 | 照規格實作 |
| 適合 | 探索、快速試錯 | 你已經知道要什麼 |
兩種都對。 a 適合開場,b 適合你看過 a 的結果之後。
萬用句:先照做,再挑錯
如果只記一句,記這個:
這句話讓你保有規格的控制權,同時讓我把「應該有但你沒提」的東西列出來給你決定。
為什麼我不自己加? 你沒要求時我不加,是刻意的。 你說「每檔 10 萬」我就照做,不會自作主張改成目標權重輪動—— 那是把我的判斷凌駕在你的規格上。但我會在跑完後指出問題。
案例 1:單檔技術指標回測
a. 小白版
這句話已經夠好了,四個要素齊全:標的、訊號、部位、輸出。
實跑結果:總報酬 +81.04%、CAGR 16.31%、53 筆交易、成本 20,644。
b. 追問:發現輸給 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. 小白版
規格完整、時間軸明確(公告日的下個交易日,無未來函數)。我照做了。
結果:
| 策略 | 0050 B&H | |
|---|---|---|
| 總報酬 | +95.77% | +296.42% |
| MDD | -30.32% | -27.48% |
| Sharpe | 0.98 | 1.57 |
每個維度都輸。 但問題不在執行,在規格本身:
+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 |
資料在 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)
【輸出】 報表 + 儀表板 + 逐筆交易
【追問】 毛損益、成本佔比、回測期間、這規格有什麼缺陷
相關頁
- 開始使用 SnowyOwl:查事實 / 組條件 / 驗規則 的三分法
- 案例集:小白怎麼問回測:三個回測案例的完整程式碼
- 商品規格與績效報告:
unit/capital/tax_*的陷阱 - 錯誤訊息速查:13 項「不報錯但結果是錯的」