首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 Python 计算常见技术指标(MA、MACD、RSI)

用 Python 计算常见技术指标(MA、MACD、RSI)

原创
作者头像
克劳德2048
发布2026-09-20 15:54:19
发布2026-09-20 15:54:19
210
举报

用 Python 计算常见技术指标其实并不难,三个最常用的指标——MA(移动平均线)、MACD(指数平滑异同移动平均线)、RSI(相对强弱指标)——都可以用 pandas 几行代码手动实现。MA 反映一段时间的平均价格趋势;MACD 通过两条 EMA 的差值捕捉趋势的变化和动能;RSI 衡量价格涨跌的相对强弱,常用于判断超买超卖。本文带你用 pandas 从零手写这三个指标,理解它们的计算原理,而不是把指标库当黑盒调用。

一、为什么建议自己手写一遍

现在有很多现成的技术指标库,一行代码就能算出 MACD、RSI。那我为什么还建议你手写一遍?

因为理解原理和会用工具是两回事。如果你只会调库,那么当指标结果异常、或者你想改造指标时,你会完全懵掉。而自己用 pandas 手写一遍,你就真正理解了这些指标"是怎么算出来的、代表什么含义"。这种理解,是写出好策略的基础。

放心,这三个指标的计算都不复杂,用 pandas 几行就能搞定。理解了之后,你以后再用指标库,也是"知其所以然"地用。下面我们一个个来。

二、准备工作:读入数据

先把行情数据读进来,我们后面所有指标都基于收盘价 close 计算。

代码语言:python
复制
import pandas as pd
import numpy as np

df = pd.read_csv("stock_data.csv", parse_dates=["date"])
df = df.sort_values("date").reset_index(drop=True)

准备好这份数据,接下来就可以开始算指标了。

三、MA:移动平均线

MA(Moving Average,移动平均线)是最基础的指标,就是收盘价在过去 N 天的平均值。 它把短期的价格波动"抹平",让你更清楚地看到趋势方向。

用 pandas 的 rolling 方法,一行就能算:

代码语言:python
复制
# 5 日、20 日移动平均线
df["MA5"] = df["close"].rolling(window=5).mean()
df["MA20"] = df["close"].rolling(window=20).mean()

print(df[["date", "close", "MA5", "MA20"]].tail())

MA 的意义很直观:MA5 代表近期短期趋势,MA20 代表中期趋势。 当短期均线上穿长期均线(金叉),常被视为走强信号;下穿(死叉)则视为走弱。前面讲的双均线策略,用的就是它。

四、MACD:捕捉趋势与动能

MACD 是在均线基础上发展出来的指标,它通过两条 EMA(指数移动平均)的差值,来捕捉趋势的变化和动能强弱。 相比简单均线,EMA 对近期价格更敏感。

MACD 的计算分几步:先算快慢两条 EMA,相减得到 DIF(差离值),再对 DIF 做平滑得到 DEA(信号线),最后 DIF 与 DEA 的差乘以 2 得到 MACD 柱。用 pandas 实现:

代码语言:python
复制
# 计算 12 日和 26 日 EMA
ema_fast = df["close"].ewm(span=12, adjust=False).mean()
ema_slow = df["close"].ewm(span=26, adjust=False).mean()

# DIF:快慢 EMA 之差
df["DIF"] = ema_fast - ema_slow

# DEA:DIF 的 9 日 EMA(信号线)
df["DEA"] = df["DIF"].ewm(span=9, adjust=False).mean()

# MACD 柱
df["MACD"] = (df["DIF"] - df["DEA"]) * 2

print(df[["date", "DIF", "DEA", "MACD"]].tail())

这里的关键是 ewm 方法,它计算的是指数加权移动平均。12、26、9 是 MACD 的经典参数。MACD 常用来判断趋势的转折和强弱——DIF 上穿 DEA 常被看作走强信号。

五、RSI:判断超买超卖

RSI(Relative Strength Index,相对强弱指标)衡量一段时间内价格上涨和下跌的相对力量,取值在 0~100 之间。 它常用来判断市场是不是"涨过头"(超买)或"跌过头"(超卖)。

RSI 的计算逻辑是:先算每日涨跌,分别求出平均涨幅和平均跌幅,用它们的比值算出 RSI。用 pandas 实现:

代码语言:python
复制
# 计算每日价格变化
delta = df["close"].diff()

# 分离上涨和下跌
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)

# 计算 14 日平均涨幅和平均跌幅
window = 14
avg_gain = gain.rolling(window).mean()
avg_loss = loss.rolling(window).mean()

# 计算 RSI
rs = avg_gain / avg_loss
df["RSI"] = 100 - (100 / (1 + rs))

print(df[["date", "close", "RSI"]].tail())

RSI 的常见解读是:通常认为 RSI 高于 70 属于超买区、低于 30 属于超卖区。但要注意,这只是经验参考,不是绝对规律,超买之后还能更买、超卖之后还能更卖,切忌机械套用。

六、三个指标对比

我把这三个指标整理成一张表,帮你快速理解它们的定位:

指标

全称

主要作用

核心参数

MA

移动平均线

反映趋势方向

5、20 日等

MACD

平滑异同移动平均

捕捉趋势变化与动能

12、26、9

RSI

相对强弱指标

判断超买超卖

14 日

七、用指标时的几个提醒

会算指标了,但用的时候有几点务必注意:

一是指标是滞后的。 MA、MACD 都基于历史价格计算,本质上是"事后"的,它们反映过去,不能预测未来。别把指标当水晶球。

二是单一指标不靠谱。 任何一个指标都有失灵的时候。实战中通常会组合多个指标、结合其他条件,而不是只看一个。

三是参数不是金科玉律。 5、20、12、26、70、30 这些都是经验值,不同市场、不同品种可能需要调整,但也别陷入反复调参的过拟合陷阱。

四是理解比套用重要。 知道指标怎么算、代表什么,比死记"金叉买死叉卖"重要得多。

当你把这些指标用到策略里、需要对大量数据做计算或让策略长期运行时,可以把 Python 程序部署到腾讯云云服务器 CVM 上,利用云端稳定的环境持续运转,尤其适合需要不间断计算指标、生成信号的实盘场景。

结尾

用 Python 计算 MA、MACD、RSI 这些常见技术指标,靠 pandas 几行代码就能实现。自己动手写一遍,你就理解了它们的计算原理和真实含义,而不是把指标库当黑盒。记住,指标是辅助判断的工具,它们滞后、会失灵、需要组合使用——理解透了,才能用得好。

当你把指标用到策略中、需要长期稳定运行时,可以了解合适的部署方案。腾讯云近期上线了量化交易专题活动,可以看看云服务器如何承载 Python 量化程序的指标计算、回测与自动化交易。

风险提示:本文仅为量化交易科普与技术分享,不构成任何投资建议。文中代码仅为教学示例。金融市场存在风险,任何交易策略都可能产生亏损,请结合自身情况谨慎决策。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、为什么建议自己手写一遍
  • 二、准备工作:读入数据
  • 三、MA:移动平均线
  • 四、MACD:捕捉趋势与动能
  • 五、RSI:判断超买超卖
  • 六、三个指标对比
  • 七、用指标时的几个提醒
  • 结尾
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档