← 返回目录
q1.5动手⏱ 约 9 分钟

技术指标亲手算:均线与 RSI

亲手算出两大指标,再用统计给「金叉」当庭宣判

🔎 最后验证 2026-07📚 来源:RSI 指标(J. Welles Wilder, 1978, Wilder 平滑法)、本节全部统计数字于 2026-07 对沪深300(2005-04-08 起 5177 个交易日)实测得出🧰 pandas
为什么学这个

上一节结尾我留了个悬念:「5 日线上穿 20 日线就会涨」——这条流传最广的看图口诀,到底灵不灵?

今天我们不吵架,直接开庭:先亲手把均线和 RSI 这两个最著名的指标算出来(不调黑盒,pandas 手写),然后用 21 年、5177 个交易日的数据做全量统计

判决结果我先剧透一个字:。但具体怎么个惨法、以及这个判决说明什么、不能说明什么——这才是这节课真正值钱的部分。

💡 打个比方

技术指标就像体检报告上的各项数值:体温、心率、血压——它们是对身体状态的描述,压缩了信息、方便你快速看懂。

但没有医生会说「心率 90,明天必发烧」。描述现状预测未来,是两件事。指标也一样:它把几十天的价格压缩成一个数,这很有用;但「这个数出现后市场会怎么走」,得交给统计说话,不归指标管。

一、均线:五行代码,手写不求人

接着用体检过的 csi300.csv(2005-04-08 起):

import pandas as pd

df = pd.read_csv("csi300.csv", parse_dates=["date"]).set_index("date").sort_index()
df = df[df.index >= "2005-04-08"]
close = df["close"]

ma5 = close.rolling(5).mean()    # 5日均线:最近5个收盘价的平均
ma20 = close.rolling(20).mean()  # 20日均线
print(pd.DataFrame({"close": close, "ma5": ma5, "ma20": ma20}).tail(3))

就这么朴素——均线 = 滑动窗口求平均。它把毛糙的日间波动抹平,给你一条「趋势轮廓」。q1.4 图上那两条彩线,现在是你自己算的了。

二、RSI:稍微硬核一点,但也就十行

RSI(相对强弱指标,1978 年 Wilder 提出)想回答:「最近 14 天,涨的力量和跌的力量谁大?」取值 0–100,传统说法 70 以上算「超买」、30 以下算「超卖」:

delta = close.diff()
gain = delta.clip(lower=0)              # 上涨日的涨幅,下跌日记0
loss = -delta.clip(upper=0)             # 下跌日的跌幅,上涨日记0
avg_gain = gain.ewm(alpha=1/14, min_periods=14, adjust=False).mean()  # Wilder平滑
avg_loss = loss.ewm(alpha=1/14, min_periods=14, adjust=False).mean()
rsi = 100 - 100 / (1 + avg_gain / avg_loss)
print("最新RSI:", round(rsi.iloc[-1], 1))
print("历史上RSI>70的天数占比:", round((rsi > 70).mean() * 100, 1), "%")
print("历史上RSI<30的天数占比:", round((rsi < 30).mean() * 100, 1), "%")

我 2026-07 实测:最新 RSI 42.2;21 年里 RSI 高于 70 的日子占 10.1%,低于 30 的只占 3.8%——「超卖」比「超买」少见得多,因为指数长期缓慢向上漂移。你看,算一遍,就比背口诀的人多懂一层

三、开庭:「金叉」的统计判决

「金叉」= 5 日线上穿 20 日线,看图派眼里的经典买入信号。检验它只要几行:

cross_up = (ma5 > ma20) & (ma5.shift(1) <= ma20.shift(1))   # 今天金叉
fwd20 = close.shift(-20) / close - 1                        # 之后20个交易日的收益

print("金叉次数:", int(cross_up.sum()))
print("金叉后20日平均收益:", round(fwd20[cross_up].mean() * 100, 2), "%")
print("金叉后20日上涨占比:", round((fwd20[cross_up] > 0).mean() * 100, 1), "%")
print("对照组——任意一天的20日平均收益:", round(fwd20.mean() * 100, 2), "%")
print("对照组——任意一天20日后上涨占比:", round((fwd20 > 0).mean() * 100, 1), "%")

2026-07 实测判决书:

金叉之后随便挑一天
之后 20 日平均收益+0.52%+0.92%
之后 20 日上涨占比49.4%53.4%
样本156 次金叉5177 天

金叉之后的表现,还不如随便挑一天。流传最广的买入信号,在这份 21 年的数据上,连「掷硬币」都没跑赢。这就是 q1.4 说的:眼睛负责好奇,统计负责判决。

四、这个判决能说明什么、不能说明什么

诚实课的规矩,把话说满也说准:

  • 能说明:「金叉后更容易涨」这个最流行的说法,在沪深300 日线上站不住。下次谁拿金叉图跟你吹,你有 5177 天的数据可以请他坐下。
  • 不能说明:所有均线用法在所有市场、所有参数、所有周期上都无效。我们只审了一个最流行的版本——别把一次判决扩大成万能结论,那和迷信金叉是同一种懒。
⚠️ 避坑⚠️ 坑一:指标越堆越多,信息并没有变多

新手容易走进「指标军备竞赛」:MACD、KDJ、BOLL 全挂上,五颜六色像驾驶舱。

但请想一件事:这些指标全都是从同一列收盘价里算出来的——它们是同一份信息的不同压缩方式,不是新信息。五个指标一起「确认」,常常只是同一句话说了五遍。堆指标带来的不是胜率,是过拟合的自由度(q1.9 你会亲眼看到自由度的代价)。

⚠️ 避坑⚠️ 坑二:不同软件的 RSI 数字对不上,不是谁算错了

你算的 RSI 和某些行情软件不一致,别慌:RSI 有 Wilder 平滑(我们用的,原版)和简单平均两种流行算法,数字会有差异;均线也分 SMA/EMA。

教训有二:① 对比指标数值先确认算法口径一致;② 连「同一个指标」都有多个版本——这再次提醒你,指标是人造的压缩工具,不是市场的物理定律。

❓ 测验
有人展示了一张图:「你看这次金叉之后涨了 15%!」。根据本节的全量统计,最专业的回应是?
✏️ 填空
指标是对行情的「描述」,不是对未来的「___」——某个数值出现后市场会怎么走,要交给全量统计说话。

📌 免责:本课为技术科普,文中指标与统计仅用于方法教学,不构成任何投资建议或交易信号;历史统计不代表未来表现;投资有风险,盈亏自负。

✅ 小结

这一节你亲手算出了均线RSI(还知道了算法有流派),更重要的是完成了第一次信号审判:156 次金叉、5177 天对照,判决是「不如随便挑一天」。你现在有了量化最核心的肌肉:任何口诀,先全量统计再说。

技术指标看的是价格自己。但价格背后还站着两样东西:公司赚不赚钱、市场给它的定价贵不贵——这就是基本面

下一节,我们量化地读基本面:亲手拉出沪深300 二十年的市盈率,算出「现在的市场处在历史上贵还是便宜的位置」——答案是一个具体的百分位数字。同样,我也会告诉你这个数字不能拿来干什么。

下一节 → 基本面数据:量化地读估值与财报
🔎 来源与核验· 3 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「沪深300(2005-04-08起5177日):RSI14(Wilder)>70占比10.1%、<30占比3.8%;5/20金叉156次,金叉后20日均值+0.52%/胜率49.4%,无条件对照+0.92%/53.4%」
📚 本节 2026-07 实测(akshare 新浪源数据)✓ 已核验 2026-07
「RSI 由 J. Welles Wilder 于 1978 年提出,存在 Wilder 平滑与简单平均等不同实现,数值有差异」
📚 Wilder《New Concepts in Technical Trading Systems》(1978) + 通用技术分析资料✓ 已核验 2026-07
「各类技术指标均由价格序列衍生,不新增信息;多指标「共振」不等于独立证据」
📚 量化常识(信息同源)✓ 已核验 2026-07
本节统计仅针对所述数据与参数,不外推为任何普适结论;不构成任何交易信号或建议。
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · q1.6
基本面数据:量化地读估值与财报
继续读下一节 →