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 个蜡烛图形态
- 统计函数 - 线性回归、相关性、标准差等统计分析函数
- 数学变换 - 三角函数、对数、指数、平方根等数学变换
- 数学运算 - 加减乘除、最值、求和等数学运算
💡 提示: 每个分类都有独立的子目录,包含详细的指标说明、参数解释、应用示例和策略代码。
依赖安装
# 必需依赖
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()- 求和- 等数学运算函数...
使用示例
基础用法
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)
}
}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)趋势判断
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 策略
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 超买超卖
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 指标
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)布林带策略
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 止损
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线形态识别
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)成交量分析
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)多指标综合策略
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, 26 | MACD 计算 |
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 线
# 检查数据长度
if len(records) < 50:
Log("数据不足,等待更多 K 线")
Sleep(1000)
continue2. NaN 值处理
指标数组的前面部分可能包含 NaN 值(数据不足时)。始终使用最新的有效值:
sma = TA.SMA(closes, 20)
latest_value = sma[-1] # 获取最新值(最可能有效)3. K线形态识别需要 TA-Lib
所有 CDLXXX 形态识别函数都需要安装 TA-Lib 库:
try:
pattern = TA.CDLMORNINGSTAR(opens, highs, lows, closes)
except NotImplementedError:
Log("需要安装 TA-Lib 库才能使用形态识别")4. 性能优化
避免在循环中重复计算同一指标:
# ❌ 不好的做法
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 指标库来增强您的交易策略吧!