乐于分享
好东西不私藏

第2篇 均线——那条股票软件里最常见的线,到底在说什么?

第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. 1月5日,金叉:MA5上穿MA20,收盘价8.91元。股价从底部启动,短期均价重新站上中期均价。
  2. 2月24日,死叉:MA5下穿MA20,收盘价14.14元。说明短期均价跌破中期均价,跌势确立。之后股价确实继续下行。
  3. 4月10日,金叉:MA5上穿MA20,收盘价11.88元。如果你按信号买入,当时 MA5=11.65,MA20=11.57。
  4. 4月28日,死叉:MA5再次下穿MA20,收盘价10.95元。金叉仅维持了约2周就转死叉。

总结一下这4次信号:金叉买入 → 死叉卖出,两次完整的交易周期。第一笔赚了约58%,第二笔亏了约8%,合计净赚约45%。 当然这是最理想的「严格执行」结果,实盘中你可能犹豫、恐高、止损不及时……所以回测很重要,我们下篇会详细讲。

用 Python 算均线(手把手)

理论讲完了,现在来实操。三行代码搞定:

第一步:获取数据

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()  # 只保留日期和收盘价

第二步:算均线(就一行)

python
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 里做滑动计算的利器,后面你会经常用到。

第三步:画出来

python
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天的平均值反应更慢,但也更稳。

找出金叉和死叉

光画图不够,我们用代码把金叉死叉的日期找出来:

python
# 标记金叉: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 更稳。

python
# EMA 只需要换一个函数
df["EMA12"] = df["收盘"].ewm(span=12).mean()  # 12日指数移动平均

新手先用 MA 就够了。等你觉得 MA 太慢、信号总是迟到,再换 EMA 试试。

均线的局限

讲到这里必须泼盆冷水:

  1. 均线是滞后的。 等金叉出来的时候,行情可能已经走了一半。如果等死叉才卖,利润可能已经回吐了不少
  2. 震荡行情里均线会反复金叉死叉,频繁发出假信号。 你来回买卖,手续费都亏出去
  3. 单靠均线不能做决策。 需要结合成交量、趋势强度等其他指标

均线是工具,不是圣杯。它是你工具箱里的第一把扳手,但不是唯一的一把。

课后小练习

  1. 把代码里的 300063 换成 600519(贵州茅台),看看 MA5 和 MA20 的金叉死叉有什么不同
  2. 把 MA20 换成 MA60,看看金叉信号是不是变少了?信号少了是好事还是坏事?
  3. 试试用 ewm(span=12) 画一条 EMA12,对比它和 MA12 谁反应更快

下期预告

第 3 篇我们来讲回测——你已经有了均线信号,但怎么知道这个信号到底能不能赚钱?我们会用代码模拟「如果我真的按金叉买、死叉卖,最终赚了还是亏了」。

这才是量化交易最核心的一步:用数据验证你的想法。

我们下篇见!


觉得有帮助?点个在看 👍

关注「量化从零到实战」系列 · 每篇一个实用技能

这是「量化从零到实战」系列第 2 篇,整个系列持续更新中。有什么问题欢迎留言。