🚀 AI 一键生成 joinquant 策略代码

JoinQuant 平台江恩高低点激活器(Gann Hi-Lo Activator)策略开发

joinquant | 发布时间: 2025/12/23
以下内容由 EasyQuant 生成。

问题描述

如何编写江恩高低点 Gann Hi-Lo Activator 策略?

解决方案

江恩高低点 (Gann Hi-Lo Activator) 策略

江恩高低点指标(Gann Hi-Lo Activator)是一种趋势跟踪指标,由罗伯特·克劳斯(Robert Krausz)在《斐波那契与江恩的新前沿》一书中介绍。它主要用于确定市场的短期趋势,并产生买卖信号。

策略原理

该指标由两条简单的移动平均线(SMA)组成:

  1. 高点均线 (Hi-Activator):过去 $N$ 个周期最高价的简单移动平均。
  2. 低点均线 (Lo-Activator):过去 $N$ 个周期最低价的简单移动平均。
    • 通常 $N$ 取值为 3。

交易逻辑:

  • 买入信号:当收盘价(或当前价格)上穿 高点均线时,认为趋势转多,执行买入。此时低点均线作为止损线。
  • 卖出信号:当收盘价(或当前价格)下穿 低点均线时,认为趋势转空,执行卖出(或平仓)。此时高点均线作为止损线。

聚宽 (JoinQuant) 策略代码实现

以下是一个完整的、可直接在聚宽回测环境中运行的策略代码。该策略默认在日线级别运行,选取单只股票(如平安银行)进行演示。

# -*- coding: utf-8 -*-
import jqdata

def initialize(context):
    """
    初始化函数,设定基准、手续费、滑点及策略参数
    """
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')
    
    # 设定股票类每笔交易时的手续费
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 定义要操作的股票,这里以平安银行为例
    g.security = '000001.XSHE'
    
    # 江恩高低点参数:周期 N,通常为 3
    g.n_period = 3
    
    # 每天收盘前运行策略 (比如 14:50)
    run_daily(trade_logic, time='14:50')

def trade_logic(context):
    """
    交易逻辑函数
    """
    security = g.security
    
    # 获取过去 N 天的最高价和最低价数据 (不包含今天,用于计算昨天的指标值作为参考,或者包含今天用于实时计算)
    # 这里我们获取过去 N 天的数据(不含当前未收盘的bar),加上当前最新价格进行判断
    # 注意:为了稳健,我们通常使用截止到昨天的 N 天均线与今天的价格进行比较
    
    # 获取过去 g.n_period 天的数据(不包含今天)
    hist_data = attribute_history(security, g.n_period, '1d', ['high', 'low'], skip_paused=True)
    
    # 如果数据不足(例如停牌或刚上市),则跳过
    if len(hist_data) < g.n_period:
        return

    # 计算高点均线 (SMA of Highs)
    high_ma = hist_data['high'].mean()
    
    # 计算低点均线 (SMA of Lows)
    low_ma = hist_data['low'].mean()
    
    # 获取当前最新价格
    current_data = get_current_data()
    current_price = current_data[security].last_price
    
    # 获取当前持仓
    position = context.portfolio.positions[security]
    
    # --- 交易信号判断 ---
    
    # 1. 买入信号:当前价格高于过去N天的高点均线
    # 且当前无持仓
    if current_price > high_ma and position.closeable_amount == 0:
        # 全仓买入
        order_value(security, context.portfolio.available_cash)
        log.info("买入信号触发:价格(%.2f) > 高点均线(%.2f)" % (current_price, high_ma))
        
    # 2. 卖出信号:当前价格低于过去N天的低点均线
    # 且当前有持仓
    elif current_price < low_ma and position.closeable_amount > 0:
        # 清仓卖出
        order_target(security, 0)
        log.info("卖出信号触发:价格(%.2f) < 低点均线(%.2f)" % (current_price, low_ma))
        
    # 记录指标值以便在回测图表中查看
    record(Price=current_price, High_MA=high_ma, Low_MA=low_ma)

代码解析

  1. 参数设置 (initialize):

    • g.n_period = 3: 定义了江恩高低点的核心参数。
    • run_daily(trade_logic, time='14:50'): 选择在收盘前进行判断,这样既能利用当天的价格信息,又能确保当天成交。
  2. 数据获取 (trade_logic):

    • 使用 attribute_history 获取过去 3 天(不含今天)的最高价和最低价。
    • 计算 high_ma (阻力线/做空止损线) 和 low_ma (支撑线/做多止损线)。
  3. 信号逻辑:

    • 做多: 当 current_price > high_ma 时,意味着价格突破了阻力区间,趋势向上。
    • 平仓: 当 current_price < low_ma 时,意味着价格跌破了支撑区间,趋势向下。

常见问题 Q&A

Q1: 这个策略适合什么频率?
A: 江恩高低点策略最初是为日线设计的,但在分钟级别(如 30分钟、60分钟)上也有应用。如果要在分钟级别回测,需要将 attribute_history 的单位改为 'xm' (如 '60m'),并将 run_daily 改为 handle_data 或分钟级的定时运行。

Q2: 如何优化这个策略?
A:

  1. 结合趋势过滤器:仅在长期均线(如 MA200)之上才执行买入信号。
  2. 参数调整:虽然经典参数是 3,但对于波动率不同的标的,可以尝试 4 到 10 之间的参数。
  3. 止损优化:除了依靠低点均线止损外,可以加入固定百分比止损。

Q3: 为什么使用 14:50 下单而不是收盘后?
A: 在 A 股市场,T+1 制度下,如果在收盘后(15:00)产生信号,只能第二天开盘交易,这会产生隔夜跳空风险。在 14:50 下单可以近似代表以收盘价成交,减少滑点和隔夜风险。

Q4: 如何在图表中看到这两条线?
A: 代码中最后一行使用了 record(Price=current_price, High_MA=high_ma, Low_MA=low_ma)。回测结束后,在回测详情页面的收益图下方,会显示这三个变量的曲线图,方便复盘分析。