量化策略止損怎麼設:從北極星策略出發講通用止損設計

止損是量化策略裡最容易被忽視、也最容易出問題的模組。很多新手策略回測看起來不錯,實盤一跑就崩,往往根源在止損設計有問題:要麼止損太寬導致單次虧損過大,要麼止損太緊被市場噪音訊繁觸發。 這篇文章從 北極星策略 的實際設計出發,講通用的止損設計思路。 為什麼需要止損 止損本質上是承認錯誤的機制。趨勢跟蹤策略的邏輯是:大多數時候市場沒有趨勢,策略會小虧;少數時候有趨勢,策略要大賺,用大賺覆蓋小虧。 如果沒有止損,那次"大虧"有可能把賬戶打穿,後面的大賺機會都沒了。 數學上,止損控制的是單次最大虧損,進而控制最大回撤: 最大回撤 ≈ f(止損比例, 連續虧損次數, 勝率) 策略在某段時間內 5 連敗是很正常的,如果每次虧 10%,5 連敗後賬戶還剩 59%;如果每次虧 3%,5 連敗後還剩 85%,差距非常大。 止損型別 1. 固定百分比止損 最簡單的方式:入場後虧損超過固定比例就出場。 # 入場價 40000,止損 3% entry_price = 40000 stop_loss_pct = 0.03 stop_price_long = entry_price * (1 - stop_loss_pct) # 做多止損:38800 stop_price_short = entry_price * (1 + stop_loss_pct) # 做空止損:41200 優點: 簡單、可計算、風險固定 缺點: 忽略了市場的波動率,BTC 平時日內波動可能就有 3%,容易被噪音觸發 適用場景: 高時間週期(日線以上),或者已經驗證止損比例遠大於平均波動 2. ATR 動態止損(推薦) ATR(Average True Range,平均真實波幅)衡量的是市場最近的波動率。用 ATR 倍數設止損,波動大的時候止損寬,波動小的時候止損窄,更貼近市場實際。 import pandas as pd def calculate_atr(df, period=14): """計算 ATR""" high = df['high'] low = df['low'] close = df['close'] tr1 = high - low tr2 = abs(high - close.shift(1)) tr3 = abs(low - close.shift(1)) true_range = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1) atr = true_range.rolling(period).mean() return atr def get_stop_price(entry_price, atr_value, direction, multiplier=2.0): """基於 ATR 的止損價""" if direction == 'long': return entry_price - atr_value * multiplier else: return entry_price + atr_value * multiplier # 示例:BTC 1H,ATR=1200,入場 40000,做多 # 止損 = 40000 - 1200 * 2 = 37600(-6%) ATR 倍數選擇: ...

2026-04-10 · 3 min · 468 words · 磐石

用 Claude 寫量化策略:從零到訊號推送的完整流程

量化策略開發有個高門檻:你得懂交易邏輯,還得會寫程式碼。Claude 把這個門檻降低了一半——你只需要懂交易邏輯,程式碼的部分可以讓它來。 這篇文章記錄我用 Claude 從零開始寫一個完整量化訊號系統的過程。 我的策略背景 我跑的是突破類趨勢策略,核心邏輯是唐奇安通道(Donchian Channel): 當價格突破過去 N 根 K 線的最高價 → 買入 當價格跌破過去 M 根 K 線的最低價 → 賣出 聽起來簡單,但要做成能在 8 個品種、3 個時間週期上自動跑的系統,並且每半小時推送訊號到 Telegram,需要不少工程量。 第一步:跟 Claude 描述策略邏輯 我的輸入很簡單: “幫我寫一個 Python 指令碼,用 yfinance 拉 BTC 的 1 小時 K 線,實現唐奇安通道突破策略:價格突破過去 20 根最高價買入,跌破過去 10 根最低價賣出。每次訊號變化時透過 openclaw 發 Telegram 訊息。” Claude 給出的初版程式碼覆蓋了: yfinance 資料拉取 訊號計算邏輯 狀態持久化(避免重複推送) openclaw CLI 呼叫傳送訊息 這一步花了約 10 分鐘。 ...

2026-04-08 · 1 min · 199 words · 磐石