量化策略的最小單位——以及它跟大多數人想的不一樣的地方。
交易訊號不是預測。它是把一條規則套用到市場資料後,產生的二元決策。在任何一根 K 棒,這條規則只輸出三種值:
| 值 | 意義 |
|---|---|
1.0 | 持有多頭部位 |
0.0 | 空手(flat) |
NaN | 維持上一根 K 棒的部位不變 |
就這樣。策略不是在「預測」未來——它是定義一套系統性規則,決定什麼時候進場、什麼時候出場。
很多人會把這幾個階段搞混。訊號實際上是這樣一步步變成交易所裡的成交單:
從價格或成交量算出的原始數值。例如:SMA(20) = 42,300、SMA(50) = 41,800。
把規則套在指標上,得出 1.0 或 0.0。例如:SMA_fast > SMA_slow → signal = 1.0。
Runner 把訊號轉換成資金配置。例如:signal = 1.0 → 投入 100% 資金做多。
Reconciler 比較目標部位和實際部位的差異,送出委託單補足缺口。
BlaveClaw Type A 策略的訊號是在第 T 根 K 棒收盤時計算,但委託是在第 T+1 根 K 棒開盤時送出。這不是限制,是刻意設計的。
實際上,對 BTCUSDT 這類流動性高的市場,1h 週期的下一根開盤滑點通常很小。流動性差的資產就不一定了——回測時永遠要誠實地把手續費和滑點算進去。
兩條線互相穿越。快線在慢線上方做多,快線在慢線下方空手。SMA 黃金交叉、MACD 訊號線交叉都屬這類。
signal = 1.0 if SMA_fast > SMA_slow else 0.0
單一指標穿越某個水位。超過進場門檻做多,低於出場門檻離場。中間設「死區」,避免在臨界點反覆進出。
signal = 1.0 if TI > 1.69 else (0.0 if TI < -0.45 else NaN)
用第二個指標過濾主要訊號,只有在市場環境有利時才進場。可以大幅減少震盪行情的假訊號。
signal = primary_signal if market_dir > 0 else 0.0
btc_sma_cross 是最簡單的 Type A 策略範例:
def compute_signals(df):
signal = pd.Series(np.nan, index=df.index)
golden = (df['SMA_F'] > df['SMA_S']) # 快線穿越慢線上方
death = (df['SMA_F'] < df['SMA_S']) # 快線穿越慢線下方
signal[golden] = 1.0 # 做多
signal[death] = 0.0 # 空手
return signal
在兩條 SMA 都還沒有足夠歷史資料時(熱身期),訊號是 NaN,BlaveClaw 不持倉。第一次交叉發生後,就根據規則在多頭和空手之間切換。