🚀 AI 一键生成 joinquant 策略代码

JoinQuant 平台如何利用多头和空头力道因子(Elder-Ray)构建策略?

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

问题描述

如何使用 Elder-Ray 指标(多头力道/空头力道)进行交易?

解决方案

Elder-Ray 指标(多头力道/空头力道)交易策略

Elder-Ray 指标是由亚历山大·埃尔德(Alexander Elder)博士开发的,它结合了趋势跟踪指标和振荡指标的特性。该系统使用指数移动平均线(EMA)来确定趋势方向,并使用多头力道(Bull Power)和空头力道(Bear Power)来衡量价格相对于趋势的波动。

1. 指标原理与计算

Elder-Ray 指标包含三个部分:

  1. EMA(指数移动平均线):通常使用 13日 EMA 作为共识价值(Consensus of Value)。
    • 如果收盘价高于 EMA,通常视为上升趋势。
    • 如果收盘价低于 EMA,通常视为下降趋势。
  2. 多头力道(Bull Power):衡量买方将价格推高至平均共识价值之上的能力。
    • Bull Power = 当日最高价 (High) - EMA
  3. 空头力道(Bear Power):衡量卖方将价格推低至平均共识价值之下的能力。
    • Bear Power = 当日最低价 (Low) - EMA

2. 交易逻辑

根据埃尔德博士的建议,基本的交易规则如下:

买入信号(做多)

必须同时满足以下条件:

  1. 趋势向上:EMA 的斜率向上,或者收盘价高于 EMA。
  2. 空头力道为负:Bear Power < 0(表示价格回撤到了均线下方)。
  3. 空头力道正在减弱:Bear Power 开始回升(即 Bear Power 的数值虽然是负的,但比前一天更接近 0),这通常意味着底背离或抛压减弱。

卖出信号(平仓/做空)

满足以下任一条件:

  1. 趋势反转:收盘价跌破 EMA。
  2. 多头力道减弱:Bull Power 虽然为正,但开始下降(顶背离)。

3. JoinQuant 策略代码实现

以下是一个完整的策略代码,实现了基于 Elder-Ray 指标的买入和卖出逻辑。

# -*- coding: utf-8 -*-
import talib
import numpy as np

def initialize(context):
    """
    初始化函数
    """
    # 设定基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')
    
    # 设定操作的股票(以平安银行为例)
    g.security = '000001.XSHE'
    
    # Elder-Ray 指标参数
    g.ema_period = 13  # EMA周期,通常为13
    
    # 运行函数(每天开盘时运行)
    run_daily(trade_logic, time='every_bar')

def trade_logic(context):
    """
    交易主逻辑
    """
    security = g.security
    
    # 1. 获取历史数据
    # 获取足够长的数据以计算EMA,这里取 period * 3 以保证EMA计算稳定
    # 需要获取 high, low, close
    data = attribute_history(security, g.ema_period * 3, '1d', ['high', 'low', 'close'])
    
    if len(data) < g.ema_period:
        return

    close_prices = data['close'].values
    high_prices = data['high'].values
    low_prices = data['low'].values
    
    # 2. 计算指标
    # 计算 13日 EMA
    ema = talib.EMA(close_prices, timeperiod=g.ema_period)
    
    # 获取当前的 EMA, High, Low
    current_ema = ema[-1]
    current_high = high_prices[-1]
    current_low = low_prices[-1]
    current_close = close_prices[-1]
    
    # 获取前一天的 EMA, Low (用于判断 Bear Power 走势)
    prev_ema = ema[-2]
    prev_low = low_prices[-2]
    
    # 计算 Bull Power 和 Bear Power
    # Bull Power = High - EMA
    # Bear Power = Low - EMA
    current_bull_power = current_high - current_ema
    current_bear_power = current_low - current_ema
    prev_bear_power = prev_low - prev_ema
    
    # 3. 交易信号判断
    
    # 获取当前仓位
    position = context.portfolio.positions[security].closeable_amount
    cash = context.portfolio.available_cash
    
    # --- 买入逻辑 ---
    # 条件1: 趋势向上 (收盘价 > EMA) 
    # 条件2: Bear Power 为负 (价格回撤)
    # 条件3: Bear Power 上升 (空头力量减弱/底背离) -> 当前 Bear Power > 昨日 Bear Power
    
    is_trend_up = current_close > current_ema
    is_bear_negative = current_bear_power < 0
    is_bear_rising = current_bear_power > prev_bear_power
    
    if is_trend_up and is_bear_negative and is_bear_rising:
        if cash > 0:
            # 全仓买入
            order_value(security, cash)
            log.info(f"买入信号触发: 收盘价={current_close:.2f}, EMA={current_ema:.2f}, BearPower={current_bear_power:.2f}")

    # --- 卖出逻辑 ---
    # 条件: 收盘价跌破 EMA (趋势反转) 或者 Bull Power 极度衰竭(此处简化为趋势反转平仓)
    # 也可以加入 Bull Power < Prev Bull Power 的判断作为止盈
    
    elif current_close < current_ema and position > 0:
        # 清仓
        order_target(security, 0)
        log.info(f"卖出信号触发: 收盘价={current_close:.2f}, EMA={current_ema:.2f}")

    # 4. 记录数据以便在回测图中查看
    record(Price=current_close, EMA=current_ema, BullPower=current_bull_power, BearPower=current_bear_power)

4. 策略分析与注意事项

  1. 趋势确认:Elder-Ray 的核心在于顺势交易。代码中使用了 current_close > current_ema 来简单判断趋势。在更复杂的策略中,可以计算 EMA 的斜率(即 current_ema > prev_ema)来确认趋势。
  2. 背离交易:Bear Power 的上升(从极负值向零轴靠近)是核心买点。这代表虽然价格可能还在低位,但卖压已经不如之前强烈,是潜在的买入时机。
  3. 参数调整:默认的 13 日 EMA 适用于短期波段。如果是中长线交易,可以尝试调整为 26 日或其他周期。
  4. 止损:该策略示例主要依赖 EMA 的跌破作为离场信号。在实盘中,建议加入固定的百分比止损或基于 ATR 的波动率止损来控制风险。

Q&A

Q1: 为什么 Bear Power 为负时反而是买入机会?
A1: 在上升趋势中(EMA向上),价格的回调是正常的。Bear Power 为负说明价格跌破了均线(回调),而 Bear Power 开始回升说明这种回调的力度正在减弱,买方开始重新介入,因此是顺势策略中的“逢低买入”点。

Q2: 如何在 JoinQuant 中查看 Bull Power 和 Bear Power 的图形?
A2: 在上面的代码中,我们使用了 record() 函数。回测结束后,在回测详情页面的图表下方,会显示出我们记录的 Price, EMA, BullPower, BearPower 的曲线,方便进行可视化分析。

Q3: 这个策略适合什么频率的数据?
A3: Elder-Ray 最初是为日线设计的,但它也适用于分钟级别(如 60分钟或 30分钟)的数据。只需在 attribute_history 中将单位 '1d' 改为 '60m' 等即可。