问题描述
解决方案
江恩高低点 (Gann Hi-Lo Activator) 策略
江恩高低点指标(Gann Hi-Lo Activator)是一种趋势跟踪指标,由罗伯特·克劳斯(Robert Krausz)在《斐波那契与江恩的新前沿》一书中介绍。它主要用于确定市场的短期趋势,并产生买卖信号。
策略原理
该指标由两条简单的移动平均线(SMA)组成:
- 高点均线 (Hi-Activator):过去 $N$ 个周期最高价的简单移动平均。
- 低点均线 (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)
代码解析
-
参数设置 (
initialize):g.n_period = 3: 定义了江恩高低点的核心参数。run_daily(trade_logic, time='14:50'): 选择在收盘前进行判断,这样既能利用当天的价格信息,又能确保当天成交。
-
数据获取 (
trade_logic):- 使用
attribute_history获取过去 3 天(不含今天)的最高价和最低价。 - 计算
high_ma(阻力线/做空止损线) 和low_ma(支撑线/做多止损线)。
- 使用
-
信号逻辑:
- 做多: 当
current_price > high_ma时,意味着价格突破了阻力区间,趋势向上。 - 平仓: 当
current_price < low_ma时,意味着价格跌破了支撑区间,趋势向下。
- 做多: 当
常见问题 Q&A
Q1: 这个策略适合什么频率?
A: 江恩高低点策略最初是为日线设计的,但在分钟级别(如 30分钟、60分钟)上也有应用。如果要在分钟级别回测,需要将 attribute_history 的单位改为 'xm' (如 '60m'),并将 run_daily 改为 handle_data 或分钟级的定时运行。
Q2: 如何优化这个策略?
A:
- 结合趋势过滤器:仅在长期均线(如 MA200)之上才执行买入信号。
- 参数调整:虽然经典参数是 3,但对于波动率不同的标的,可以尝试 4 到 10 之间的参数。
- 止损优化:除了依靠低点均线止损外,可以加入固定百分比止损。
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)。回测结束后,在回测详情页面的收益图下方,会显示这三个变量的曲线图,方便复盘分析。