前言

做A股波段交易的朋友基本都接触过ENE轨道线,对比布林带,ENE参数固定、震荡区间判断更贴合国内个股走势,专门用来做高抛低吸、识别趋势突破。

网上很多Python实现ENE的代码存在致命错误:误用EMA指数均线代替MA简单均线,最终计算结果和通达信、东方财富完全对不上。本文严格按照通达信原版公式实现,仅使用pandas、numpy基础库,无第三方量化依赖,包含指标计算、可视化绘图、自动交易信号判断,所有代码可直接复制运行,可集成到回测系统、量化分析工具中。

风险提示:本文仅为Python编程与量化指标教学,不构成任何股票投资建议。

一、ENE指标原理与通达信标准计算公式

1. 指标构成

ENE轨道线一共三条线:中轨ENE、上轨UPPER(压力线)、下轨LOWER(支撑线)。
A股软件统一默认参数:N=10,M1=11,M2=9。

2. 通达信原生公式

MA:=MA(CLOSE,10);
UPPER:=(1+11/100)*MA;
LOWER:=(1-9/100)*MA;
ENE:=(UPPER+LOWER)/2;

拆解数学公式:

  1. MA=NMA = NMA=N日收盘价简单移动平均值(SMA)
  2. UPPER=MA×(1+M1÷100)UPPER = MA × (1 + M1 ÷ 100)UPPER=MA×(1+M1÷100)
  3. LOWER=MA×(1−M2÷100)LOWER = MA × (1 - M2 ÷ 100)LOWER=MA×(1M2÷100)
  4. ENE=(UPPER+LOWER)÷2ENE = (UPPER + LOWER) ÷ 2ENE=(UPPER+LOWER)÷2

3. ENE基础交易逻辑

  1. 震荡行情:股价在上轨、下轨之间来回波动,靠近上轨减仓,回踩下轨低吸;
  2. 向上突破:股价持续站稳上轨上方,多头趋势开启,顺势持有;
  3. 向下跌破:股价有效跌破下轨,支撑失效,短期规避下跌风险;
  4. 中轨分水岭:股价运行在ENE中轨之上属于多头格局,下方为空头格局。

二、环境依赖安装

执行命令安装数据分析和绘图库:

pip install pandas numpy matplotlib

三、Python完整实现ENE指标计算

3.1 通用封装计算函数

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def calc_ene(df, close_col="close", n=10, m1=11, m2=9):
    """
    严格复刻通达信ENE轨道线计算逻辑
    :param df: 股票K线DataFrame数据集
    :param close_col: 收盘价字段名称
    :param n: 均线周期 默认10
    :param m1: 上轨上浮百分比 默认11
    :param m2: 下轨下沉百分比 默认9
    :return: 新增MA、UPPER、LOWER、ENE四列的DataFrame
    """
    data = df.copy()
    # 核心:使用简单移动平均rolling mean,不能用ewm指数均线
    data["MA"] = data[close_col].rolling(window=n).mean()
    # 计算上下轨道
    data["UPPER"] = data["MA"] * (1 + m1 / 100)
    data["LOWER"] = data["MA"] * (1 - m2 / 100)
    # 计算ENE中轨
    data["ENE"] = (data["UPPER"] + data["LOWER"]) / 2
    return data

3.2 模拟行情数据测试运行

构造150天模拟股价,调用函数计算并打印结果:

if __name__ == "__main__":
    # 生成模拟K线数据
    np.random.seed(999)
    price = 18
    close_list = []
    for _ in range(150):
        price += np.random.normal(0, 0.2)
        close_list.append(round(price, 2))

    df = pd.DataFrame({
        "date": pd.date_range(start="2026-01-01", periods=150, freq="D"),
        "close": close_list
    })

    # 计算ENE指标
    df = calc_ene(df)
    # 输出最后15行数据
    print(df[["date", "close", "MA", "ENE", "UPPER", "LOWER"]].tail(15))

运行说明:前n-1行数据为NaN,滚动均线需要足够周期数据,属于正常现象,回测时需过滤空值。

四、ENE指标可视化绘图

还原行情软件展示样式,绘制股价曲线+三条轨道,并填充通道区间:

def plot_ene_chart(df):
    # 解决matplotlib中文、负号乱码问题
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False

    plt.figure(figsize=(14, 7))
    # 绘制收盘价
    plt.plot(df["date"], df["close"], color="#ff4d4f", linewidth=1.8, label="收盘价")
    # 绘制三条轨道线
    plt.plot(df["date"], df["UPPER"], color="#1890ff", linewidth=1.2, label="上轨UPPER(压力)")
    plt.plot(df["date"], df["ENE"], color="#52c41a", linewidth=1.2, label="ENE中轨")
    plt.plot(df["date"], df["LOWER"], color="#fa8c16", linewidth=1.2, label="下轨LOWER(支撑)")
    # 填充轨道区间,直观展示波动通道
    plt.fill_between(df["date"], df["UPPER"], df["LOWER"], alpha=0.12, color="#91caff")

    plt.title("股价走势与ENE轨道线指标", fontsize=14)
    plt.xlabel("日期")
    plt.ylabel("股价")
    plt.legend(loc="best")
    plt.grid(alpha=0.3)
    plt.tight_layout()
    plt.show()

# 调用绘图
plot_ene_chart(df)

五、自动识别ENE交易信号

封装信号生成逻辑,自动识别低吸、高抛、突破、破位信号,可直接用于策略回测:

def get_ene_signal(df, tolerance=0.01):
    """
    生成ENE交易信号
    :param tolerance: 触碰轨道容差,避免微小价格波动频繁触发信号
    :return: 新增ene_signal字段
    信号标识:buy低吸、sell高抛、break_up向上突破、break_down向下破位、None无信号
    """
    data = df.copy()
    signal_arr = []
    for _, row in data.iterrows():
        close = row["close"]
        upper = row["UPPER"]
        lower = row["LOWER"]
        # 均线未生成,跳过
        if np.isnan(upper) or np.isnan(lower):
            signal_arr.append(None)
            continue
        # 触碰下轨,低吸信号
        if close <= lower * (1 + tolerance):
            signal_arr.append("buy")
        # 触碰上轨,高抛信号
        elif close >= upper * (1 - tolerance):
            signal_arr.append("sell")
        # 有效突破上轨
        elif close > upper:
            signal_arr.append("break_up")
        # 有效跌破下轨
        elif close < lower:
            signal_arr.append("break_down")
        else:
            signal_arr.append(None)
    data["ene_signal"] = signal_arr
    return data

# 生成交易信号
df = get_ene_signal(df)

# 筛选打印所有买卖信号
buy_points = df[df["ene_signal"] == "buy"]
sell_points = df[df["ene_signal"] == "sell"]

print("====ENE下轨低吸信号====")
print(buy_points[["date", "close", "LOWER"]])
print("\n====ENE上轨高抛信号====")
print(sell_points[["date", "close", "UPPER"]])

六、开发常见踩坑总结

1. 混淆MA简单均线与EMA指数均线(最大错误)

ENE官方公式基于rolling简单移动平均,很多新手使用ewm()指数均线,计算结果和行情软件偏差巨大,这是首要注意点。

2. 未过滤前N行空值

滚动窗口计算均线时,前n-1行无数值,回测、策略逻辑中不做过滤会引发空值报错。

3. 随意修改标准参数

A股个股通用参数10/11/9,大盘指数可微调N=20,频繁改动参数会破坏指标原有波动逻辑,降低参考价值。

4. 单边行情指标失效

ENE优势在震荡行情,持续单边上涨时股价长期贴在上轨,单边下跌持续跌破下轨,仅靠ENE容易踏空或深套,建议搭配MACD、成交量共振判断。

5. 不区分真假突破

单日短暂刺破轨道属于假突破,量化策略中建议增加连续2日站稳轨道作为有效突破判定条件,减少无效信号。

七、实战拓展优化方向

  1. 对接Akshare、Tushare接口获取真实A股日线、分钟K线数据,替换模拟数据;
  2. 增加轨道收敛、发散判断,捕捉行情启动临界点;
  3. 构建ENE+MACD共振交易策略,结合双指标过滤虚假信号;
  4. 将计算函数封装为FastAPI/Flask接口,供前端量化页面实时计算指标;
  5. 搭建回测框架,基于ENE买卖信号进行历史收益测算、风险评估。

八、全文总结

  1. ENE轨道线核心逻辑:以10日简单均线为基准,上下浮动固定百分比构建支撑压力通道;
  2. Python复刻关键要点:使用rolling简单移动平均,严格遵循10、11、9标准参数,保证和通达信数据对齐;
  3. 适用场景优先震荡行情,轨内高抛低吸,轨道外突破代表趋势异动;
  4. 量化开发尽量手写原生指标,不依赖TA-Lib等第三方黑盒库,方便自定义改造、问题排查与系统集成。

更多推荐