一句话回答: TA-Lib 在很多环境里编译很麻烦。其实常用技术指标全都能用 pandas/numpy 几行写出来。下面从 AlphaFeed 取一段日 K 线,把 MA、EMA、MACD、RSI、布林带、KDJ 全部手写实现,复制即用。
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key")
df = af.klines.get("600519.SH", period="1d", count=250, adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
close = df["close"]df["ma5"] = close.rolling(5).mean()
df["ma10"] = close.rolling(10).mean()
df["ma20"] = close.rolling(20).mean()
df["ema12"] = close.ewm(span=12, adjust=False).mean()
df["ema26"] = close.ewm(span=26, adjust=False).mean()rolling 是简单平均,ewm(span=n, adjust=False) 是指数平均(近期权重更高)。
MACD = 快 EMA − 慢 EMA;DEA 是 MACD 的 EMA;柱状图 = 2 ×(MACD − DEA)。
def macd(close, fast=12, slow=26, signal=9):
ema_fast = close.ewm(span=fast, adjust=False).mean()
ema_slow = close.ewm(span=slow, adjust=False).mean()
dif = ema_fast - ema_slow
dea = dif.ewm(span=signal, adjust=False).mean()
hist = (dif - dea) * 2
return dif, dea, hist
df["dif"], df["dea"], df["macd_hist"] = macd(close)判读:DIF 上穿 DEA 为金叉(偏多),下穿为死叉(偏空);柱状图由负转正是动能转强。
def rsi(close, period=14):
delta = close.diff()
gain = delta.clip(lower=0)
loss = -delta.clip(upper=0)
avg_gain = gain.ewm(alpha=1/period, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/period, adjust=False).mean()
rs = avg_gain / avg_loss
return 100 - 100 / (1 + rs)
df["rsi14"] = rsi(close, 14)一般 RSI > 70 视为超买,< 30 视为超卖。
中轨 = 20 日均线,上下轨 = 中轨 ± 2 倍标准差。
def bollinger(close, period=20, k=2):
mid = close.rolling(period).mean()
std = close.rolling(period).std()
upper = mid + k * std
lower = mid - k * std
return upper, mid, lower
df["boll_up"], df["boll_mid"], df["boll_low"] = bollinger(close)价格触及上轨常被视为强势/超买,触及下轨为弱势/超卖;上下轨收窄(挤压)往往预示变盘。
def kdj(df, n=9):
low_n = df["low"].rolling(n).min()
high_n = df["high"].rolling(n).max()
rsv = (df["close"] - low_n) / (high_n - low_n) * 100
k = rsv.ewm(com=2, adjust=False).mean() # 相当于 (2*前K + RSV)/3
d = k.ewm(com=2, adjust=False).mean()
j = 3 * k - 2 * d
return k, d, j
df["k"], df["d"], df["j"] = kdj(df)配合批量 K 线,可以给一批股票统一计算指标做筛选:
symbols = ["600519.SH", "000001.SZ", "601318.SH"]
dfs = af.klines.batch(symbols, period="1d", count=250, adjust="forward",
to_dataframe=True, show_progress=True)
signals = []
for sym, d in dfs.items():
d = d.sort_values("trade_date").reset_index(drop=True)
dif, dea, hist = macd(d["close"])
r = rsi(d["close"], 14)
# 例:MACD 金叉 且 RSI 未超买
golden = dif.iloc[-1] > dea.iloc[-1] and dif.iloc[-2] <= dea.iloc[-2]
if golden and r.iloc[-1] < 70:
signals.append({"symbol": sym, "rsi": round(r.iloc[-1], 1)})
print(signals)指标 | 常用参数 | 主要用途 |
|---|---|---|
MA/EMA | 5/10/20/60 | 趋势方向、多头排列 |
MACD | 12/26/9 | 趋势与动能、金叉死叉 |
RSI | 14 | 超买超卖 |
布林带 | 20, 2σ | 波动区间、挤压变盘 |
KDJ | 9,3,3 | 短线超买超卖 |
Q:结果和行情软件对得上吗?
A:EMA 类指标对初始值和 adjust 参数敏感,取足够长的历史(如 250 根)后,末端数值会与主流软件基本一致。
Q:为什么用前复权?
A:技术指标基于连续价格序列,除权跳空会扭曲指标,必须用复权价(adjust="forward")。
Q:一定要装 TA-Lib 吗?
A:不用。上面这些都是纯 pandas 实现,跨平台零编译依赖。
主流技术指标的公式都不复杂,pandas 的 rolling/ewm 就能覆盖 MA、MACD、RSI、布林带、KDJ。数据侧用 AlphaFeed 的复权 K 线保证输入干净,你就能摆脱 TA-Lib 的安装烦恼,自由地组合指标做选股和策略。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。