3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
Elder-Ray 指标是由亚历山大·埃尔德(Alexander Elder)博士开发的,它结合了趋势跟踪指标和振荡指标的特性。该系统使用指数移动平均线(EMA)来确定趋势方向,并使用多头力道(Bull Power)和空头力道(Bear Power)来衡量价格相对于趋势的波动。
Elder-Ray 指标包含三个部分:
Bull Power = 当日最高价 (High) - EMABear Power = 当日最低价 (Low) - EMA根据埃尔德博士的建议,基本的交易规则如下:
必须同时满足以下条件:
满足以下任一条件:
以下是一个完整的策略代码,实现了基于 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)
current_close > current_ema 来简单判断趋势。在更复杂的策略中,可以计算 EMA 的斜率(即 current_ema > prev_ema)来确认趋势。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' 等即可。