
量化策略止损怎么设:从北极星策略出发讲通用止损设计
止损是量化策略里最容易被忽视、也最容易出问题的模块。很多新手策略回测看起来不错,实盘一跑就崩,往往根源在止损设计有问题:要么止损太宽导致单次亏损过大,要么止损太紧被市场噪音频繁触发。 这篇文章从 北极星策略 的实际设计出发,讲通用的止损设计思路。 为什么需要止损 止损本质上是承认错误的机制。趋势跟踪策略的逻辑是:大多数时候市场没有趋势,策略会小亏;少数时候有趋势,策略要大赚,用大赚覆盖小亏。 如果没有止损,那次"大亏"有可能把账户打穿,后面的大赚机会都没了。 数学上,止损控制的是单次最大亏损,进而控制最大回撤: 最大回撤 ≈ 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 倍数选择: ...
