量化策略止损参数研究方法论:如何用历史数据找到最优止损距离

止损距离是量化策略里最难确定的参数之一。太紧频繁被扫止损,太松单次亏损超预期。 凭直觉设参数没有说服力。更可靠的方法是:用历史数据系统地研究不同止损距离对策略表现的影响,找到在多个评估维度上表现均衡的参数区间。 这篇文章讲这个研究过程的方法论,包括数据准备、参数搜索、评估指标、以及防止过拟合的注意事项。 研究框架 1. 数据准备 ├─ 选取历史数据区间(训练集) └─ 准备价格序列和信号序列 2. 参数网格搜索 ├─ 定义止损参数范围(如 0.5% - 5%,步长 0.1%) └─ 对每个参数值跑完整回测 3. 评估指标计算 ├─ 总收益率 ├─ 最大回撤 ├─ 夏普比率 ├─ 胜率 × 盈亏比 └─ 止损触发率 4. 结果分析 ├─ 绘制参数敏感性曲线 ├─ 找稳健区间(小变化 → 小影响) └─ 在验证集上验证 5. 确定最终参数 数据准备 import pandas as pd import numpy as np from binance.client import Client def get_klines(symbol: str, interval: str, start: str, end: str) -> pd.DataFrame: """获取 Binance K 线数据""" client = Client() # 公开数据不需要 API 密钥 klines = client.get_historical_klines(symbol, interval, start, end) df = pd.DataFrame(klines, columns=[ 'timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_vol', 'trades', 'taker_buy_base', 'taker_buy_quote', 'ignore' ]) for col in ['open', 'high', 'low', 'close', 'volume']: df[col] = df[col].astype(float) df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') df.set_index('timestamp', inplace=True) return df # 获取数据:分成训练集和验证集(时间序列不能随机分割!) df_train = get_klines("BTCUSDT", "4h", "2023-01-01", "2024-06-30") # 训练集 df_val = get_klines("BTCUSDT", "4h", "2024-07-01", "2024-12-31") # 验证集 为什么不能随机分割? ...

2026-04-15 · 4 min · 660 words · Panshi

Binance 合约交易风控体系:仓位管理、止损设置、熔断机制

💡 国内提示:Binance 官网在中国大陆无法直连,访问需自备网络工具;法币入金不支持银行卡,主要走 C2C(USDT↔CNY)通道完成。 合约交易里,盈利策略和亏损策略的区别,很多时候不是信号对不对,而是风控做没做。 一个好的入场信号配上差的风控,会在一次大波动里把所有收益吐回去。这篇文章专门讲合约风控的框架:你需要在哪些层次做控制,每层具体怎么设置。 三个层次的风控 层次 1:仓位管理 — 每次开多大的仓 层次 2:止损设置 — 单笔交易最多亏多少 层次 3:熔断机制 — 连续亏损后强制暂停 这三层缺一不可。仓位管理控制单次风险暴露,止损控制单笔最大损失,熔断防止在策略失效时持续亏损。 层次 1:仓位管理 固定比例法(推荐) 每次开仓金额 = 账户总权益 × 固定比例 def calc_position_size(equity: float, risk_pct: float, leverage: int, entry_price: float) -> float: """ equity: 账户总权益(USDT) risk_pct: 单次风险比例,如 0.02 = 2% leverage: 杠杆倍数 entry_price: 开仓价格 返回: 合约张数(BTCUSDT 每张 = 0.001 BTC) """ risk_amount = equity * risk_pct # 实际愿意亏的金额 notional = risk_amount * leverage # 对应名义价值 qty = notional / entry_price return qty 为什么用固定比例而不是固定金额? ...

2026-04-15 · 3 min · 633 words · Panshi

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

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