第四节:技术指标计算——让数据开口说话

技术指标这东西,说白了就是把价格、成交量这些原始数据,通过数学公式加工一下,让它变得更直观。我刚开始做量化的时候,总觉得指标越多越好,恨不得把市面上所有指标都堆上去。结果呢?过拟合严重,实盘一跑就露馅。后来我学乖了——指标不在多,在于理解它的本质

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)
我的经验:EMA的alpha参数其实可以调。我曾在某个高频策略里把alpha设成0.5,相当于只看最近两天的数据,效果反而比标准EMA好。别被教科书绑死。

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时忘记处理除零异常,结果某只股票连续跌停时,RSI直接变成了NaN。后来我加了个小常数1e-10,问题解决。

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没创新高,这叫顶背离,是强烈的反转信号
我的实战心得:MACD在震荡市里频繁金叉死叉,容易让人亏钱。我一般会加一个过滤条件——只有DIF在零轴上方时,才考虑金叉信号。这样能过滤掉大部分假信号。

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准确率高不少。

知识体系总览

下面这张图,是我自己整理的技术指标知识体系。你看一眼就能明白各个指标之间的关系:

技术指标知识体系 原始价格数据 移动平均线 RSI 布林带 MACD 趋势识别 判断价格方向与强度 超买超卖 识别极端价格区域 波动率分析 衡量市场活跃度 交易信号生成 自定义指标(如VWMI)

从这张图你能看到,所有技术指标最终都指向同一个目标——生成交易信号。但我要提醒你:指标只是工具,不是圣杯。我见过有人用20个指标叠加,结果信号互相矛盾,最后干脆抛硬币决定买卖方向。

我的建议:刚开始做量化,先吃透2-3个指标就够了。把MA、RSI、布林带这三个玩明白,你就能跑赢80%的散户。等实盘稳定了,再慢慢加自定义指标。

好了,这一节的内容就到这。代码我都贴出来了,你直接复制就能用。下一节我们会讲如何把这些指标组合成一个完整的交易策略——嗯,那才是真正有意思的部分。


专注资料整理