EsTalib技术指标库

极智量化内置了一个用 NumericSeries 封装好的指标函数包 EsTalib.py,以及一个类形式的指标实现 EsTaClass.py。它们与第三方库 talib 互为补充:talib 适合无状态的一次性计算,EsTalibU_ 系列则适合需要「逐 Bar 递推、保存中间状态」的场合。

EsTalib 函数一览

这些函数以 U_ 开头,定义在 EsSeries.NumericSeries 之上。有状态函数的第一个参数 X 是一个 NumericSeries,用来保存上一次的递推值。

函数含义典型用法
U_MA(data, period)简单移动平均U_MA(Close(), 20)
U_Average(data, period)最近 period 周期均值同上,period 为 0 时按 1 处理
U_AverageFC(X, data, period)快速均值(递推)需维护 X = NumericSeries()
U_EMA(X, data, period)指数平均(递推)X[-1] = U_EMA(X, Close(), 10)
U_XAverage(X, data, period)指数平均(同 U_EMA)平滑因子 2/(period+1)
U_SMA(X, data, period, weight)加权递推平均X[-1] = U_SMA(X, Close(), 10, 2)
U_Summation(data, period)最近 period 周期求和U_Summation(Vol(), 5)
U_Highest(data, period)最近 period 周期最高U_Highest(High(), 12)
U_Lowest(data, period)最近 period 周期最低U_Lowest(Low(), 12)
U_VAR(data, period)估计方差基于 numpy.var
U_STD(data, period)标准差基于 numpy.std

注意:U_EMA / U_SMA / U_XAverage / U_AverageFC有状态的,必须先在策略全局区建一个 NumericSeries 传入,并在每次 handle_data 里把结果写回 X[-1],下一根 Bar 才能读到上一次的值。

无状态函数用法

U_MA / U_Highest / U_Lowest / U_Summation / U_VAR / U_STD 不依赖历史状态,直接传数据序列即可,和 talib 用法接近:

from EsTalib import U_MA, U_Highest, U_Lowest, U_STD

def handle_data(context):
    if len(Close()) < 20:
        return
    ma20   = U_MA(Close(), 20)
    hh12   = U_Highest(High(), 12)
    ll12   = U_Lowest(Low(), 12)
    std20  = U_STD(Close(), 20)
    PlotNumeric('ma', ma20, RGB_Red())
    PlotNumeric('hh', hh12, RGB_Blue())

有状态函数用法

以 EMA 为例,关键是维护一个 NumericSeries 承载递推值

from EsSeries import NumericSeries
from EsTalib import U_EMA

ema_x = NumericSeries()       # 全局区创建

def handle_data(context):
    if len(Close()) == 0:
        return
    ema_x[-1] = U_EMA(ema_x, Close(), 10)   # 写回,供下一根 Bar 读取
    PlotNumeric('ema', ema_x[-1], RGB_Red())

U_SMA 同理,多一个 weight 权重参数,递推公式为 (X[-1]*(period-weight) + data[-1]*weight)/period

EsTaClass:类形式的指标

EsTaClass.py封装更复杂的多输出指标,典型代表是抛物线转向 UC_SAR。它内部维护 Af / ParOpen / Position / HHValue / LLValue 五条 NumericSeries,调用一次返回四个值:

from EsTaClass import UC_SAR

sar = UC_SAR()
afStep, afLimit = 0.02, 0.2

def handle_data(context):
    if len(High()) < 2:
        return
    # 返回:前一根 Bar 的 SAR 值、当前 SAR、持仓方向(1多/-1空)、是否转向
    oParClose, oParOpen, oPosition, oTransition = \
        sar.U_SAR(High(), Low(), afStep, afLimit)
    PlotNumeric('sar', oParOpen, RGB_Red())

U_SAR 内部对 self.Af[-1]self.ParOpen[-1] 等的写入正是依赖 NumericSeries 的自动 Bar 追加机制,所以每根 Bar 调用一次,状态就会正确延续。

EsTalib vs talib 怎么选

场景推荐
标准指标(MA/MACD/KDJ/BOLL/RSI…)talib,一行搞定
需要逐 Bar 增量、保留中间状态EsTalibU_ 系列或自建
talib 没有的指标(如特定 SAR 变体)EsTaClass 类形式

两者也可以混用——用 talib 算主线,用 U_ 系列算辅助状态。

小结

EsTalib 提供一组基于 NumericSeries 的现成指标函数:无状态的 U_MA/U_Highest/U_Lowest/U_STD 直接用,有状态的 U_EMA/U_SMA/U_XAverage/U_AverageFC 需要外部维护一个 NumericSeries;复杂多输出指标用 EsTaClass 的类形式。掌握这套思路后,下一步 扩展函数开发 教你把自己的指标也封装成可复用的函数。