EsTalib技术指标库
极智量化内置了一个用 NumericSeries 封装好的指标函数包 EsTalib.py,以及一个类形式的指标实现 EsTaClass.py。它们与第三方库 talib 互为补充:talib 适合无状态的一次性计算,EsTalib 的 U_ 系列则适合需要「逐 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 增量、保留中间状态 | EsTalib 的 U_ 系列或自建 |
| 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 的类形式。掌握这套思路后,下一步 扩展函数开发 教你把自己的指标也封装成可复用的函数。