作 者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:我今天挑选了4个既简单好用又懂国内口味的技术指标:STC趋势加速器、CHOP震荡探测器、VZO量能透视仪、CMF资金扫描仪。手把手教你用Python实现,附完整代码。无论抓趋势还是做波段,这些工具都能帮你少走弯路!
老指标就像用旧地图找新大陆,主力早把MACD、KDJ玩烂了。今天带大家解锁的4个冷门指标,能帮你:
- 比MACD快2倍捕捉趋势拐点。
- 一眼看穿主力是在真拉升还是假突破。
- 量化市场震荡强度,避免被反复打脸。
在算法交易中,技术指标是不可或缺的工具。而解锁新的算法交易技能就是你需要掌握的技能,今天讲的这些指标不仅能帮助你分析股市趋势,还能提升你的交易决策能力。
接下来,我们将逐一讲解每个指标的原理、使用方法,并提供Python代码实现。
1. STC趋势加速器
STC(Schaff Trend Cycle)是一种改进的MACD指标。简单来说,它是把MACD和波动率指标杂交升级,像给趋势装了显微镜。STC的值在0到100之间波动,适合捕捉市场短期变化。
STC的计算步骤
- 首先,计算短期(通常12周期)和长期(通常26周期)的指数移动平均线(EMA)。
- 然后,计算短期EMA与长期EMA的差值,得到MACD线。
- 接着,计算MACD线的9周期移动平均线,称为信号线。
- 最后,使用随机过程将MACD差值归一化到0-100的范围,得到STC值。
STC的信号判断
指标位置 | 市场信号 | 操作建议 |
---|---|---|
上穿75 | 超买区 | 准备获利了结 |
下破25 | 超卖区 | 关注抄底机会 |
站稳50上方 | 牛市确认 | 逢低加仓 |
例如,当STC高于75时,市场可能过热,价格可能下跌;低于25时,市场可能超卖,价格可能上涨。穿过50可以确认趋势方向。
代码实现
下面是计算STC的Python代码:
# STC趋势加速器计算
def 计算_STC(数据, 短线=12, 长线=26):
数据['快线'] = 数据['收盘价'].ewm(span=短线).mean() # 计算快速均线
数据['慢线'] = 数据['收盘价'].ewm(span=长线).mean() # 计算慢速均线
MACD线 = 数据['快线'] - 数据['慢线']
... # 完整代码见文末

上图是一张STC指标的图表,展示它如何与股价一起变化,突出超买和超卖区域。
2. CHOP震荡探测器
CHOP(Choppiness Index)是一个判断市场趋势(价格持续上涨或下跌)或震荡(价格横盘)的波动性指标。
市场像拳击手——要么重拳出击(趋势),要么左右摇摆(震荡)。这个指标就是裁判,0-100分告诉你现在谁占优,值越高表示市场越震荡,值越低表示市场越有趋势。
CHOP的计算步骤
- 首先,计算每个周期的最高价与最低价之间的范围(High – Low)。
- 然后,将过去14周期的范围相加,得到平均真实范围(ATR)。
- 接着,找到过去14周期的最高价和最低价。
- 最后,使用对数公式计算CHOP:100 * log10(ATR / (最高价 – 最低价)) / log10(周期数)。
CHOP的信号判断
CHOP值 | 含义 |
---|---|
>61.8 | 市场震荡(横盘),适合观望或区间交易 |
<38.2 | 市场趋势,适合趋势跟踪策略 |
下降 | 预计价格将出现强劲波动 |

例如,当CHOP高于61.8时,市场可能在横盘,交易者应避免趋势策略;低于38.2时,市场可能有明确趋势,适合追随趋势。
代码实现
下面是计算CHOP的Python代码:
def calculate_choppiness_index(df, period=14):
high_low_range = df['High'] - df['Low']
atr = high_low_range.rolling(window=period).sum()
max_high = df['High'].rolling(window=period).max()
min_low = df['Low'].rolling(window=period).min()
chop = 100 * np.log10(atr / (max_high - min_low)) / np.log10(period)
return chop
代码解析:
- high_low_range:计算每个周期的最高价与最低价之差。
- atr:计算过去14周期的总ATR。
- max_high 和 min_low:找到过去14周期的最高价和最低价。
- chop:使用对数公式计算CHOP值。
3. VZO量能透视仪
VZO(Volume Zone Oscillator)是一个衡量成交量买卖压力的指标。它通过分析价格变化和成交量的关系,衡量市场的买卖压力,帮助识别积累(买盘)和分布(卖盘)区域。VZO的值在-100到+100之间波动。
比如茅台3月放量下跌时,VZO坚守40上方,果然1个月后暴涨18%!量能指标从不骗人。
VZO的计算步骤
- 首先,计算连续收盘价之间的变化(Close.diff())。
- 如果价格上涨,成交量记为正值;如果价格下跌,成交量记为负值。
- 然后,计算过去14周期的正成交量和负成交量总和。
- 最后,将正负成交量差值除以总成交量,并乘以100,得到VZO值。
VZO的信号判断
VZO值 | 含义 |
---|---|
>+40 | 看涨势头强劲,适合买入 |
<-40 | 看跌势头强劲,适合卖出 |
穿过0 | 确认趋势方向(向上为看涨,向下为看跌) |

例如,VZO高于+40表示买盘力量强,可能继续上涨;低于-40表示卖盘力量强,可能继续下跌。
代码实现
下面是计算VZO的Python代码:
def calculate_vzo(df, period=14):
close_diff = df['Close'].diff()
positive_volume = df['Volume'].where(close_diff > 0, 0)
negative_volume = df['Volume'].where(close_diff < 0, 0)
total_volume = df['Volume'].rolling(window=period).sum()
vzo = 100 * (positive_volume.rolling(window=period).sum() - negative_volume.rolling(window=period).sum()) / total_volume
return vzo
代码解析:
- close_diff:计算连续收盘价的变化。
- positive_volume 和 negative_volume:根据价格变化分配正负成交量。
- total_volume:计算过去14周期的总成交量。
- vzo:计算正负成交量差值并归一化到-100到+100。
4. CMF资金扫描仪
CMF(Chaikin Money Flow)是一个确认资金流向的强力工具。它结合价格和成交量数据,分析收盘价相对于最高价和最低价的位置,帮助确认趋势强弱。CMF的值在-1到+1之间波动。
当价格创新低但CMF抬升,说明主力偷偷吸筹;价格新高CMF背离,赶紧落袋为安!
CMF的计算步骤
- 首先,计算Money Flow Multiplier(MFM):[(Close – Low) – (High – Close)] / (High – Low)。
- 然后,将MFM乘以当期成交量,得到Money Flow Volume(MFV)。
- 接着,计算过去20周期的MFV总和,并除以同期总成交量,得到CMF值。
CMF的信号判断
CMF值 | 含义 |
---|---|
>+0.2 | 买盘压力强劲,趋势可能继续上涨 |
<-0.2 | 卖盘压力强劲,趋势可能继续下跌 |
穿过0 | 确认趋势方向(向上为看涨,向下为看跌) |

例如,CMF高于+0.2表示资金流入,可能支持上涨趋势;低于-0.2表示资金流出,可能支持下跌趋势。
代码实现
下面是计算CMF的Python代码:
def calculate_cmf(df, period=20):
money_flow = ((df['Close'] - df['Low']) - (df['High'] - df['Close'])) / (df['High'] - df['Low'])
money_flow_volume = money_flow * df['Volume']
cmf = money_flow_volume.rolling(window=period).sum() / df['Volume'].rolling(window=period).sum()
return cmf
代码解析:
- money_flow:计算Money Flow Multiplier。
- money_flow_volume:将MFM乘以成交量,得到MFV。
- cmf:计算过去20周期的MFV总和并除以总成交量。
5. 观点总结
这四种技术指标各有独特优势:STC快速捕捉趋势反转,CHOP判断市场趋势或震荡,VZO分析成交量压力,CMF确认资金流向。结合这些指标,你可以构建更强大的交易系统,提升决策准确性。
- STC:趋势发动机,改进的MACD指标,抓主升浪利器。
- CHOP:市场震荡探测器,波动性指标,避免被左右打脸。
- VZO:量能透视镜,成交量指标,衡量买卖压力,看穿主力底牌。
- CMF:资金扫描仪,资金流向指标,确认趋势强弱,跟踪聪明钱流向。
- 组合使用效果翻倍:趋势里吃肉,震荡里喝汤。
6. 完整代码
以下是完整的Python代码,用于下载股票数据、计算四个指标并绘制图表:
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
# 定义股票符号和时间段
symbol = '^GSPC' # 例如 S&P 500
start_date = '2020-01-01'
end_date = '2025-01-01'
# 下载股票数据
df = yf.download(symbol, start=start_date, end=end_date)
df.columns = ['Close', 'High', 'Low', 'Open', 'Volume']
# 计算 STC
def calculate_stc(df, short_ema=12, long_ema=26, stoch_period=10, signal_period=3):
df['Short_EMA'] = df['Close'].ewm(span=short_ema).mean()
df['Long_EMA'] = df['Close'].ewm(span=long_ema).mean()
macd = df['Short_EMA'] - df['Long_EMA']
df['MACD_Signal'] = macd.ewm(span=9).mean()
macd_diff = macd - df['MACD_Signal']
lowest_macd = macd_diff.rolling(stoch_period).min()
highest_macd = macd_diff.rolling(stoch_period).max()
df['STC'] = 100 * ((macd_diff - lowest_macd) / (highest_macd - lowest_macd))
return df['STC']
df['STC'] = calculate_stc(df)
# 计算 CHOP
def calculate_choppiness_index(df, period=14):
high_low_range = df['High'] - df['Low']
atr = high_low_range.rolling(window=period).sum()
max_high = df['High'].rolling(window=period).max()
min_low = df['Low'].rolling(window=period).min()
chop = 100 * np.log10(atr / (max_high - min_low)) / np.log10(period)
return chop
df['CHOP'] = calculate_choppiness_index(df)
# 计算 VZO
def calculate_vzo(df, period=14):
close_diff = df['Close'].diff()
positive_volume = df['Volume'].where(close_diff > 0, 0)
negative_volume = df['Volume'].where(close_diff < 0, 0)
total_volume = df['Volume'].rolling(window=period).sum()
vzo = 100 * (positive_volume.rolling(window=period).sum() - negative_volume.rolling(window=period).sum()) / total_volume
return vzo
df['VZO'] = calculate_vzo(df)
# 计算 CMF
def calculate_cmf(df, period=20):
money_flow = ((df['Close'] - df['Low']) - (df['High'] - df['Close'])) / (df['High'] - df['Low'])
money_flow_volume = money_flow * df['Volume']
cmf = money_flow_volume.rolling(window=period).sum() / df['Volume'].rolling(window=period).sum()
return cmf
df['CMF'] = calculate_cmf(df)
# 绘制指标
fig, axs = plt.subplots(5, 1, figsize=(12, 12), sharex=True)
# 绘制收盘价
axs[0].plot(df.index, df['Close'], label='Close Price', color='black')
axs[0].set_title('Close Price')
axs[0].legend()
# 绘制 STC
axs[1].plot(df.index, df['STC'], label='STC', color='blue')
axs[1].set_title('Schaff Trend Cycle (STC)')
axs[1].legend()
# 绘制 CHOP
axs[2].plot(df.index, df['CHOP'], label='CHOP', color='green')
axs[2].set_title('Choppiness Index (CHOP)')
axs[2].legend()
# 绘制 VZO
axs[3].plot(df.index, df['VZO'], label='VZO', color='red')
axs[3].set_title('Volume Zone Oscillator (VZO)')
axs[3].legend()
# 绘制 CMF
axs[4].plot(df.index, df['CMF'], label='CMF', color='purple')
axs[4].set_title('Chaikin Money Flow (CMF)')
axs[4].legend()
plt.tight_layout()
plt.show()
代码解析:
- 数据下载:使用yfinance库下载股票数据(如S&P 500)。
- 指标计算:分别调用四个函数计算STC、CHOP、VZO和CMF。
- 图表绘制:使用matplotlib绘制五个子图,分别展示收盘价和四个指标。
#算法交易 #技术指标 #STC #CHOP #VZO #CMF #Python #股市分析 #量化交易 #Python编程 #股票技术分析 #量化投资 #金融科技
读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。
Be First to Comment