第四讲:单指标信号策略——从金叉死叉到布林带突破
各位同学,欢迎来到第四讲。
今天我们要聊的,是量化交易里最基础、也最实用的东西——单指标信号策略。说白了,就是只用一个技术指标,来生成买卖信号。
你可能会想:“一个指标够用吗?” 嗯,我刚开始做量化的时候也这么问过。但后来发现,单指标策略虽然简单,却是理解整个信号生成逻辑的基石。你想想看,如果连一个指标都玩不转,那组合多个指标只会更乱。
4.1 基于SMA的金叉死叉策略
先说说SMA,简单移动平均线。金叉死叉,应该是每个交易者入门时都会接触到的概念。
金叉:短期均线上穿长期均线,看涨信号。
死叉:短期均线下穿长期均线,看跌信号。
我个人习惯用5日均线和20日均线做组合。为什么?因为5日代表一周的交易情绪,20日差不多是一个月。这个组合在日线级别上,反应速度适中,不会太敏感也不会太迟钝。
核心逻辑:当短期均线从下方穿过长期均线时,说明短期趋势转强,买入;反之,卖出。
来看代码实现:
import pandas as pd
import numpy as np
def sma_cross_strategy(df, short_window=5, long_window=20):
"""
基于SMA金叉死叉的策略
df: 包含'close'列的DataFrame
"""
df = df.copy()
# 计算短期和长期SMA
df['sma_short'] = df['close'].rolling(window=short_window).mean()
df['sma_long'] = df['close'].rolling(window=long_window).mean()
# 生成信号
df['signal'] = 0
# 金叉:短期上穿长期
df.loc[(df['sma_short'] > df['sma_long']) &
(df['sma_short'].shift(1) <= df['sma_long'].shift(1)), 'signal'] = 1
# 死叉:短期下穿长期
df.loc[(df['sma_short'] < df['sma_long']) &
(df['sma_short'].shift(1) >= df['sma_long'].shift(1)), 'signal'] = -1
return df
避坑指南:我曾经在实盘回测时发现,金叉死叉在震荡行情里频繁出错。后来我加了一个过滤条件——只有当两条均线之间的距离超过某个阈值时,才触发信号。效果好了不少。
这里有个细节要注意:shift(1) 是用来比较当前值和前一个值的。如果不加这个,你可能会在均线持续处于交叉状态时反复触发信号。
4.2 基于RSI的超买超卖策略
接下来是RSI,相对强弱指标。这个指标用来衡量价格变动的速度和幅度。
RSI的取值范围是0到100。通常,RSI高于70被认为是超买,可能回调;RSI低于30被认为是超卖,可能反弹。
但说实话,我在项目中遇到过很多次,RSI到了80还在涨,到了20还在跌。为什么会这样?因为趋势行情里,RSI会长时间停留在极端区域。
注意:RSI的超买超卖策略更适合震荡行情,在强趋势行情中容易逆势操作,导致亏损。
代码实现如下:
def rsi_strategy(df, period=14, overbought=70, oversold=30):
"""
RSI超买超卖策略
"""
df = df.copy()
# 计算价格变化
delta = df['close'].diff()
# 分别计算上涨和下跌的均值
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=period).mean()
avg_loss = loss.rolling(window=period).mean()
# 计算RSI
rs = avg_gain / avg_loss
df['rsi'] = 100 - (100 / (1 + rs))
# 生成信号
df['signal'] = 0
# 超卖反弹:RSI从下方上穿30
df.loc[(df['rsi'] > oversold) &
(df['rsi'].shift(1) <= oversold), 'signal'] = 1
# 超买回调:RSI从上方下穿70
df.loc[(df['rsi'] < overbought) &
(df['rsi'].shift(1) >= overbought), 'signal'] = -1
return df
嗯,这里要注意RSI的计算方式。很多新手直接用现成的库,但我觉得理解原理更重要。你看,RSI本质上就是衡量上涨力度和下跌力度的比值。
4.3 基于布林带的突破策略
最后一个是布林带。这个指标由三条线组成:中轨(通常是20日均线)、上轨和下轨(中轨加减两倍标准差)。
布林带的核心思想是:价格突破上轨时,可能继续上涨;跌破下轨时,可能继续下跌。但这里有个反直觉的地方——很多人以为突破上轨就该卖,其实不是。
关键点:布林带突破策略更适用于捕捉趋势的延续,而不是反转。价格突破上轨,说明波动率在扩大,趋势可能加速。
来看代码:
def bollinger_breakout_strategy(df, window=20, num_std=2):
"""
布林带突破策略
"""
df = df.copy()
# 计算中轨、标准差
df['middle'] = df['close'].rolling(window=window).mean()
df['std'] = df['close'].rolling(window=window).std()
# 计算上下轨
df['upper'] = df['middle'] + num_std * df['std']
df['lower'] = df['middle'] - num_std * df['std']
# 生成信号
df['signal'] = 0
# 向上突破:收盘价突破上轨
df.loc[df['close'] > df['upper'], 'signal'] = 1
# 向下突破:收盘价跌破下轨
df.loc[df['close'] < df['lower'], 'signal'] = -1
return df
个人经验:我曾经在回测布林带策略时,发现直接使用收盘价突破会频繁假突破。后来我改用“连续两日收盘价都在轨道之外”作为确认条件,信号质量提升了很多。
三种策略对比
为了方便你理解,我把三种策略的核心特点整理成了表格:
| 策略 | 核心逻辑 | 适用行情 | 常见问题 |
|---|---|---|---|
| SMA金叉死叉 | 短期均线上穿/下穿长期均线 | 趋势行情 | 震荡行情频繁假信号 |
| RSI超买超卖 | RSI进入极端区域后反转 | 震荡行情 | 趋势行情中逆势亏损 |
| 布林带突破 | 价格突破轨道后延续趋势 | 趋势行情 | 假突破较多 |
你看,没有哪个策略是万能的。每种策略都有自己的脾气,你得知道它在什么环境下好用,什么环境下会翻车。
小结
这一讲我们聊了三个最经典的单指标策略。说实话,这些策略单独使用效果有限,但它们是构建复杂策略的基石。你想想看,如果连金叉死叉都写不对,那后面多因子模型、机器学习模型就更别谈了。
下一讲,我们会把这些单指标组合起来,看看多指标共振策略怎么做。到时候你会发现,原来单指标的那些坑,组合起来反而能互相弥补。
好了,今天的课就到这里。代码部分建议你亲自跑一遍,看看不同参数下信号的变化。有什么问题,我们课程群里聊。