Momentum:TSI(真实强度指数)技术指标详解
一、TSI的定义
TSI(True Strength Index,真实强度指数) 是由William Blau于20世纪90年代初在其著作《Momentum, Direction, and Divergence》中提出的一种先进动量震荡指标。该指标通过双重指数平滑技术处理价格动量,旨在过滤市场噪音,更准确地反映趋势的强度。
核心设计理念
TSI的设计哲学是:价格动量先于价格变化------在价格方向发生改变之前,动量往往已经先行变化。
传统动量指标容易受到单日价格尖峰的干扰,产生虚假信号。TSI通过对价格变化进行双重平滑,显著降低了"噪音"干扰,使交易者能够更清晰地识别真正的趋势动能。
TSI的核心特征
| 特征 | 说明 |
|---|---|
| 理论基础 | 双重指数平滑 + 动量归一化 |
| 指标类型 | 动量震荡指标(Oscillator) |
| 数值范围 | 通常以百分比形式呈现,常见为-100到+100区间 |
| 开发者 | William Blau(1990年代) |
| 默认参数 | fast=13, slow=25, signal=13 |
| 核心优势 | 双重平滑有效过滤噪音,适合趋势确认 |
TSI的技术定位
TSI在技术指标家族中属于双重平滑动量指标,其核心价值在于:
- 平滑性:通过双重EMA显著减少市场噪音
- 归一化:通过分子分母结构将数值标准化,便于跨品种比较
- 多功能性:适用于趋势市场和震荡市场的分析
二、TSI的计算方法
1. 核心公式框架
TSI的计算建立在双重指数平滑的基础上,整体框架可分为三个层次:价格变化计算、双重平滑、归一化处理。
2. 详细计算步骤
第一步:计算价格变化(Price Change)
PCt=Closet−Closet−1 \mathrm{PC}{t} = \mathrm{Close}{t} - \mathrm{Close}_{t-1} PCt=Closet−Closet−1
其中 Closet\mathrm{Close}_{t}Closet 为第 ttt 周期的收盘价。这个价格变化构成了 TSI 计算的基础动量数据。
第二步:计算价格变化的双重平滑(第一层)
首先对价格变化应用第一次指数移动平均(EMA):
EMAslow,t=EMA(PC,slow)t \mathrm{EMA}_{\mathrm{slow}, t} = \mathrm{EMA}(\mathrm{PC}, \mathrm{slow})_t EMAslow,t=EMA(PC,slow)t
slow 为慢速 EMA 周期(默认25)。
然后对第一次平滑结果再次应用 EMA,得到平滑后的动量值:
SmoothMomentumt=EMA(EMAslow,fast)t \mathrm{SmoothMomentum}t = \mathrm{EMA}(\mathrm{EMA}{\mathrm{slow}}, \mathrm{fast})_t SmoothMomentumt=EMA(EMAslow,fast)t
其中 fast 为快速 EMA 周期(默认13)。
第三步:计算绝对价格变化的双重平滑(分母)
对价格变化的绝对值进行同样的双重平滑处理:
AbsSmoothMomentumt=EMA(EMA(∣PC∣,slow),fast)t \mathrm{AbsSmoothMomentum}_t = \mathrm{EMA}(\mathrm{EMA}(|\mathrm{PC}|, \mathrm{slow}), \mathrm{fast})_t AbsSmoothMomentumt=EMA(EMA(∣PC∣,slow),fast)t
第四步:计算TSI值
TSIt=100×SmoothMomentumtAbsSmoothMomentumt \mathrm{TSI}_t = 100 \times \frac{\mathrm{SmoothMomentum}_t}{\mathrm{AbsSmoothMomentum}_t} TSIt=100×AbsSmoothMomentumtSmoothMomentumt
这个比值介于 -100 和 +100 之间,表示动量在总动能中的占比。
第五步:计算信号线(Signal Line)
Signalt=EMA(TSI,signal)t \mathrm{Signal}_t = \mathrm{EMA}(\mathrm{TSI}, \mathrm{signal})_t Signalt=EMA(TSI,signal)t
其中 signal 为信号线平滑周期(默认13)。
3. 完整公式汇总
将上述步骤合并,TSI的完整计算公式可表达为:
TSI=100×EMA(EMA(PC,slow),fast)EMA(EMA(∣PC∣,slow),fast) \mathrm{TSI} = 100 \times \frac{\mathrm{EMA}(\mathrm{EMA}(\mathrm{PC}, \mathrm{slow}), \mathrm{fast})}{\mathrm{EMA}(\mathrm{EMA}(|\mathrm{PC}|, \mathrm{slow}), \mathrm{fast})} TSI=100×EMA(EMA(∣PC∣,slow),fast)EMA(EMA(PC,slow),fast)
Signal=EMA(TSI,signal) \mathrm{Signal} = \mathrm{EMA}(\mathrm{TSI}, \mathrm{signal}) Signal=EMA(TSI,signal)
其中:
- PCt=Closet−Closet−1\mathrm{PC}_t = \mathrm{Close}t - \mathrm{Close}{t-1}PCt=Closet−Closet−1
- EMA\mathrm{EMA}EMA:指数移动平均线
4. 参数说明
| 参数 | 默认值 | 名称 | 说明 |
|---|---|---|---|
| fast | 13 | 快速EMA周期 | 对第一次平滑结果进行再平滑,数值越小反应越灵敏 |
| slow | 25 | 慢速EMA周期 | 对原始价格变化进行第一次平滑,数值越大越平滑 |
| signal | 13 | 信号线周期 | 对TSI值进行平滑的周期,产生交叉信号 |
| scalar | 100 | 放大倍数 | 将比值转换为百分比形式 |
参数选择说明:13和25的双周期组合实现了灵敏度与可靠性的平衡。13周期EMA捕捉即时价格波动,25周期EMA提供趋势背景并过滤噪音。
5. 计算示例
假设使用标准参数(fast=13, slow=25),某股票连续两日收盘价如下:
| 日期 | 收盘价 | PC | EMA₁(PC,25) | EMA₂(EMA₁,13) | TSI计算 | ||
|---|---|---|---|---|---|---|---|
| 第1天 | 100.00 | --- | --- | --- | --- | --- | --- |
| ... | 中间数据逐步累积,EMA逐渐稳定 | ||||||
| 第25天 | 进入稳定计算期 | ||||||
| 当日 | 115.00 | +0.50 | +0.45 | +0.47 |
逐步计算:
第一步:计算价格变化
- PC = 115.00 - 114.50 = +0.50
第二步:第一次平滑(以slow=25为例,简化为线性近似)
- EMA₁ = 前一日EMA₁ × (24/25) + PC × (1/25)
- 假设前一日EMA₁ = 0.45,则EMA₁ ≈ 0.45 × 0.96 + 0.50 × 0.04 = 0.452
第三步:第二次平滑(fast=13)
- 对EMA₁应用13周期EMA,计算得到SmoothMomentum
第四步:同时计算分母部分(使用|PC|)
- 对|PC| = 0.50进行相同双重平滑,得到AbsSmoothMomentum
第五步:计算TSI
- TSI = 100 × SmoothMomentum / AbsSmoothMomentum
TSI为正数 表示上升动量占主导,为负数表示下降动量占主导。
三、TSI的使用方法
1. 零轴穿越------趋势方向信号
TSI围绕0轴波动,零轴是最基础的趋势分界线:
| TSI状态 | 市场含义 | 操作倾向 |
|---|---|---|
| TSI > 0 | 上升动量占优,买盘力量主导 | 偏多思维,寻找买入机会 |
| TSI < 0 | 下降动量占优,卖盘力量主导 | 偏空思维,寻找做空机会 |
| 上穿零轴 | 动量由负转正,上涨动能开始形成 | 买入信号 |
| 下穿零轴 | 动量由正转负,下跌动能开始形成 | 卖出信号 |
信号确认:零轴穿越信号在价格行为和成交量配合时更为有效。穿越同时有成交量放大和价格突破关键位置,信号可靠性显著提升。
2. 信号线交叉------精准入场信号
TSI线与信号线(Signal Line)的交叉是产生具体买卖指令的最常用方法:
| 信号类型 | 触发条件 | 含义 | 操作建议 |
|---|---|---|---|
| 金叉(买入) | TSI线从下方上穿信号线 | 动量正在加速增强 | 买入入场 |
| 死叉(卖出) | TSI线从上方下穿信号线 | 动量正在减速减弱 | 卖出离场 |
信号参考:
| 交叉位置 | 信号可靠性 | 说明 |
|---|---|---|
| 零轴上方金叉 | 强 | 上升趋势中的最佳加仓点 |
| 零轴下方金叉 | 中等 | 空头反弹,谨慎参与 |
| 零轴上方死叉 | 中等 | 多头回调,可波段减仓 |
| 零轴下方死叉 | 强 | 空头延续,应及时离场 |
3. 阈值突破------趋势强度确认
许多资深交易者使用**±25**作为额外阈值,用于确认趋势强度并过滤弱势信号:
| TSI状态 | 趋势含义 | 操作策略 |
|---|---|---|
| TSI > +25 | 强劲多头趋势,上行动能充沛 | 趋势强劲,顺势持仓 |
| TSI < -25 | 强劲空头趋势,下行动力显著 | 空头主导,顺势做空 |
| TSI在±25之间 | 正常震荡范围 | 谨慎操作,关注突破 |
4. 背离信号------最强反转预警
TSI与价格走势的背离是最可靠的反转预警信号:
| 背离类型 | 价格表现 | TSI表现 | 信号含义 |
|---|---|---|---|
| 顶背离 | 价格创出新高 | TSI未能创出新高(形成更低高点) | 上涨动能衰竭,卖出信号 |
| 底背离 | 价格创出新低 | TSI未能创出新低(形成更高低点) | 下跌动能减弱,买入信号 |
背离信号的形成逻辑:
- 多头背离:价格创新低但TSI形成更高低点,表明下行动能减弱,空头力量衰退,可能出现反转上涨
- 空头背离:价格创新高但TSI形成更低高点,表明上行动能减弱,多头力量下降,趋势可能见顶
5. 趋势追踪------顺势持仓策略
TSI在趋势行情中可作为持仓依据:
| TSI特征 | 市场含义 | 操作策略 |
|---|---|---|
| TSI > 0 且持续在信号线上方 | 多头动量持续增强 | 坚定持股,不宜轻易离场 |
| TSI < 0 且持续在信号线下方 | 空头动量持续增强 | 持币观望,不宜抄底 |
| TSI长时间在0上方/下方稳定 | 趋势行情而非震荡 | 顺势交易,避免逆势操作 |
实用框架:若TSI长期在0上方,多头方向的交易想法通常更符合动量;若TSI长期在0下方,空头方向的交易想法通常更符合动量。
6. 多指标配合策略
TSI在单一使用时可能产生假信号,强烈建议与其他指标配合:
| 配合指标 | 策略逻辑 | 效果 |
|---|---|---|
| RSI | 验证超买超卖状态 | 两个指标信号共振时可靠性更高 |
| MACD | 趋势方向双重确认 | MACD确认大方向,TSI捕捉动量变化 |
| 布林带 | 价格位置确认 | 价格触及边界时用TSI验证突破有效性 |
| 成交量 | 验证资金流向 | TSI信号伴随放量时可信度更高 |
7. 注意事项与局限性
使用TSI前需了解以下要点:
| 局限性 | 说明 |
|---|---|
| 滞后客观存在 | 双重平滑虽能降低噪音,但会延后拐点。TSI往往在行情已经启动后才给出确认 |
| 震荡市假信号 | 当价格横盘时,TSI可能频繁与信号线、零轴发生交叉,但缺乏后续延续 |
| 无统一超买超卖阈值 | 不像RSI有固定的70/30,TSI的"极值"需与该品种自身历史对比来判断 |
| 不能单独使用 | TSI是趋势确认工具,而非完整的交易系统 |
| 背离并非精确择时工具 | 背离通常是提前预警,即使TSI走弱,价格仍可能继续延续趋势 |
适用场景总结:
| 适用场景 | 适用性 | 说明 |
|---|---|---|
| 趋势确认 | 最佳适用 | 验证当前趋势是否具备足够强度 |
| 超买超卖识别 | 适用 | 需结合历史数据自行设定阈值 |
| 背离交易 | 适用 | 平滑特性使背离更易识别 |
| 震荡市场 | 慎用 | 假信号较多,宜结合其他指标 |
| 短线交易 | 需调参 | 默认参数偏中长线,需优化 |
四、使用pandas_ta计算TSI(附示例代码)
1. pandas_ta中的TSI函数
pandas_ta库内置了TSI指标的完整实现,函数位于momentum模块中。
2. 函数完整参数
python
pandas_ta.momentum.tsi(close, fast=None, slow=None, signal=None, scalar=None, mamode=None, drift=None, offset=None, **kwargs)
参数详解:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
close |
pd.Series | 必需 | 收盘价序列 |
fast |
int | 13 | 快速EMA周期(对第一次平滑结果再平滑) |
slow |
int | 25 | 慢速EMA周期(对价格变化第一次平滑) |
signal |
int | 13 | 信号线EMA周期 |
scalar |
float | 100 | 放大倍数(转换为百分比) |
mamode |
str | "ema" | 移动平均类型 |
drift |
int | 1 | 价格变化步长 |
offset |
int | 0 | 结果偏移周期数 |
返回值 :pd.DataFrame------包含两列:
TSI_{fast}_{slow}_{signal}_{scalar}:TSI主线TSIs_{fast}_{slow}_{signal}_{scalar}:信号线
3. 示例代码
python
import pandas as pd
import pandas_ta as ta
import numpy as np
import matplotlib.pyplot as plt
# ========== 第一步:准备数据 ==========
np.random.seed(42)
dates = pd.date_range(start='2022-01-01', end='2024-12-31', freq='D')
n = len(dates)
# 生成带趋势和周期波动的价格序列
trend = np.linspace(0, 45, n)
cycle = np.sin(np.linspace(0, 6 * np.pi, n)) * 15
noise = np.random.randn(n) * 3
price_series = 100 + trend + cycle + noise
# 添加趋势变化区间
price_series = price_series.astype(float)
for i in range(300, 450):
price_series[i] = price_series[300] + (i-300) * 0.2
for i in range(450, 600):
price_series[i] = price_series[450] - (i-450) * 0.15
df = pd.DataFrame(index=dates[:n])
df['close'] = price_series[:n]
df['high'] = df['close'] + np.abs(np.random.randn(n)) * 2 + 1
df['low'] = df['close'] - np.abs(np.random.randn(n)) * 2 - 1
df['volume'] = np.random.randint(1000000, 25000000, n)
print("=" * 60)
print("数据预览:")
print(df.head())
print("\n" + "=" * 60 + "\n")
# ========== 第二步:计算TSI(基础用法) ==========
# 使用默认参数 fast=13, slow=25, signal=13
tsi_df = ta.tsi(df['close'])
# 查看返回的DataFrame结构
print("TSI返回列名称:")
print(tsi_df.columns.tolist())
print("\n" + "=" * 60 + "\n")
# 将计算结果添加到原DataFrame
df['TSI'] = tsi_df.iloc[:, 0] # TSI主线
df['TSIs'] = tsi_df.iloc[:, 1] # 信号线
print("TSI计算结果(最近10行):")
print(df[['close', 'TSI', 'TSIs']].tail(10))
print("\n" + "=" * 60 + "\n")
# ========== 第三步:手动验证TSI计算 ==========
def manual_tsi(close, fast=13, slow=25, signal=13, scalar=100):
"""手动计算TSI验证pandas_ta结果"""
# 计算价格变化
pc = close.diff()
# 计算绝对价格变化
abs_pc = pc.abs()
# 双重EMA计算
ema_slow_pc = pc.ewm(span=slow, adjust=False).mean()
ema_slow_abs = abs_pc.ewm(span=slow, adjust=False).mean()
smooth_momentum = ema_slow_pc.ewm(span=fast, adjust=False).mean()
smooth_abs_momentum = ema_slow_abs.ewm(span=fast, adjust=False).mean()
# 计算TSI
tsi = scalar * smooth_momentum / smooth_abs_momentum
tsi = tsi.fillna(0)
# 计算信号线
signal_line = tsi.ewm(span=signal, adjust=False).mean()
return tsi, signal_line
df['TSI_manual'], df['TSIs_manual'] = manual_tsi(df['close'])
# 验证一致性
diff_tsi = (df['TSI'] - df['TSI_manual']).abs().max()
diff_signal = (df['TSIs'] - df['TSIs_manual']).abs().max()
print(f"TSI主线手动验证最大差异:{diff_tsi:.10f}")
print(f"信号线手动验证最大差异:{diff_signal:.10f}")
print("\n" + "=" * 60 + "\n")
# ========== 第四步:不同参数的TSI对比 ==========
# 标准参数 (13,25,13)
tsi_std = ta.tsi(df['close'])
df['TSI_std'] = tsi_std.iloc[:, 0]
# 短线参数 (9,21,9) - 更灵敏
tsi_fast = ta.tsi(df['close'], fast=9, slow=21, signal=9)
df['TSI_fast'] = tsi_fast.iloc[:, 0]
# 长线参数 (16,30,16) - 更平滑
tsi_slow = ta.tsi(df['close'], fast=16, slow=30, signal=16)
df['TSI_slow'] = tsi_slow.iloc[:, 0]
print("不同参数TSI对比(最近5行):")
print(df[['close', 'TSI_std', 'TSI_fast', 'TSI_slow']].tail())
print("\n" + "=" * 60 + "\n")
# ========== 第五步:零轴穿越信号 ==========
df['TSI_above_zero'] = df['TSI'] > 0
df['cross_above_zero'] = (df['TSI_above_zero'] == True) & (df['TSI_above_zero'].shift(1) == False)
df['cross_below_zero'] = (df['TSI_above_zero'] == False) & (df['TSI_above_zero'].shift(1) == True)
df['zero_signal'] = ''
df.loc[df['cross_above_zero'], 'zero_signal'] = '上穿零轴(买入信号)'
df.loc[df['cross_below_zero'], 'zero_signal'] = '下穿零轴(卖出信号)'
print("零轴穿越信号统计:")
print(f"上穿零轴数量:{df['cross_above_zero'].sum()}")
print(f"下穿零轴数量:{df['cross_below_zero'].sum()}")
print("\n" + "=" * 60 + "\n")
# ========== 第六步:信号线交叉信号 ==========
# 金叉:TSI上穿信号线
df['golden_cross'] = (df['TSI'] > df['TSIs']) & (df['TSI'].shift(1) <= df['TSIs'].shift(1))
# 死叉:TSI下穿信号线
df['death_cross'] = (df['TSI'] < df['TSIs']) & (df['TSI'].shift(1) >= df['TSIs'].shift(1))
# 区分交叉位置
df['golden_strong'] = df['golden_cross'] & (df['TSI'] > 0)
df['golden_weak'] = df['golden_cross'] & (df['TSI'] <= 0)
df['death_strong'] = df['death_cross'] & (df['TSI'] < 0)
df['death_weak'] = df['death_cross'] & (df['TSI'] >= 0)
df['trade_signal'] = ''
df.loc[df['golden_strong'], 'trade_signal'] = '强势金叉(买入信号)'
df.loc[df['golden_weak'], 'trade_signal'] = '弱势金叉(参考)'
df.loc[df['death_strong'], 'trade_signal'] = '强势死叉(卖出信号)'
df.loc[df['death_weak'], 'trade_signal'] = '弱势死叉(参考)'
print("信号线交叉信号统计:")
print(f"金叉(买入)数量:{df['golden_cross'].sum()}")
print(f" 其中强势金叉(TSI>0):{df['golden_strong'].sum()}")
print(f"死叉(卖出)数量:{df['death_cross'].sum()}")
print(f" 其中强势死叉(TSI<0):{df['death_strong'].sum()}")
print("\n最近15个交易信号:")
signals = df[df['trade_signal'] != ''].tail(15)
if not signals.empty:
print(signals[['close', 'TSI', 'TSIs', 'trade_signal']])
print("\n" + "=" * 60 + "\n")
# ========== 第七步:阈值突破信号 ==========
THRESHOLD_HIGH = 25
THRESHOLD_LOW = -25
df['trend_signal'] = ''
df.loc[df['TSI'] > THRESHOLD_HIGH, 'trend_signal'] = '强势多头(动能充沛)'
df.loc[df['TSI'] < THRESHOLD_LOW, 'trend_signal'] = '强势空头(下行显著)'
df.loc[(df['TSI'] > 0) & (df['TSI'] <= THRESHOLD_HIGH), 'trend_signal'] = '正常多头区域'
df.loc[(df['TSI'] < 0) & (df['TSI'] >= THRESHOLD_LOW), 'trend_signal'] = '正常空头区域'
print("趋势强度分布统计:")
print(df['trend_signal'].value_counts())
print("\n" + "=" * 60 + "\n")
# ========== 第八步:背离检测(简化版) ==========
# 计算20日价格变化和TSI变化
df['price_change_20d'] = df['close'].diff(20)
df['tsi_change_20d'] = df['TSI'].diff(20)
# 检测潜在背离
df['potential_bearish_div'] = (df['price_change_20d'] > 0) & (df['tsi_change_20d'] < 0)
df['potential_bullish_div'] = (df['price_change_20d'] < 0) & (df['tsi_change_20d'] > 0)
print("潜在背离信号统计(20日尺度):")
print(f"潜在顶背离(价格涨TSI跌)数量:{df['potential_bearish_div'].sum()}")
print(f"潜在底背离(价格跌TSI涨)数量:{df['potential_bullish_div'].sum()}")
print("注:完整背离需结合局部高/低点分析,此处为方向对比")
print("\n" + "=" * 60 + "\n")
# ========== 第九步:策略回测(信号线交叉策略) ==========
# 策略:TSI上穿信号线买入,下穿信号线卖出
df['position'] = 0
in_position = False
for i in range(1, len(df)):
if not in_position and df['golden_cross'].iloc[i]:
df.loc[df.index[i], 'position'] = 1
in_position = True
elif in_position and df['death_cross'].iloc[i]:
df.loc[df.index[i], 'position'] = 0
in_position = False
else:
df.loc[df.index[i], 'position'] = df['position'].iloc[i-1]
# 计算收益
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']
total_return_buyhold = (1 + df['returns']).prod() - 1
total_return_strategy = (1 + df['strategy_returns']).prod() - 1
win_rate = (df['strategy_returns'] > 0).sum() / (df['strategy_returns'] != 0).sum() if (df['strategy_returns'] != 0).sum() > 0 else 0
print("=" * 60)
print("策略绩效统计(TSI信号线交叉策略回测):")
print(f"买入持有策略总收益率:{total_return_buyhold:.2%}")
print(f"TSI交叉策略总收益率:{total_return_strategy:.2%}")
print(f"策略胜率:{win_rate:.2%}")
print("\n注意:此为简化回测,仅供参考")
print("=" * 60 + "\n")
# ========== 第十步:可视化 ==========
plt.figure(figsize=(14, 12))
# 子图1:价格走势
plt.subplot(2, 1, 1)
plt.plot(df.index[-200:], df['close'][-200:], label='Close Price',
linewidth=1.5, color='black')
plt.title('Price Chart (Last 200 days)', fontsize=14)
plt.ylabel('Price')
plt.legend()
plt.grid(True, alpha=0.3)
# 子图2:TSI指标
plt.subplot(2, 1, 2)
plt.plot(df.index[-200:], df['TSI'][-200:], label='TSI主线',
linewidth=1.5, color='blue')
plt.plot(df.index[-200:], df['TSIs'][-200:], label='信号线',
linewidth=1.5, color='orange', linestyle='--')
plt.axhline(y=0, color='red', linestyle='-', linewidth=1.5, label='零轴')
plt.axhline(y=25, color='purple', linestyle=':', linewidth=1, label='+25阈值')
plt.axhline(y=-25, color='purple', linestyle=':', linewidth=1, label='-25阈值')
# 填充零轴上下区域
plt.fill_between(df.index[-200:], 0, df['TSI'][-200:],
alpha=0.1, color='green', where=(df['TSI'][-200:] > 0))
plt.fill_between(df.index[-200:], df['TSI'][-200:], 0,
alpha=0.1, color='red', where=(df['TSI'][-200:] < 0))
# 标记交叉点
golden_signals = df[df['golden_cross']]
death_signals = df[df['death_cross']]
plt.scatter(golden_signals.index[-30:], golden_signals['TSI'][-30:],
color='green', marker='^', s=80, label='金叉(买入)', alpha=0.8)
plt.scatter(death_signals.index[-30:], death_signals['TSI'][-30:],
color='red', marker='v', s=80, label='死叉(卖出)', alpha=0.8)
plt.title('TSI(真实强度指数)- 双重平滑动量指标', fontsize=14)
plt.xlabel('Date')
plt.ylabel('TSI Value')
plt.legend(loc='upper left')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# ========== 第十一步:数据清洗提示 ==========
nan_count = df['TSI'].isna().sum()
print(f"\nTSI初始NaN数量:{nan_count}")
print("原因:TSI需要至少slow周期(默认25)个数据点才能完成双重平滑计算")
print("处理建议:df_clean = df.iloc[25:].copy()")
print("\n" + "=" * 60)
print("TSI使用提示:")
print("1. TSI值域通常为-100到+100,零轴是多空分界线")
print("2. 上穿零轴是买入信号,下穿零轴是卖出信号")
print("3. 金叉(TSI上穿信号线)是最常用的入场信号")
print("4. ±25阈值可用于确认强趋势、过滤弱势信号")
print("5. 背离是最可靠的趋势反转预警信号")
print("6. 建议与RSI、MACD等指标配合使用,提高信号可靠性")
print("7. TSI双重平滑有效过滤噪音,适合中长线趋势跟踪")
print("=" * 60)
五、总结
TSI(真实强度指数)是一种通过双重指数平滑技术处理价格动量的先进技术指标,其核心价值与定位如下:
| 维度 | 特点 | ||
|---|---|---|---|
| 核心创新 | 双重EMA平滑 + 动量归一化处理 | ||
| 核心公式 | TSI = 100 × EMA(EMA(PC, slow), fast) / EMA(EMA( | PC | , slow), fast) |
| 双线结构 | TSI主线 + 信号线 | ||
| 三大核心信号 | 零轴穿越、信号线金叉死叉、顶底背离 | ||
| 阈值参考 | ±25作为趋势强弱辅助判断 | ||
| 默认参数 | fast=13, slow=25, signal=13 | ||
| 最佳应用场景 | 趋势确认、动量分析、中长线交易 | ||
| 主要局限 | 滞后性、震荡市假信号、无统一超买超卖阈值 |
实战使用三原则:
- 零轴定方向,信号线定时机:TSI在零轴上方时只考虑做多,等待TSI线上穿信号线的金叉时机入场;零轴下方只考虑做空,等待死叉信号
- 阈值确认强度:使用±25阈值区分强势趋势与普通波动,仅在TSI突破这些阈值时才确认趋势足够强劲,避免在弱势行情中过度交易
- 背离是最强预警:当价格与TSI出现背离时,往往是重要的趋势反转信号,应给予高度重视。但背离是预警而非精确入场指令,需等待价格确认
最后提醒 :TSI的最大价值在于其双重平滑特性------既保留了动量指标的灵敏度,又有效过滤了市场噪音。这使得TSI在趋势确认方面优于RSI,在信号平滑方面优于MACD。然而,这种平滑是以滞后为代价的。TSI的价值在于验证趋势、增强信心,而非预测价格。将TSI与RSI、布林带等工具结合使用,构建"趋势过滤+动量确认+价格验证"的完整交易系统,才是发挥其最大价值的正确方式。