🚀 AI 一键生成 joinquant 策略代码
立即体验

聚宽 ETF 策略的盈利保护应该每分钟执行吗?如何调整执行频率并比较其对收益与回撤的影响?

joinquant | 发布时间: 2026/8/6
以下内容由 EasyQuant 生成。

问题描述

聚宽 ETF 策略的盈利保护应该每分钟执行吗?
如何在聚宽中调整 ETF 策略盈利保护的执行频率,并比较每分钟执行与固定时点执行对收益和最大回撤的影响?

解决方案

在聚宽(JoinQuant)量化平台上开发 ETF 策略时,盈利保护(止盈/止损)的执行频率是一个关键的策略参数。盈利保护不一定非要每分钟执行,频繁的检测虽然能更早锁定利润,但也可能带来高昂的交易成本(滑点与佣金)并增加策略的随机波动。### 一、如何在聚宽中调整盈利保护的执行频率在聚宽中,策略的执行频率主要通过 run_daily 计划任务函数进行控制。我们可以通过调整 time 参数来改变盈利保护逻辑的触发时机:1. 每分钟执行(every_bar):在分钟回测模式下,盈利保护逻辑会在交易时间的每分钟第一秒运行。2. 固定时点执行(如 14:50):盈利保护逻辑每天只在指定的尾盘时间运行一次,避免盘中噪点干扰。#### 1. 每分钟执行盈利保护的初始化代码:python def initialize(context): # 设定真实价格模式 set_option('use_real_price', True) # 订阅 ETF 标的 g.security = '510300.XSHG' # 每分钟运行一次盈利保护检测 run_daily(profit_protection_every_minute, time='every_bar') #### 2. 固定时点执行盈利保护的初始化代码:python def initialize(context): set_option('use_real_price', True) g.security = '510300.XSHG' # 每天下午 14:50 运行一次盈利保护检测,避开盘中波动并确保有足够时间平仓 run_daily(profit_protection_at_fixed_time, time='14:50') ---### 二、核心代码实现与对比示例以下是一个完整的聚宽策略框架,展示了如何通过全局变量切换两种执行模式,并实现盈利保护(以移动止盈为例):```python
import jqdata

def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)

# 交易费率设置
set_order_cost(OrderCost(close_tax=0, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='fund')

g.security = '510300.XSHG'
g.highest_price = 0.0  # 记录买入后的最高价
g.trigger_threshold = 0.05  # 回撤 5% 触发盈利保护

# 【模式切换】True 为每分钟执行,False 为每日固定时点执行
g.every_minute_mode = False 

if g.every_minute_mode:
    run_daily(check_profit_protection, time='every_bar')
else:
    run_daily(check_profit_protection, time='14:50')

def check_profit_protection(context):
security = g.security
# 获取当前最新价
current_data = get_current_data()
current_price = current_data[security].last_price

# 如果持有仓位,进行盈利保护检测
if context.portfolio.positions[security].closeable_amount > 0:
    # 更新持仓期间的最高价
    if current_price > g.highest_price:
        g.highest_price = current_price
    
    # 计算从最高点回撤的比例
    drawdown = (g.highest_price - current_price) / g.highest_price
    
    # 触发盈利保护:回撤超过阈值,清仓止盈
    if drawdown >= g.trigger_threshold:
        order_target(security, 0)
        log.info(f"触发盈利保护,当前价 {current_price} 较最高价 {g.highest_price} 回撤达 {drawdown:.2%},执行清仓。")
        g.highest_price = 0.0
else:
    # 未持仓时,重置最高价
    g.highest_price = 0.0

```---### 三、每分钟执行 vs 固定时点执行的影响对比| 评估维度 | 每分钟执行 (every_bar) | 固定时点执行 (如 14:50) ||
| :--- | :--- | :--- | |
| 最大回撤 (Max Drawdown) | 通常更低。盘中一旦发生剧烈跳水,每分钟执行能迅速在几分钟内触发止盈,锁住利润,从而有效控制最大回撤。 | 可能偏高。如果盘中发生极端暴跌,策略必须等到 14:50 才能处理,可能会承受更大的日内回撤。 |
| 年化收益率 (Annual Return) | 不确定,受交易成本拖累严重。频繁的盘中检测容易受到“噪点”干扰导致过早止盈(假突破),且频繁交易会产生高额的滑点和佣金,侵蚀净值。 | 通常更稳定。过滤了日内的随机波动,避免了日内“闪崩后又拉回”的误判,持仓更具趋势性,整体收益表现往往更优。 |
| 交易滑点与摩擦 | 。市价单在盘中非活跃时段成交可能面临较大的滑点。 | 。尾盘 14:50 市场流动性通常较好,且每日最多交易一次,摩擦成本极低。 |### 四、量化交易员建议1. 对于高波动、高杠杆的 ETF 策略:建议采用每分钟执行,或直接使用聚宽的停止单 StopMarketOrderStyle,将风险控制放在首位,优先压低最大回撤。2. 对于宽基指数(如 300ETF、500ETF)趋势跟踪策略:强烈建议采用固定时点执行(如 14:50)。因为宽基指数日内均值回归属性强,日内波动多为噪点,尾盘一次性处理能显著提升年化收益率并降低换手率。