
用 Python 计算常见技术指标其实并不难,三个最常用的指标——MA(移动平均线)、MACD(指数平滑异同移动平均线)、RSI(相对强弱指标)——都可以用 pandas 几行代码手动实现。MA 反映一段时间的平均价格趋势;MACD 通过两条 EMA 的差值捕捉趋势的变化和动能;RSI 衡量价格涨跌的相对强弱,常用于判断超买超卖。本文带你用 pandas 从零手写这三个指标,理解它们的计算原理,而不是把指标库当黑盒调用。
现在有很多现成的技术指标库,一行代码就能算出 MACD、RSI。那我为什么还建议你手写一遍?
因为理解原理和会用工具是两回事。如果你只会调库,那么当指标结果异常、或者你想改造指标时,你会完全懵掉。而自己用 pandas 手写一遍,你就真正理解了这些指标"是怎么算出来的、代表什么含义"。这种理解,是写出好策略的基础。
放心,这三个指标的计算都不复杂,用 pandas 几行就能搞定。理解了之后,你以后再用指标库,也是"知其所以然"地用。下面我们一个个来。
先把行情数据读进来,我们后面所有指标都基于收盘价 close 计算。
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(Moving Average,移动平均线)是最基础的指标,就是收盘价在过去 N 天的平均值。 它把短期的价格波动"抹平",让你更清楚地看到趋势方向。
用 pandas 的 rolling 方法,一行就能算:
# 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 是在均线基础上发展出来的指标,它通过两条 EMA(指数移动平均)的差值,来捕捉趋势的变化和动能强弱。 相比简单均线,EMA 对近期价格更敏感。
MACD 的计算分几步:先算快慢两条 EMA,相减得到 DIF(差离值),再对 DIF 做平滑得到 DEA(信号线),最后 DIF 与 DEA 的差乘以 2 得到 MACD 柱。用 pandas 实现:
# 计算 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(Relative Strength Index,相对强弱指标)衡量一段时间内价格上涨和下跌的相对力量,取值在 0~100 之间。 它常用来判断市场是不是"涨过头"(超买)或"跌过头"(超卖)。
RSI 的计算逻辑是:先算每日涨跌,分别求出平均涨幅和平均跌幅,用它们的比值算出 RSI。用 pandas 实现:
# 计算每日价格变化
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 删除。