如何用 Python 计算 KST 指标(Know Sure Thing)?四段 ROC 加权的动量摆动指标
如何用 Python 计算 KST 指标(Know Sure Thing)?
一句话回答: KST(Know Sure Thing,确知指标)由技术分析大师 Martin Pring 提出,核心思路是「多周期动量叠加」:取 4 个不同回看期的 ROC(变动率),各自做移动平均平滑,再按 1:2:3:4 权重相加成一条 KST 线,最后用 9 日信号线的金叉死叉择时。用 AlphaFeed 取前复权日线,十几行就能实现,不需要 TA-Lib——它比单段 ROC 更平滑、更能过滤短期噪声。
为什么会有这个问题 / 传统做法的痛点
单个 ROC 只看一个周期的动量,噪声大、容易骗线;而市场的动量其实是短中长多个周期叠加的结果。Pring 的 KST 把短、中、长 4 段 ROC 平滑后加权合成——越长的周期权重越大(1:2:3:4),于是得到一条「兼顾多周期、又相对平滑」的动量线。痛点是 TA-Lib 没有现成 KST,而且 4 段 ROC 的周期/平滑/权重参数一大堆,容易记错。本文直接给出 Pring 的经典日线参数。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线
from alphafeed import AlphaFeed
import numpy as np, pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=400,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
第 2 步:实现 KST(4 段平滑 ROC 加权)与信号线
def roc(close, n):
return close.pct_change(n) * 100
def kst(close):
rcma1 = roc(close, 10).rolling(10).mean() # 短
rcma2 = roc(close, 15).rolling(10).mean() # 中短
rcma3 = roc(close, 20).rolling(10).mean() # 中长
rcma4 = roc(close, 30).rolling(15).mean() # 长
k = rcma1*1 + rcma2*2 + rcma3*3 + rcma4*4 # 1:2:3:4 加权
sig = k.rolling(9).mean() # 9 日信号线
return k, sig
df["kst"], df["kst_sig"] = kst(df["close"])
print(df[["trade_date", "kst", "kst_sig"]].tail())
实测(
tools/verify_new_2026-10-13.py,SDK 0.1.4):贵州茅台近 400 日 KST 尾值 ≈ −39.14、信号线 ≈ −37.87(均为负、KST 略低于信号线,动量偏弱),区间内 KST 上穿信号线共 11 次。
第 3 步:金叉/死叉 + 零轴
golden = (df["kst"].shift(1) <= df["kst_sig"].shift(1)) & (df["kst"] > df["kst_sig"])
dead = (df["kst"].shift(1) >= df["kst_sig"].shift(1)) & (df["kst"] < df["kst_sig"])
print("最近一次 KST 金叉:", df.loc[golden, "trade_date"].tail(1).tolist())
print("KST 在零轴上方(多头区):", bool(df["kst"].iloc[-1] > 0))
常用法:KST 上穿信号线偏多、下穿偏空;再结合「零轴上方/下方」确认多空大环境。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口会扭曲 ROC |
| ROC 周期 | 10/15/20/30 | Pring 日线经典值 |
| 平滑 | 10/10/10/15 | 各段 ROC 的 SMA 周期 |
| 权重 | 1:2:3:4 | 长周期权重更大 |
| 信号线 | KST 的 9 日 SMA | 金叉死叉用 |
| 零轴 | KST=0 | 上方多头、下方空头 |
关键坑与注意事项
- 参数口径要统一:KST 有日线/周线/长线多套参数(周期、平滑、权重各不同),本文用日线经典值;与软件对比前先对齐参数。
- 仍会滞后:4 段平滑让 KST 平滑但也更滞后,拐点确认慢,急跌急涨时信号来得晚。
- 震荡市假信号:零轴附近反复穿越时金叉死叉同样会骗线,建议结合零轴与趋势过滤。
- 前复权必须:ROC 基于涨跌幅,除权缺口会制造假动量。
- 是动量不是价格目标:KST 衡量动量强弱与方向,不预测涨跌幅度。
常见问题(FAQ)
Q:KST 和 MACD、单段 ROC 有什么区别? A:单段 ROC 只看一个周期;MACD 是两条 EMA 之差;KST 把 4 段不同周期的平滑 ROC 加权合成,信息更”全周期”,也更平滑。三者都能看动量方向,可互相印证。
Q:权重 1:2:3:4 可以改吗? A:可以,但那会偏离 Pring 原意。权重越偏向长周期越平滑/滞后,越偏向短周期越灵敏/噪声大,改动后务必回测验证。
Q:需要付费吗?
A:单只股票日线在免费额度内即可;若要对全市场批量扫 KST 刚金叉的票,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
KST 用「4 段平滑 ROC 按 1:2:3:4 加权」把多周期动量合成一条相对平滑的线,配 9 日信号线金叉死叉择时。用 AlphaFeed 的前复权日线十几行即可实现——记住参数口径要统一、它平滑但滞后、震荡市会骗线,结合零轴与趋势判断更稳。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。