matplotilb实现对MACD的实战
1. 代码结构
python
复制
下载
import pandas as pd # 数据处理 import matplotlib.pyplot as plt # 数据可视化 from unittest import TestCase # 单元测试框架
-
pandas
:用于读取CSV数据并计算指数移动平均(EMA)。 -
matplotlib
:用于绘制MACD线(DIF、DEA)和柱状图(BAR)。 -
unittest
:用于组织测试用例(这里仅作代码结构管理,实际可直接运行
2. 方法解析
(1) cal_macd()
:计算MACD指标
python
复制
下载
def cal_macd(self, df, fastperiod=12, slowperiod=26, signalperiod=9):ewma12 = df['close'].ewm(span=fastperiod, adjust=False).mean() # 12日EMAewma26 = df['close'].ewm(span=slowperiod, adjust=False).mean() # 26日EMAdf['dif'] = ewma12 - ewma26 # DIF = EMA12 - EMA26df['dea'] = df['dif'].ewm(span=signalperiod, adjust=False).mean() # DEA = DIF的9日EMAdf['bar'] = (df['dif'] - df['dea']) * 2 # BAR = (DIF - DEA) * 2(柱状图高度)return df
参数说明:
-
fastperiod=12
:快速EMA周期(默认12日)。 -
slowperiod=26
:慢速EMA周期(默认26日)。 -
signalperiod=9
:信号线(DEA)周期(默认9日)。
计算逻辑:
-
DIF(差离值) = 12日EMA - 26日EMA
(反映短期与长期均线的差异) -
DEA(信号线) = DIF的9日EMA
(DIF的平滑曲线,用于生成交易信号) -
BAR(柱状图) = (DIF - DEA) × 2
(红绿柱状图,直观显示多空能量)
ema是什么
EMA(Exponential Moving Average) 是指指数移动平均线,是一种常见的技术分析工具,主要用于平滑价格数据并识别市场趋势。与简单移动平均线(SMA)不同,EMA更注重近期价格,因此对市场变化反应更灵敏。
EMA 的核心特点
-
加权计算:
-
EMA 给予近期价格更高的权重,而较早的价格权重逐渐衰减。
-
计算公式:
EMAtoday=(Pricetoday×α)+(EMAyesterday×(1−α))EMAtoday=(Pricetoday×α)+(EMAyesterday×(1−α))其中,α=2N+1α=N+12(NN 是周期,如 12 日、26 日等)。
-
-
反应迅速:
-
相比 SMA(简单移动平均),EMA 能更快反映价格变化,适合短线交易。
-
-
常见应用:
-
趋势判断:EMA 上升代表上涨趋势,下降代表下跌趋势。
-
交叉策略:如 12 日 EMA 上穿 26 日 EMA(“金叉”)视为买入信号,反之(“死叉”)为卖出信号。
-
支撑/阻力:价格回调至 EMA 均线可能获得支撑或遇到阻力。
-
EMA vs. SMA(简单移动平均)
特性 | EMA | SMA |
---|---|---|
权重 | 近期价格权重更高 | 所有价格权重相同 |
灵敏度 | 高,适合短线 | 低,适合中长线 |
滞后性 | 较小 | 较大 |
常见 EMA 周期
-
短期:5 日、10 日(适合短线交易)
-
中期:20 日、50 日(判断趋势)
-
长期:100 日、200 日(牛熊分界线)
EMA 的局限性
-
在震荡市中可能产生虚假信号(频繁交叉)。
-
仍需结合其他指标(如 MACD、RSI)综合判断。
如果你有具体的交易场景或参数问题,可以进一步探讨
MA(Exponential Moving Average,指数移动平均)是一种常用的技术分析指标,与简单移动平均(SMA)不同,EMA 对近期价格赋予更高的权重,因此能更快反映价格变化趋势。
1. EMA 计算公式
EMA 的计算分为两步:
-
初始 EMA(首日):
EMA1=Close1EMA1=Close1 -
后续 EMA(第 tt 日):
EMAt=α×Closet+(1−α)×EMAt−1EMAt=α×Closet+(1−α)×EMAt−1-
αα 是平滑系数(权重),计算公式:
α=2N+1α=N+12 -
NN 是 EMA 的周期(如 12、26)。
-
(2) test_MACD()
:绘制MACD图表
python
复制
下载
def test_MACD(self):# 1. 读取数据并预处理file_name = "./demo.csv"df = pd.read_csv(file_name)df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"]df = df[["date", "close", "open", "high", "low", "volume"]] # 选择需要的列df["date"] = pd.to_datetime(df["date"]) # 转为日期格式# 2. 计算MACD指标df_macd = self.cal_macd(df)print(df_macd) # 打印数据(可选)# 3. 绘制DIF和DEA线plt.figure()df_macd['dea'].plot(color="red", label='dea') # DEA线(红色)df_macd['dif'].plot(color="blue", label='dif') # DIF线(蓝色)plt.legend(loc='best') # 显示图例# 4. 分离正负BAR(用于红绿柱状图)pos_bar = [] # 正值BAR(红色)pos_index = [] # 对应索引neg_bar = [] # 负值BAR(绿色)neg_index = [] # 对应索引for index, row in df_macd.iterrows():if row['bar'] > 0:pos_bar.append(row['bar'])pos_index.append(index)else:neg_bar.append(row['bar'])neg_index.append(index)# 5. 绘制柱状图plt.bar(pos_index, pos_bar, width=0.5, color='red') # 正BAR(红色)plt.bar(neg_index, neg_bar, width=0.5, color='green') # 负BAR(绿色)# 6. 设置X轴标签(日期)major_index = df_macd.index[df_macd.index]major_xtics = df_macd['date'][df_macd.index]plt.xticks(major_index, major_xtics) # 设置刻度plt.setp(plt.gca().get_xticklabels(), rotation=30) # 旋转30度# 7. 添加网格和标题plt.grid(linestyle='-.') # 虚线网格plt.title('000001平安银行MACD图') # 标题plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体(黑体)plt.show()
3. 关键步骤说明
(1) 数据预处理
-
读取
demo.csv
,提取date
(日期)、close
(收盘价)等列。 -
将
date
列转为datetime
格式,便于后续绘图。
MACD对股价进行一个买入卖出的
2) MACD计算
-
调用
cal_macd()
计算DIF
、DEA
、BAR
。 -
示例输出:
text
复制
下载
date close dif dea bar 0 2023-01-01 50.00 0.000000 0.000000 0.000000 1 2023-01-02 51.00 0.123456 0.012345 0.222222 ...(略)
(3) 图表绘制
-
DIF(蓝色)和 DEA(红色)线:
-
反映短期和长期趋势的差异与平滑。
-
-
BAR柱状图:
-
红色:DIF > DEA(多头信号)。
-
绿色:DIF < DEA(空头信号)。
-
-
X轴日期标签:
-
旋转30度避免重叠。
-