第四节:技术指标计算——让数据开口说话
技术指标这东西,说白了就是把价格、成交量这些原始数据,通过数学公式加工一下,让它变得更直观。我刚开始做量化的时候,总觉得指标越多越好,恨不得把市面上所有指标都堆上去。结果呢?过拟合严重,实盘一跑就露馅。后来我学乖了——指标不在多,在于理解它的本质。
4.1 移动平均线:最朴素的价格趋势过滤器
移动平均线(MA)是所有技术指标的基石。它的计算逻辑极其简单:取最近N天的收盘价,算个平均值。
简单移动平均线(SMA)
def sma(close_prices, window=20):
"""
计算简单移动平均线
:param close_prices: 收盘价序列
:param window: 窗口大小
:return: SMA序列
"""
import numpy as np
weights = np.ones(window) / window
return np.convolve(close_prices, weights, mode='valid')
嗯,这里要注意:np.convolve返回的结果长度是 len(close_prices) - window + 1。如果你需要保持长度一致,前面补NaN就行。
指数移动平均线(EMA)
EMA和SMA的区别在于——EMA给近期的数据更高的权重。我个人更偏爱EMA,因为它对价格变化反应更快。
def ema(close_prices, window=20):
"""
计算指数移动平均线
"""
alpha = 2 / (window + 1)
result = [close_prices[0]] # 初始值用第一个收盘价
for price in close_prices[1:]:
result.append(alpha * price + (1 - alpha) * result[-1])
return np.array(result)
4.2 相对强弱指标(RSI):判断超买超卖
RSI衡量的是价格变动的速度和幅度。它的核心思想是:涨多了会跌,跌多了会涨。
def rsi(close_prices, window=14):
"""
计算相对强弱指标
"""
delta = np.diff(close_prices)
gain = np.where(delta > 0, delta, 0)
loss = np.where(delta < 0, -delta, 0)
avg_gain = np.convolve(gain, np.ones(window)/window, mode='valid')
avg_loss = np.convolve(loss, np.ones(window)/window, mode='valid')
rs = avg_gain / (avg_loss + 1e-10) # 防止除零
rsi_values = 100 - (100 / (1 + rs))
return rsi_values
RSI的经典用法:超过70算超买,低于30算超卖。但说实话,在趋势行情里,RSI可以长时间维持在超买/超卖区域。我见过RSI在80以上挂了半个月的股票,你要是按传统方法做空,早就爆仓了。
4.3 布林带:动态的支撑阻力
布林带由三条线组成:中轨(SMA)、上轨(中轨+2倍标准差)、下轨(中轨-2倍标准差)。它的精妙之处在于——带宽会随波动率自动调整。
def bollinger_bands(close_prices, window=20, num_std=2):
"""
计算布林带
"""
middle = sma(close_prices, window)
rolling_std = pd.Series(close_prices).rolling(window).std().values[window-1:]
upper = middle + num_std * rolling_std
lower = middle - num_std * rolling_std
return upper, middle, lower
布林带最常用的策略是「带宽收缩突破」——当带宽缩到极窄时,往往预示着即将出现大行情。我在做期货策略时特别喜欢这个信号,胜率能到60%以上。
4.4 MACD指标:趋势与动量的结合
MACD由三部分组成:DIF线(快EMA-慢EMA)、DEA线(DIF的EMA)、柱状图(DIF-DEA)。
def macd(close_prices, fast=12, slow=26, signal=9):
"""
计算MACD指标
"""
ema_fast = ema(close_prices, fast)
ema_slow = ema(close_prices, slow)
dif = ema_fast - ema_slow
dea = ema(dif, signal)
histogram = 2 * (dif - dea)
return dif, dea, histogram
MACD的核心用法:
- 金叉/死叉:DIF上穿DEA为金叉(买入信号),下穿为死叉(卖出信号)
- 背离:价格创新高但MACD没创新高,这叫顶背离,是强烈的反转信号
4.5 自定义指标:打造你的独门武器
说实话,市面上能用的指标都被用烂了。真正赚钱的策略,往往用的是自定义指标。我给大家看一个我自己常用的——成交量加权动量指标(VWMI)。
def vwmi(close_prices, volume, window=14):
"""
自定义指标:成交量加权动量
核心思想:价格上涨时成交量越大,动量越强
"""
price_change = np.diff(close_prices) / close_prices[:-1]
volume_ratio = volume[1:] / np.mean(volume)
# 成交量加权动量
vwmi_values = price_change * volume_ratio
# 平滑处理
vwmi_smooth = np.convolve(vwmi_values, np.ones(window)/window, mode='valid')
return vwmi_smooth
这个指标的逻辑很简单:如果价格上涨伴随着放量,说明上涨是真实的;如果缩量上涨,那可能就是虚涨。我在A股市场测试过,这个指标比单纯的RSI准确率高不少。
知识体系总览
下面这张图,是我自己整理的技术指标知识体系。你看一眼就能明白各个指标之间的关系:
从这张图你能看到,所有技术指标最终都指向同一个目标——生成交易信号。但我要提醒你:指标只是工具,不是圣杯。我见过有人用20个指标叠加,结果信号互相矛盾,最后干脆抛硬币决定买卖方向。
好了,这一节的内容就到这。代码我都贴出来了,你直接复制就能用。下一节我们会讲如何把这些指标组合成一个完整的交易策略——嗯,那才是真正有意思的部分。