第2篇 均线——那条股票软件里最常见的线,到底在说什么?
这是「量化从零到实战」系列的第 2 篇。上篇我们聊了量化交易的本质,这篇来学你的第一个量化信号:均线。学完你就能用代码画出均线、看懂金叉死叉,甚至能写出自己的第一个买卖策略。
先说个场景
你打开股票软件,看到K线上面缠着好几条彩色线——红的、黄的、蓝的、紫的。
你大概知道这些线叫「均线」,但具体是什么意思?为什么有时候股价涨到均线就弹回去,有时候又直接穿过去了?
今天我们就把这条线彻底搞明白。
均线到底是什么?
一句话:均线就是过去 N 天收盘价的平均值,连成一条线。
听起来太简单了?但它背后的逻辑特别有道理。
想想看,如果一只股票最近5天的收盘价分别是:
周一 10.0 元
周二 10.5 元
周三 10.2 元
周四 10.8 元
周五 11.0 元
那它周五的5日均线就是:
(10.0 + 10.5 + 10.2 + 10.8 + 11.0) ÷ 5 = 10.5 元
把每天的5日均线算出来,连成线,就是你看到的均线。
就这么简单。没有黑魔法,没有玄学,就是平均值。
但这个平均值有大用处——它能帮你看到趋势的方向。单日的涨跌是噪音,但5天、20天、60天的平均值,就把噪音过滤掉了,剩下的是趋势本身。
均线为什么有用?
想象你在一条河里漂流,水流的方向就是趋势。
水面会有波浪(每日涨跌),但如果你看的是整条河的平均水位(均线),水流方向就清晰多了。
均线的本质是买方的平均成本线。
这条均线向上走,说明这段时间大家的买入成本在不断增加——愿意出更高价格的人在变多。那股价跌到均线附近,很多人会觉得「便宜」,就会去买,形成支撑。
反过来,均线向下走,股价弹到均线附近,亏钱的人急着解套卖掉,形成压力。
美国投资大师约瑟夫·葛兰碧(Joseph Granville)在1960年代提出了「八大法则」,核心思想就一句话:均线对股价就像地心引力——涨多了会被拉回来,跌多了也会弹回去。 半个多世纪过去了,这个规律在A股依然成立。2024年2月,上证指数跌破250日年线后加速下探至2635点,随后在年线附近反复拉锯,最终用3个月时间重新站上年线,开启了一轮超过15%的反弹。
上图:天龙集团2025年日线+MA20。可以清楚看到:股价在线上时(橙色区域),MA20就像「地板」托住价格,每次跌到均线附近就弹回去;股价在线下时(蓝色区域),MA20变成了「天花板」,每次涨到均线附近就被压回来。这就是均线的支撑和压力效应。
几条常用的均线
不同的 N,代表不同的「观察窗口」:
| 均线 | 含义 | 用途 |
|---|---|---|
| MA5 | 一周均价 | 超短线,看几天内的波动 |
| MA10 | 两周均价 | 短线参考 |
| MA20 | 一个月均价 | 短中线,常作为「生命线」 |
| MA60 | 一个季度均价 | 中线趋势判断 |
| MA120 | 半年均价 | 中长线,也叫「半年线」 |
| MA250 | 一年均价 | 长线趋势,也叫「年线」 |
新手建议先记住 MA5、MA20、MA60 这三条就够了。
上图:天龙集团2025-2026年日线,叠加了MA5/10/20/60/120/250共6条均线,每条颜色不同。可以明显看到:短期均线(MA5红色/MA10橙色)紧贴股价上下跳动,长期均线(MA120蓝色/MA250紫色)走势平缓像慢车道——周期越长,均线越「稳」,对噪音的过滤能力越强。
金叉和死叉
这是均线最经典的买卖信号。
金叉:短期均线从下方穿过长期均线,向上交叉。
简单理解:近期的平均价格涨过了长期的平均价格,说明涨势起来了。这是一个买入信号。
死叉:短期均线从上方穿过长期均线,向下交叉。
说明近期均价跌破了长期均价,跌势确立。这是一个卖出信号。
举个例子,最常见的组合是 MA5 和 MA20 的金叉死叉:
- MA5 上穿 MA20 → 金叉,考虑买入
- MA5 下穿 MA20 → 死叉,考虑卖出
但要提醒你:均线是滞后指标。 金叉出现的时候,股价已经涨了一截了;死叉出现的时候,已经跌了一段了。所以均线适合判断趋势,不适合精确抄底逃顶。
上图:天龙集团2026年1-4月日线 + MA5(红线)/ MA20(蓝线),4个标记点分别是2次金叉和2次死叉。可以看到金叉后股价确实上涨了一波,但死叉信号明显滞后——等到死叉出现时,利润已经回吐了不少。
2026年1月到4月,天龙集团(300063)用 MA5/MA20 策略一共出现了 2次金叉、2次死叉。具体来看:
- 1月5日,金叉:MA5上穿MA20,收盘价8.91元。股价从底部启动,短期均价重新站上中期均价。
- 2月24日,死叉:MA5下穿MA20,收盘价14.14元。说明短期均价跌破中期均价,跌势确立。之后股价确实继续下行。
- 4月10日,金叉:MA5上穿MA20,收盘价11.88元。如果你按信号买入,当时 MA5=11.65,MA20=11.57。
- 4月28日,死叉:MA5再次下穿MA20,收盘价10.95元。金叉仅维持了约2周就转死叉。
总结一下这4次信号:金叉买入 → 死叉卖出,两次完整的交易周期。第一笔赚了约58%,第二笔亏了约8%,合计净赚约45%。 当然这是最理想的「严格执行」结果,实盘中你可能犹豫、恐高、止损不及时……所以回测很重要,我们下篇会详细讲。
用 Python 算均线(手把手)
理论讲完了,现在来实操。三行代码搞定:
第一步:获取数据
import akshare as ak
import pandas as pd
# 获取天龙集团(300063)日K数据
df = ak.stock_zh_a_hist(symbol="300063", period="daily", start_date="20250101", end_date="20260430")
df = df[["日期", "收盘"]].copy() # 只保留日期和收盘价
第二步:算均线(就一行)
df["MA5"] = df["收盘"].rolling(window=5).mean() # 5日均线
df["MA10"] = df["收盘"].rolling(window=10).mean() # 10日均线
df["MA20"] = df["收盘"].rolling(window=20).mean() # 20日均线
df["MA60"] = df["收盘"].rolling(window=60).mean() # 60日均线
df["MA120"]= df["收盘"].rolling(window=120).mean() # 120日均线(半年线)
df["MA250"]= df["收盘"].rolling(window=250).mean() # 250日均线(年线)
rolling(window=5).mean() 的意思就是:取当前行和前面4行的收盘价,算平均值。这就是5日均线。
rolling是 pandas 里做滑动计算的利器,后面你会经常用到。
第三步:画出来
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(df["日期"], df["收盘"], label="收盘价", color="gray", linewidth=1, alpha=0.7)
ax.plot(df["日期"], df["MA5"], label="MA5(5日线)", color="red", linewidth=1.2)
ax.plot(df["日期"], df["MA10"], label="MA10(10日线)", color="orange", linewidth=1.2)
ax.plot(df["日期"], df["MA20"], label="MA20(20日线)", color="blue", linewidth=1.5)
ax.plot(df["日期"], df["MA60"], label="MA60(60日线)", color="green", linewidth=1.5)
ax.plot(df["日期"], df["MA120"], label="MA120(半年线)", color="purple", linewidth=1.2, linestyle="--")
ax.plot(df["日期"], df["MA250"], label="MA250(年线)", color="brown", linewidth=1.2, linestyle="--")
ax.set_title("天龙集团 收盘价 + 6条均线", fontsize=14)
ax.set_xlabel("日期"); ax.set_ylabel("价格(元)")
ax.legend()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
plt.xticks(rotation=45); plt.grid(True, alpha=0.3)
plt.tight_layout(); plt.show()
运行这段代码,你就能看到股价和六条均线的关系。 MA5 紧贴着股价跑,MA20 走得更平缓——因为20天的平均值反应更慢,但也更稳。
找出金叉和死叉
光画图不够,我们用代码把金叉死叉的日期找出来:
# 标记金叉:MA5 从下方穿过 MA20
df["金叉"] = (df["MA5"] > df["MA20"]) & (df["MA5"].shift(1) <= df["MA20"].shift(1))
# 标记死叉:MA5 从上方穿过 MA20
df["死叉"] = (df["MA5"] < df["MA20"]) & (df["MA5"].shift(1) >= df["MA20"].shift(1))
# 打印结果
golden = df[df["金叉"]][["日期", "收盘", "MA5", "MA20"]]
death = df[df["死叉"]][["日期", "收盘", "MA5", "MA20"]]
print("=== 金叉日期 ===")
print(golden.to_string(index=False))
print("\n=== 死叉日期 ===")
print(death.to_string(index=False))
逻辑很简单:
shift(1)是取上一行的值- 今天 MA5 > MA20,昨天 MA5 ≤ MA20 → 就是刚穿过,金叉
- 反过来就是死叉
这就是你的第一个量化信号。虽然很简单,但很多专业策略的金叉死叉逻辑,本质上跟这一模一样。
EMA 和 SMA 是什么?
你可能还听过 EMA(指数移动平均线)和 SMA(简单移动平均线)。
别慌,区别很简单:
- SMA / MA:所有天数权重一样。周一和周五的价格,对均线的贡献一样大
- EMA:越近的价格权重越大。今天的价格比5天前的价格影响更大
用大白话说:EMA 反应更快,MA 更稳。
# EMA 只需要换一个函数
df["EMA12"] = df["收盘"].ewm(span=12).mean() # 12日指数移动平均
新手先用 MA 就够了。等你觉得 MA 太慢、信号总是迟到,再换 EMA 试试。
均线的局限
讲到这里必须泼盆冷水:
- 均线是滞后的。 等金叉出来的时候,行情可能已经走了一半。如果等死叉才卖,利润可能已经回吐了不少
- 震荡行情里均线会反复金叉死叉,频繁发出假信号。 你来回买卖,手续费都亏出去
- 单靠均线不能做决策。 需要结合成交量、趋势强度等其他指标
均线是工具,不是圣杯。它是你工具箱里的第一把扳手,但不是唯一的一把。
课后小练习
- 把代码里的
300063换成600519(贵州茅台),看看 MA5 和 MA20 的金叉死叉有什么不同 - 把 MA20 换成 MA60,看看金叉信号是不是变少了?信号少了是好事还是坏事?
- 试试用
ewm(span=12)画一条 EMA12,对比它和 MA12 谁反应更快
下期预告
第 3 篇我们来讲回测——你已经有了均线信号,但怎么知道这个信号到底能不能赚钱?我们会用代码模拟「如果我真的按金叉买、死叉卖,最终赚了还是亏了」。
这才是量化交易最核心的一步:用数据验证你的想法。
我们下篇见!
觉得有帮助?点个在看 👍
关注「量化从零到实战」系列 · 每篇一个实用技能
这是「量化从零到实战」系列第 2 篇,整个系列持续更新中。有什么问题欢迎留言。
夜雨聆风