看懂合約溢價怎麼算、避開兩個最常見的誤讀,以及怎麼放進策略。
合約價格比現貨高,就代表市場很樂觀嗎?市場情緒看的是 Binance 永續合約比指數價格高出多少,但它用的是 USDT 價差、而且只跟自己近 30 天比——這兩點是最多人讀錯的地方。
市場情緒(Market Sentiment,MS)是 Blave 的合約溢價指標:比較 Binance USDT 本位永續合約與 Binance 指數價格的收盤價差,換算成相對該幣近 30 天的 z-score。指數價格是 Binance 以多家交易所現貨報價加權而成,不是單一交易所的現貨價。計算分三步:
| 步驟 | 算的是什麼 |
|---|---|
| 1. 價差 | 每 5 分鐘,永續合約收盤價減指數價格收盤價,單位是 USDT。大於 0 是合約溢價,小於 0 是折價。 |
| 2. 平滑 | 對價差取 1 天滾動中位數,濾掉短時間的跳動。 |
| 3. 標準化 | 用近 30 天的平均與標準差換算成 z-score,得到最後的數值。 |
因為是 z-score,數值沒有上下限,各幣種能放在同一把尺上比較。正值代表價差比近 30 天平常大,多方願意用更高的價格在合約上進場;資料裡沒有多空人數,也沒有持倉。Studio 的狀態徽章用以下門檻分級:
| 數值 | Studio 徽章 | 意思 |
|---|---|---|
| ≥ +3 | 過度樂觀 | 價差遠高於近 30 天常態,屬極端值 |
| +2 ~ +3 | 高度樂觀 | 價差明顯高於常態 |
| +0.5 ~ +2 | 樂觀 | 價差高於常態 |
| −0.5 ~ +0.5 | 中立 | 與近 30 天常態差不多 |
| ≤ −0.5 | 悲觀/高度悲觀/過度悲觀 | 與正值對稱,門檻是 −0.5、−2、−3:價差低於常態,合約相對指數偏弱 |
市場情緒的原料是「合約價 − 指數價格」的 USDT 差額,整個計算過程沒有除以價格。所以溢價比例不變時,同一個幣的價格漲得越多,USDT 價差就越大;不同幣之間則因為各自標準化,不受幣價高低影響。
舉個假設的例子:某幣 30 天前價格約 1 USDT,合約比指數高 0.001 USDT,溢價 0.1%;之後幣價漲到 2 USDT,合約仍比指數高 0.1%,價差卻變成 0.002 USDT。溢價比例完全沒變,但價差高於近 30 天平均,市場情緒會被推高。幣價在 30 天內大跌時則相反,數值會被壓低。
z-score 比的是這個幣自己近 30 天的平均。一個連續兩個月合約都比指數高出差不多價差的幣,平均會被墊高,市場情緒回到 0 附近——這時 0 的意思是「跟近 30 天差不多」,不是「沒有溢價」。
反過來,一個幣從大幅溢價回落到小幅溢價,價差低於近 30 天平均,數值可能轉成負的,但合約其實仍然比指數貴。同樣是 +2,放在不同幣、不同月份,背後的實際價差也可能差很多。
目前沒有任何官方策略使用市場情緒,以下三種用法都是示意、未回測。程式碼裡的 ±0.5 與 3 是借用 Studio 徽章門檻當起點,不是參數掃描的結果,實際使用前都要自己回測。
最直接的寫法:市場情緒高於進場門檻時做多,跌破出場門檻就空手。兩個門檻中間留一段緩衝,避免數值在單一門檻附近來回時頻繁進出。
ENTRY_TH = 0.5 # 示意:借用「樂觀」徽章門檻
EXIT_TH = -0.5 # 示意:借用「悲觀」徽章門檻
def compute_signals(df, entry_th=ENTRY_TH, exit_th=EXIT_TH):
# df['MS'] = 該幣的市場情緒數值
signal = pd.Series(np.nan, index=df.index)
signal[df['MS'] > entry_th] = 1.0 # 價差高於常態 → 做多
signal[df['MS'] < exit_th] = 0.0 # 價差低於常態 → 空手
return signal
因為數值先取過 1 天中位數,這個訊號跟著日級的價差變化走,不會對幾分鐘內的價格跳動反應。它沒有回測;門檻與方向(順勢或反向)都要自己掃描驗證。
數值到 ±3,代表價差相對近 30 天已經非常極端。一種保守的用法是不把它當進場訊號,而是加在既有策略的進場條件上,極端時先不開新倉:
# 示意:|MS| ≥ 3(過度樂觀或過度悲觀)時不進場 too_hot = df['MS'].abs() >= 3 entry = compute_entry(df) & ~too_hot
這不是反轉訊號,也沒有回測:Blave 沒有驗證過數值到 ±3 之後價格會反轉,也沒有驗證過避開極端值能改善績效;這裡只是把「價差已經極端」當成暫停開新倉的條件。±3 是相對近 30 天,價差長期很穩的幣,小變動也能到 ±3。compute_entry 換成你原本策略的進場條件。
市場情緒是日級的慢訊號,適合當背景濾網:只在它大於 0 時,才接受短窗口指標(例如多空力道)給出的做多訊號;市場情緒回到 0 以下就空手。以下是結構示意,compute_fast_entry 換成你自己的條件:
ms = fetch_market_sentiment(SYMBOL, INTERVAL, START, END, hdrs) df['MS'] = ms['alpha'] regime_long = df['MS'] > 0 # 示意:價差高於近 30 天平均才做多 fast_entry = compute_fast_entry(df) # 例如短窗口的多空力道條件 signal = pd.Series(np.nan, index=df.index) signal[regime_long & fast_entry] = 1.0 signal[~regime_long] = 0.0
這個組合沒有回測,門檻 0 只是示意;實際使用前要掃描參數、看扣掉手續費後的表現。
市場情緒只有一個設定:K 線週期(period),可選 5min、15min、1h、4h、8h、1d,最短 5 分鐘。它沒有巨鯨警報那種時間窗口參數;而且不管選哪個週期,數值都是先取過 1 天中位數的結果,週期只決定多久取一次值,不會拿掉底層的 1 天中位數平滑。
| 週期 | Studio 預設顯示範圍 | 注意 |
|---|---|---|
5min / 15min | 5min:3 天;15min:7 天 | 畫得最密,但看到的仍是日級平滑後的變化,不適合拿來抓短線 |
1h / 4h | 1h:14 天;4h:30 天 | 策略想每幾小時檢查一次時使用 |
8h / 1d | 8h:60 天;1d:180 天 | 適合看一段期間的情緒走向 |
選週期的依據是策略多久檢查一次,不要期待短週期能抓到短線。資料從 2020-01-01 起(晚上市的幣從上市日起);z-score 需要 30 天樣本,所以比較有意義的數值大約從 2020-01-31 開始,新上市的幣前 30 天也是同樣道理。
| 頁面 | 看什麼 |
|---|---|
| 總覽 | 整體情緒半圓儀表(全幣種以未平倉價值(USDT 計價)加權平均的市場情緒)+樂觀、悲觀兩張排行,欄位有幣別、24 小時漲跌、指數與狀態。 |
| 板塊 | 各板塊的市場情緒排行,板塊數值是板塊內各幣以未平倉價值加權的平均。 |
| 歷史 | 單一幣種的市場情緒柱狀圖疊上價格,可選 5min~1d 週期,並附 stat 欄位;非 Pro 用戶最近 7 天的資料延後顯示。 |
以下是組合思路,不是驗證過的結論:
| 組合 | 用途 |
|---|---|
| 市場情緒 + 巨鯨警報 | 價差升高時,用巨鯨警報看未平倉量有沒有同時反常增加,協助判斷溢價背後是否伴隨新開倉。 |
| 市場情緒 + 多空力道 | 市場情緒反應慢,用多空力道看短窗口的主動買賣,補上它看不到的短期動態。 |
API 端點是 GET /market_sentiment/get_alpha,參數有 symbol、period 與起訖日期(start_date、end_date);Blave Agent 裡對應 fetch_market_sentiment。幣種只涵蓋 Binance USDT 本位永續,其他交易所不在內。只回傳已收盤的 K 線,欄位是 timestamp、alpha 與 stat,不含價格;沒給起始日時預設抓最近 365 天,區間超過 365 天會自動截短。
stat 物件描述最新一筆數值,意思跟名字不完全一樣:
| 欄位 | 實際算法 |
|---|---|
up_prob | 用近 365 天的資料訓練邏輯迴歸模型,以市場情緒預測 24 小時後漲跌,輸出上漲的機率。訓練資料包含當下這段,屬樣本內估計,不是樣本外勝率。 |
avg_up_return /avg_down_return | 近 365 天所有「24 小時後上漲/下跌」時點的平均報酬,不分市場情緒水位。 |
exp_value | up_prob × avg_up_return +(1 − up_prob)× avg_down_return,是小數,不是百分比。 |
is_data_sufficient | 該幣資料是否早於 365 天前就開始,不是「這個水位的樣本夠不夠」。 |
stat 也是樣本內的估計——任何門檻都要用你自己的回測驗證。