量化策略止损怎么设:从北极星策略出发讲通用止损设计

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

用 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 · Panshi