问题描述
解决方案
Elder-Ray 指标(多头力道/空头力道)交易策略
Elder-Ray 指标是由亚历山大·埃尔德(Alexander Elder)博士开发的,它结合了趋势跟踪指标和振荡指标的特性。该系统使用指数移动平均线(EMA)来确定趋势方向,并使用多头力道(Bull Power)和空头力道(Bear Power)来衡量价格相对于趋势的波动。
1. 指标原理与计算
Elder-Ray 指标包含三个部分:
- EMA(指数移动平均线):通常使用 13日 EMA 作为共识价值(Consensus of Value)。
- 如果收盘价高于 EMA,通常视为上升趋势。
- 如果收盘价低于 EMA,通常视为下降趋势。
- 多头力道(Bull Power):衡量买方将价格推高至平均共识价值之上的能力。
Bull Power = 当日最高价 (High) - EMA
- 空头力道(Bear Power):衡量卖方将价格推低至平均共识价值之下的能力。
Bear Power = 当日最低价 (Low) - EMA
2. 交易逻辑
根据埃尔德博士的建议,基本的交易规则如下:
买入信号(做多)
必须同时满足以下条件:
- 趋势向上:EMA 的斜率向上,或者收盘价高于 EMA。
- 空头力道为负:Bear Power < 0(表示价格回撤到了均线下方)。
- 空头力道正在减弱:Bear Power 开始回升(即 Bear Power 的数值虽然是负的,但比前一天更接近 0),这通常意味着底背离或抛压减弱。
卖出信号(平仓/做空)
满足以下任一条件:
- 趋势反转:收盘价跌破 EMA。
- 多头力道减弱: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. 策略分析与注意事项
- 趋势确认:Elder-Ray 的核心在于顺势交易。代码中使用了
current_close > current_ema来简单判断趋势。在更复杂的策略中,可以计算 EMA 的斜率(即current_ema > prev_ema)来确认趋势。 - 背离交易:Bear Power 的上升(从极负值向零轴靠近)是核心买点。这代表虽然价格可能还在低位,但卖压已经不如之前强烈,是潜在的买入时机。
- 参数调整:默认的 13 日 EMA 适用于短期波段。如果是中长线交易,可以尝试调整为 26 日或其他周期。
- 止损:该策略示例主要依赖 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' 等即可。