技术指标亲手算:均线与 RSI
亲手算出两大指标,再用统计给「金叉」当庭宣判
上一节结尾我留了个悬念:「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 有 Wilder 平滑(我们用的,原版)和简单平均两种流行算法,数字会有差异;均线也分 SMA/EMA。
教训有二:① 对比指标数值先确认算法口径一致;② 连「同一个指标」都有多个版本——这再次提醒你,指标是人造的压缩工具,不是市场的物理定律。
📌 免责:本课为技术科普,文中指标与统计仅用于方法教学,不构成任何投资建议或交易信号;历史统计不代表未来表现;投资有风险,盈亏自负。
这一节你亲手算出了均线和 RSI(还知道了算法有流派),更重要的是完成了第一次信号审判:156 次金叉、5177 天对照,判决是「不如随便挑一天」。你现在有了量化最核心的肌肉:任何口诀,先全量统计再说。
技术指标看的是价格自己。但价格背后还站着两样东西:公司赚不赚钱、市场给它的定价贵不贵——这就是基本面。
下一节,我们量化地读基本面:亲手拉出沪深300 二十年的市盈率,算出「现在的市场处在历史上贵还是便宜的位置」——答案是一个具体的百分位数字。同样,我也会告诉你这个数字不能拿来干什么。
🔎 来源与核验· 3 条,点开核对
