前置风险提示
本文仅为量化交易技术研究与 Python 编程学习分享,所有策略逻辑、代码示例均为教学演示用途,不构成任何投资建议、交易指导或收益承诺。股票市场存在固有投资风险,历史回测结果不代表未来实际收益表现。实盘交易请充分评估自身风险承受能力,独立决策并自行承担相应风险。
书接上回,上一篇我们讲解了鳄鱼线的基础概念与盘面用法。本篇我们从量化视角出发,将鳄鱼线交易规则代码化,拆解核心逻辑,同时点明 90% 交易者都会忽略的平移陷阱,附上完整可运行的 Python 实现与回测代码。
一、鳄鱼线的核心交易规则
鳄鱼线本质是一套多周期均线组合的趋势跟踪体系,通过三条均线的相对位置和间距变化,识别趋势方向与强度。
1. 趋势判断:多头排列
当 唇线 (Lips) > 齿线 (Teeth) > 颚线 (Jaw) 时,快线在上、慢线在下,判定为上涨趋势;反之则为下跌趋势。
2. 趋势增强:价差扩散
定义价差 spread = | Lips – Jaw |,当三条线之间的距离持续变大(鳄鱼嘴越张越开),说明趋势动能在增强。
3. 完整入场逻辑
同时满足以下 4 个条件才触发买入信号,过滤无效噪音:
- 多头排列成立(趋势存在)
- spread 持续扩大(趋势增强)
- 收盘价站在快线(唇线)之上(价格确认)
- 价差占比过滤:排除窄幅震荡行情
4. 出场逻辑
满足任一条件即触发卖出信号:
- 三条线开始收拢(spread 缩小,趋势减弱)
- 价格跌破中线(齿线)
从本质上讲:鳄鱼线 = 多均线结构 + 动量扩散 + 波动过滤
二、最容易踩的坑:均线向右平移(shift)
这是全文最关键的部分,99% 的新手都会在这里出错。很多资料里提到的 “向前平移 n 期” 和 “向右平移 n 期”,本质是同一个操作,在 Pandas 中对应 .shift(n),作用是把均线整体向未来方向移动 n 个周期。
1. Python 中的标准写法
以颚线为例,原版鳄鱼线的标准写法为:
df['jaw'] = smma(df['close'], 13).shift(8)
2. 通俗理解平移逻辑
举个简单例子,假设原始数值序列为:
| 数值 | 11 | 13 | 14 | 10 | 12 |
执行 shift(2) 后,序列整体向未来方向移动 2 位,前两位填充为空值:
| 数值 | NaN | NaN | 11 | 13 | 14 |
3. 平移错误的严重影响
如果搞混平移方向,会直接引入未来函数:你在 t 时刻做交易决策,但指标被平移到了 t+8 的位置,相当于用未来的数据回测历史,会得到严重虚高的收益结果,实盘完全无法复现。这是量化策略最经典的陷阱之一。
三、Python 完整实现代码
1. 依赖导入与基础工具函数
首先实现 SMMA(平滑移动平均线)和鳄鱼线计算函数,支持开启 / 关闭平移效果,方便对比验证。
import pandas as pd
import matplotlib.pyplot as plt
def smma(series, period):
"""
计算平滑移动平均线(SMMA)
:param series: 价格序列
:param period: 计算周期
"""
return series.ewm(alpha=1/period, adjust=False).mean()
def alligator(df, use_shift=True):
"""
计算鳄鱼线三条均线
:param df: 包含close列的行情数据DataFrame
:param use_shift: 是否启用向右平移(标准鳄鱼线需开启)
"""
df = df.copy()
if use_shift:
df['jaw'] = smma(df['close'], 13).shift(8) # 颚线:13周期,平移8期
df['teeth'] = smma(df['close'], 8).shift(5) # 齿线:8周期,平移5期
df['lips'] = smma(df['close'], 5).shift(3) # 唇线:5周期,平移3期
else:
df['jaw'] = smma(df['close'], 13)
df['teeth'] = smma(df['close'], 8)
df['lips'] = smma(df['close'], 5)
return df
2. 交易信号生成函数
严格按照入场、出场逻辑生成信号,加入波动过滤条件,剔除震荡市无效信号。
def generate_signal(df):
"""
根据鳄鱼线生成买卖信号
"""
df = df.copy()
# 多头排列判断
df['bull'] = (df['lips'] > df['teeth']) & (df['teeth'] > df['jaw'])
# 唇线与颚线的价差
df['spread'] = (df['lips'] – df['jaw']).abs()
# 价差扩大 = 趋势增强
df['spread_up'] = df['spread'] > df['spread'].shift(1)
# 波动过滤:价差占价比大于1%,排除窄幅震荡
df['filter'] = df['spread'] / df['close'] > 0.01
# 买入信号:多头排列 + 趋势增强 + 价格破快线 + 非震荡
df['buy'] = df['bull'] & df['spread_up'] & (df['close'] > df['lips']) & df['filter']
# 卖出信号:价差缩小 或 价格跌破齿线
df['sell'] = (df['spread'] < df['spread'].shift(1)) | (df['close'] < df['teeth'])
return df
3. 简易回测函数
实现逐行回测逻辑,满仓进出,输出净值曲线。
def backtest(df):
"""
简易回测:满仓进出,暂不计算手续费与滑点
"""
position = 0 # 0=空仓,1=持仓
equity = 1 # 初始净值
curve = []
for i in range(1, len(df)):
# 空仓且出现买入信号,开仓
if position == 0 and df['buy'].iloc[i]:
position = 1
entry_price = df['close'].iloc[i]
# 持仓且出现卖出信号,平仓
elif position == 1 and df['sell'].iloc[i]:
exit_price = df['close'].iloc[i]
equity *= exit_price / entry_price
position = 0
curve.append(equity)
return curve
4. 可视化函数
绘制收盘价、鳄鱼三线与买卖信号点,直观展示策略效果。
def plot_alligator_with_signals(df, title="鳄鱼线交易策略"):
"""
可视化鳄鱼线与买卖信号
"""
plt.figure(figsize=(14, 7))
# 收盘价走势
plt.plot(df.index, df["close"], label="收盘价", color="black", linewidth=1)
# 鳄鱼三线
plt.plot(df.index, df["jaw"], label="颚线(Jaw)", color="#1f77b4")
plt.plot(df.index, df["teeth"], label="齿线(Teeth)", color="#ff7f0e")
plt.plot(df.index, df["lips"], label="唇线(Lips)", color="#2ca02c")
# 买卖信号标记
buy_points = df[df["buy"]]
sell_points = df[df["sell"]]
plt.scatter(buy_points.index, buy_points["close"], marker="^", color="red", s=40, label="买入信号")
plt.scatter(sell_points.index, sell_points["close"], marker="v", color="green", s=40, label="卖出信号")
plt.title(title)
plt.legend()
plt.tight_layout()
plt.show()
四、学习价值与使用建议
对于 Python 量化新手来说,亲手实现一遍鳄鱼线策略,可以巩固以下核心技能:
- Pandas 时序数据的 ewm、shift 基础操作
- 多条件组合生成交易信号的逻辑写法
- 多因子叠加的逻辑运算(与、或关系)
- 简易回测框架与净值曲线的实现思路
鳄鱼线的核心价值不是预测涨跌,而是趋势过滤—— 它帮你判断 “当前有没有值得参与的趋势”,帮你在震荡市管住手,在趋势行情拿住单。
五、写在最后
鳄鱼线是一套非常经典的趋势跟踪工具,量化实现的难点不在于代码本身,而在于对「平移机制」的正确理解。避开未来函数的坑,你的回测结果才有实盘参考意义。
感兴趣的朋友可以拿自己的行情数据跑一跑,调整周期参数和平移位数,看看不同标的上的效果差异。
如果觉得文章有用,欢迎点赞、收藏、关注,有问题可以在评论区交流~


