QMT策略中的止损止盈如何设计?动态跟踪止损代码示例

任何实盘策略都必须包含风险控制模块,其中最基本的就是止损和止盈。QMT的自动化环境让止损止盈变得十分精确,不再依赖人工判断。下面介绍几种常见的设计方案,并给出核心代码逻辑。


最简单的固定止损止盈:设定买入后,如果股价下跌超过5%,立即卖出止损;如果上涨超过10%,立即卖出止盈。代码实现如下(在每次买入后记录买入价,并在每个tick检查当前价):


`

def on_tick(context, tick):

   for stock, info in context.position.items():

       pnl_pct = (tick.last - info.buy_price) / info.buy_price

       if pnl_pct <= -0.05:

           order_target_percent(stock, 0)

       elif pnl_pct >= 0.10:

           order_target_percent(stock, 0)

`


但固定百分比有缺陷:牛市容易过早止盈,熊市止损后又反弹。更高级的是动态跟踪止损。例如,设置一个最高价回撤止损:记录自买入以来的最高价,当股价从最高价下跌超过某个百分比(如8%)时卖出。这样可以锁定利润,同时给趋势留出空间。


代码示例:


`

def on_tick(context, tick):

   for stock, info in context.position.items():

       if tick.last > info.high_price:

           info.high_price = tick.last

       drawdown = (info.high_price - tick.last) / info.high_price

       if drawdown >= 0.08:

           order_target_percent(stock, 0)

`


另一种是基于ATR(平均真实波幅)的动态止损。ATR反映了股票的波动率,波动大的股票设置更宽的止损。例如,止损价 = 买入价 - 2 * ATR(14)。这种方法比固定百分比更科学。


在QMT中,ATR可以通过以下代码计算:


`

atr = talib.ATR(high, low, close, timeperiod=14)[-1]

stop_loss_price = buy_price - 2 * atr

`


除了止损,还可以设置“时间止损”:如果持有超过N天仍然没有盈利,则平仓。这可以避免资金长时间被无效率的持仓占用。代码:如果当前日期减去买入日期大于持有天数且当前盈利为负,则卖出。


注意,止损止盈逻辑应在策略的handle_tick或handle_bar中执行,且要放在主策略信号之前,确保风控优先于开仓。另外,对于多策略多标的,建议设置全局最大回撤止损:当账户总资产从最高点回撤超过一定比例(如10%)时,平仓所有头寸并停止交易。


无论采用哪种方式,都要在模拟盘中充分测试,避免过于敏感的止损导致频繁被扫出局。国金证券的QMT支持实时tick级别的风控执行,10万资金即可开通。量化社群中也有很多关于不同品种止损参数的经验值可以参考。此外,两融全线上办理,方便你在止损后快速调整资金配置。记住,风控是量化交易的生命线,宁可错过,不可做错。



温馨提示:投资有风险,选择需谨慎。

相关文章