Pharos
TA

TA 技术指标库

描述

TA 是一个基于 TA-Lib 的专业技术指标库,提供了 126 个常用技术分析指标,涵盖趋势、动量、波动率、成交量、形态识别、统计学等多个类别。所有指标函数通过 TA 命名空间调用,避免与其他函数命名冲突。

📚 文档导航

详细的分类文档(已重组为子目录结构,便于阅读):

  • 趋势指标 - SMA, EMA, WMA, DEMA, TEMA, KAMA 等移动平均指标
  • 动量指标 - RSI, MACD, KDJ, CCI, WILLR, ADX 等超买超卖和趋势强度指标
  • 波动率指标 - ATR, BBANDS, NATR, TRANGE 等波动性分析指标
  • 成交量指标 - OBV, AD 等价量关系指标
  • K线形态 - 锤子线、早晨之星、吞没形态等 61 个蜡烛图形态
  • 统计函数 - 线性回归、相关性、标准差等统计分析函数
  • 数学变换 - 三角函数、对数、指数、平方根等数学变换
  • 数学运算 - 加减乘除、最值、求和等数学运算

💡 提示: 每个分类都有独立的子目录,包含详细的指标说明、参数解释、应用示例和策略代码。


依赖安装

bash
# 必需依赖
pip install numpy

# 可选依赖(强烈推荐,提供完整功能)
pip install TA-Lib

注意:基础指标(如 SMA、EMA、RSI、MACD 等)在没有 TA-Lib 的情况下会使用 numpy 实现的简化版本,但 K 线形态识别和高级指标必须安装 TA-Lib 才能使用。

指标分类

1. 趋势指标 (10个)

  • TA.SMA() - 简单移动平均
  • TA.EMA() - 指数移动平均
  • TA.WMA() - 加权移动平均
  • TA.DEMA() - 双重指数移动平均
  • TA.TEMA() - 三重指数移动平均
  • TA.TRIMA() - 三角移动平均
  • TA.KAMA() - 考夫曼自适应移动平均
  • TA.MAMA() - MESA 自适应移动平均
  • TA.T3() - T3 移动平均
  • TA.MA() - 通用移动平均(支持多种类型)

2. 动量指标 (27个)

  • TA.RSI() - 相对强弱指标
  • TA.MACD() - 移动平均收敛散度
  • TA.STOCH() - 随机指标(KDJ)
  • TA.CCI() - 商品通道指标
  • TA.WILLR() - 威廉指标
  • TA.MOM() - 动量指标
  • TA.ROC() - 变动率
  • TA.ADX() - 平均趋向指标
  • 等 27 个动量相关指标...

3. 波动率指标 (4个)

  • TA.ATR() - 平均真实波幅
  • TA.NATR() - 标准化平均真实波幅
  • TA.TRANGE() - 真实波幅
  • TA.BBANDS() - 布林带

4. 成交量指标 (2个)

  • TA.OBV() - 能量潮
  • TA.AD() - 累积/派发线

5. K线形态识别 (61个)

所有形态识别函数返回值:

  • +100: 看涨形态
  • 0: 无形态
  • -100: 看跌形态

常用形态:

  • TA.CDLMORNINGSTAR() - 早晨之星(看涨反转)
  • TA.CDLEVENINGSTAR() - 黄昏之星(看跌反转)
  • TA.CDLHAMMER() - 锤子线(看涨)
  • TA.CDLSHOOTINGSTAR() - 射击之星(看跌)
  • TA.CDLENGULFING() - 吞没形态
  • TA.CDLDOJI() - 十字星
  • TA.CDL3WHITESOLDIERS() - 三白兵(看涨)
  • TA.CDL3BLACKCROWS() - 三只乌鸦(看跌)
  • 等 61 个 K 线形态...

6. 统计函数 (9个)

  • TA.LINEARREG() - 线性回归
  • TA.CORREL() - 相关系数
  • TA.STDDEV() - 标准差
  • TA.VAR() - 方差
  • TA.BETA() - 贝塔系数
  • 等统计相关函数...

7. 数学变换 (16个)

  • TA.SIN(), TA.COS(), TA.TAN() - 三角函数
  • TA.LN(), TA.LOG10() - 对数函数
  • TA.SQRT(), TA.EXP() - 幂函数
  • 等数学变换函数...

8. 数学运算 (13个)

  • TA.ADD(), TA.SUB(), TA.MULT(), TA.DIV() - 四则运算
  • TA.MAX(), TA.MIN() - 最值函数
  • TA.SUM() - 求和
  • 等数学运算函数...

使用示例

基础用法

javascript
function main() {
    while (true) {
        var records = exchange.GetRecords()
        if (records.length < 30) {
            Sleep(1000)
            continue
        }
        
        // 提取收盘价
        var closes = records.map(function(r) { return r.Close })
        
        // 计算 20 周期简单移动平均
        var sma20 = TA.SMA(closes, 20)
        Log("SMA20:", sma20[sma20.length - 1])
        
        // 计算 RSI
        var rsi = TA.RSI(closes, 14)
        Log("RSI:", rsi[rsi.length - 1])
        
        Sleep(60000)
    }
}
python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        # 提取收盘价
        closes = [r['Close'] for r in records]
        
        # 计算 20 周期简单移动平均
        sma20 = TA.SMA(closes, 20)
        Log("SMA20:", sma20[-1])
        
        # 计算 RSI
        rsi = TA.RSI(closes, 14)
        Log("RSI:", rsi[-1])
        
        Sleep(60000)

趋势判断

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 100:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        
        # 使用双均线判断趋势
        sma20 = TA.SMA(closes, 20)
        sma50 = TA.SMA(closes, 50)
        
        if sma20[-1] > sma50[-1] and sma20[-2] <= sma50[-2]:
            Log("金叉:短期均线上穿长期均线,买入信号")
            
        elif sma20[-1] < sma50[-1] and sma20[-2] >= sma50[-2]:
            Log("死叉:短期均线下穿长期均线,卖出信号")
        
        Sleep(60000)

MACD 策略

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 50:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        
        # 计算 MACD
        macd, signal, hist = TA.MACD(closes, 12, 26, 9)
        
        # MACD 金叉
        if macd[-1] > signal[-1] and macd[-2] <= signal[-2]:
            Log("MACD 金叉,买入信号")
            # exchange.Buy(...)
            
        # MACD 死叉
        elif macd[-1] < signal[-1] and macd[-2] >= signal[-2]:
            Log("MACD 死叉,卖出信号")
            # exchange.Sell(...)
        
        Sleep(60000)

RSI 超买超卖

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        
        # 计算 RSI
        rsi = TA.RSI(closes, 14)
        current_rsi = rsi[-1]
        
        if current_rsi > 70:
            Log("RSI 超买:", current_rsi, "考虑卖出")
            
        elif current_rsi < 30:
            Log("RSI 超卖:", current_rsi, "考虑买入")
            
        else:
            Log("RSI 正常区间:", current_rsi)
        
        Sleep(60000)

KDJ 指标

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        
        # 计算 KDJ
        k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
        j = 3 * k[-1] - 2 * d[-1]  # 计算 J 值
        
        Log("K:", k[-1], "D:", d[-1], "J:", j)
        
        if k[-1] < 20 and d[-1] < 20:
            Log("KDJ 超卖区域")
        elif k[-1] > 80 and d[-1] > 80:
            Log("KDJ 超买区域")
        
        Sleep(60000)

布林带策略

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        current_price = closes[-1]
        
        # 计算布林带
        upper, middle, lower = TA.BBANDS(closes, 20, 2, 2)
        
        Log("布林带 - 上:", upper[-1], "中:", middle[-1], "下:", lower[-1])
        
        if current_price > upper[-1]:
            Log("价格突破上轨,可能超买")
            
        elif current_price < lower[-1]:
            Log("价格跌破下轨,可能超卖")
            
        # 布林带宽度
        bb_width = (upper[-1] - lower[-1]) / middle[-1]
        Log("布林带宽度:", bb_width)
        
        Sleep(60000)

ATR 止损

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        
        # 计算 ATR
        atr = TA.ATR(highs, lows, closes, 14)
        current_atr = atr[-1]
        current_price = closes[-1]
        
        # 使用 2 倍 ATR 设置止损
        stop_loss_distance = 2 * current_atr
        buy_stop_loss = current_price - stop_loss_distance
        sell_stop_loss = current_price + stop_loss_distance
        
        Log("当前价格:", current_price)
        Log("ATR:", current_atr)
        Log("多头止损位:", buy_stop_loss)
        Log("空头止损位:", sell_stop_loss)
        
        Sleep(60000)

K线形态识别

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 10:
            Sleep(1000)
            continue
        
        opens = [r['Open'] for r in records]
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        
        # 识别看涨形态
        hammer = TA.CDLHAMMER(opens, highs, lows, closes)
        morning_star = TA.CDLMORNINGSTAR(opens, highs, lows, closes)
        engulfing = TA.CDLENGULFING(opens, highs, lows, closes)
        
        if hammer[-1] == 100:
            Log("检测到锤子线,看涨反转信号")
            
        if morning_star[-1] == 100:
            Log("检测到早晨之星,看涨反转信号")
            
        if engulfing[-1] == 100:
            Log("检测到看涨吞没")
        elif engulfing[-1] == -100:
            Log("检测到看跌吞没")
        
        Sleep(60000)

成交量分析

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        volumes = [r['Volume'] for r in records]
        
        # 计算 OBV(能量潮)
        obv = TA.OBV(closes, volumes)
        
        # 价量齐升
        if obv[-1] > obv[-2] and closes[-1] > closes[-2]:
            Log("价量齐升,强势信号")
            
        # 价涨量跌(背离)
        elif obv[-1] < obv[-2] and closes[-1] > closes[-2]:
            Log("价涨量跌,可能见顶")
        
        Sleep(60000)

多指标综合策略

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 100:
            Sleep(1000)
            continue
        
        # 提取数据
        opens = [r['Open'] for r in records]
        highs = [r['High'] for r in records]
        lows = [r['Low'] for r in records]
        closes = [r['Close'] for r in records]
        volumes = [r['Volume'] for r in records]
        
        # 趋势判断
        sma20 = TA.SMA(closes, 20)
        sma50 = TA.SMA(closes, 50)
        trend_up = sma20[-1] > sma50[-1]
        
        # 动量指标
        rsi = TA.RSI(closes, 14)
        macd, signal, hist = TA.MACD(closes)
        k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
        
        # 波动率
        atr = TA.ATR(highs, lows, closes, 14)
        upper, middle, lower = TA.BBANDS(closes, 20, 2, 2)
        
        # 成交量
        obv = TA.OBV(closes, volumes)
        
        # 形态识别
        hammer = TA.CDLHAMMER(opens, highs, lows, closes)
        engulfing = TA.CDLENGULFING(opens, highs, lows, closes)
        
        # 买入信号
        buy_signal = (
            trend_up and                           # 趋势向上
            rsi[-1] < 40 and                      # RSI 未超买
            hist[-1] > 0 and                      # MACD 柱状图为正
            closes[-1] < middle[-1] and           # 价格在布林带中轨下方
            (hammer[-1] == 100 or engulfing[-1] == 100)  # 出现看涨形态
        )
        
        # 卖出信号
        sell_signal = (
            not trend_up and                      # 趋势向下
            rsi[-1] > 60 and                     # RSI 偏高
            hist[-1] < 0                          # MACD 柱状图为负
        )
        
        if buy_signal:
            stop_loss = closes[-1] - 2 * atr[-1]
            Log("多指标买入信号,止损位:", stop_loss)
            # exchange.Buy(...)
            
        elif sell_signal:
            Log("多指标卖出信号")
            # exchange.Sell(...)
        
        Sleep(60000)

常用指标参数建议

指标推荐参数适用场景
TA.SMA()5, 10, 20, 50, 200不同周期趋势
TA.EMA()12, 26MACD 计算
TA.RSI()14超买超卖
TA.MACD()(12, 26, 9)趋势和动量
TA.BBANDS()(20, 2, 2)波动率突破
TA.ATR()14止损设置
TA.STOCH()(9, 3, 0, 3, 0)KDJ 指标
TA.CCI()20超买超卖

注意事项

1. 数据长度要求

指标计算需要足够的历史数据。例如:

  • 20 周期 SMA 需要至少 20 根 K 线
  • MACD(12, 26, 9) 需要至少 35 根 K 线
  • 布林带(20) 需要至少 20 根 K 线
python
# 检查数据长度
if len(records) < 50:
    Log("数据不足,等待更多 K 线")
    Sleep(1000)
    continue

2. NaN 值处理

指标数组的前面部分可能包含 NaN 值(数据不足时)。始终使用最新的有效值:

python
sma = TA.SMA(closes, 20)
latest_value = sma[-1]  # 获取最新值(最可能有效)

3. K线形态识别需要 TA-Lib

所有 CDLXXX 形态识别函数都需要安装 TA-Lib 库:

python
try:
    pattern = TA.CDLMORNINGSTAR(opens, highs, lows, closes)
except NotImplementedError:
    Log("需要安装 TA-Lib 库才能使用形态识别")

4. 性能优化

避免在循环中重复计算同一指标:

python
# ❌ 不好的做法
for i in range(10):
    rsi = TA.RSI(closes, 14)  # 每次都重新计算

# ✅ 好的做法
rsi = TA.RSI(closes, 14)      # 只计算一次
for i in range(10):
    value = rsi[-1]            # 使用缓存结果

完整指标列表

趋势指标 (10个)

SMA, EMA, WMA, DEMA, TEMA, TRIMA, KAMA, MAMA, T3, MA

动量指标 (27个)

RSI, STOCH, STOCHF, STOCHRSI, MACD, MACDEXT, MACDFIX, CCI, CMO, MOM, ROC, ROCP, ROCR, WILLR, PPO, APO, TRIX, ADOSC, ADX, ADXR, DX, AROON, AROONOSC, BOP, MFI, MINUS_DI, MINUS_DM, PLUS_DI, PLUS_DM, ULTOSC

波动率指标 (4个)

ATR, NATR, TRANGE, BBANDS

成交量指标 (2个)

OBV, AD

K线形态 (61个)

CDL2CROWS, CDL3BLACKCROWS, CDL3INSIDE, CDL3LINESTRIKE, CDL3OUTSIDE, CDL3STARSINSOUTH, CDL3WHITESOLDIERS, CDLABANDONEDBABY, CDLADVANCEBLOCK, CDLBELTHOLD, CDLBREAKAWAY, CDLCLOSINGMARUBOZU, CDLCONCEALBABYSWALL, CDLCOUNTERATTACK, CDLDARKCLOUDCOVER, CDLDOJI, CDLDOJISTAR, CDLDRAGONFLYDOJI, CDLENGULFING, CDLEVENINGDOJISTAR, CDLEVENINGSTAR, CDLGAPSIDESIDEWHITE, CDLGRAVESTONEDOJI, CDLHAMMER, CDLHANGINGMAN, CDLHARAMI, CDLHARAMICROSS, CDLHIGHWAVE, CDLHIKKAKE, CDLHIKKAKEMOD, CDLHOMINGPIGEON, CDLIDENTICAL3CROWS, CDLINNECK, CDLINVERTEDHAMMER, CDLKICKING, CDLKICKINGBYLENGTH, CDLLADDERBOTTOM, CDLLONGLEGGEDDOJI, CDLLONGLINE, CDLMARUBOZU, CDLMATCHINGLOW, CDLMATHOLD, CDLMORNINGDOJISTAR, CDLMORNINGSTAR, CDLONNECK, CDLPIERCING, CDLRICKSHAWMAN, CDLRISEFALL3METHODS, CDLSEPARATINGLINES, CDLSHOOTINGSTAR, CDLSHORTLINE, CDLSPINNINGTOP, CDLSTALLEDPATTERN, CDLSTICKSANDWICH, CDLTAKURI, CDLTASUKIGAP, CDLTHRUSTING, CDLTRISTAR, CDLUNIQUE3RIVER, CDLUPSIDEGAP2CROWS, CDLXSIDEGAP3METHODS

统计函数 (9个)

BETA, CORREL, LINEARREG, LINEARREG_ANGLE, LINEARREG_INTERCEPT, LINEARREG_SLOPE, STDDEV, TSF, VAR

数学变换 (16个)

ACOS, ASIN, ATAN, CEIL, COS, COSH, EXP, FLOOR, LN, LOG10, SIN, SINH, SQRT, TAN, TANH

数学运算 (13个)

ADD, DIV, MAX, MAXINDEX, MIN, MININDEX, MINMAX, MINMAXINDEX, MULT, SUB, SUM

相关链接

总结

TA 技术指标库提供了完整的技术分析工具集,帮助您构建专业的量化交易策略:

  • 126 个专业指标:涵盖所有主流技术分析场景
  • 统一命名空间TA.XXX() 调用方式,清晰易用
  • 降级支持:基础指标无需 TA-Lib 也能运行
  • 多语言支持:JavaScript 和 Python 均可使用
  • 专业级实现:基于 TA-Lib 的行业标准算法

开始使用 TA 指标库来增强您的交易策略吧!