MACD指标解释:baike.baidu.com/item/MACD指标/6271283?fr=aladdin
MACD指标[1]基于快速、慢速两个长度不同的移动均线
(FastMA是短期均线,SlowMA是长期均线),即:
MACD = FastMA - SlowMA
第二条线,称为信号线,为移动MACD的平均值,即:
SignalLine = MovAvg (MACD)
第三条线,称为MACD直方图,为MACD和信号线之间的差异,即:
MACD Histogram = MACD - SignalLine
talib_macd.py
# -*- coding: utf-8 -*-
import os, sys
from datetime import datetime
import tushare as ts
import pylab as pl
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import talib
if len(sys.argv) ==2:
code = sys.argv[1]
else:
print('usage: python talib_macd.py stockcode ')
sys.exit(1)
if len(code) !=6:
print('stock code length: 6')
sys.exit(2)
df = ts.get_k_data(code)
if df.empty ==True:
print(" df is empty ")
sys.exit(2)
df = df[ df['date'] > '2024-01-01']
if len(df) <30:
print(" len(df) <30 ")
sys.exit(2)
# DataFrame 重建索引
df = df.reset_index(drop=True)
df['ma10'] = df['close'].rolling(window=10).mean()
#print(df.head())
dw = pd.DataFrame()
#close = np.array(df['close'])
# 调用talib计算指数移动平均线的值
#df['EMA12'] = talib.EMA(close, timeperiod=6)
#df['EMA26'] = talib.EMA(close, timeperiod=12)
# 调用talib 计算 MACD指标
dw['MACD'],dw['MACDsignal'],dw['MACDhist'] = talib.MACD(df.close, fastperiod=12, slowperiod=26, signalperiod=9)
dw.index = range(len(dw))
print('df.len=',len(df),'dw.len=',len(dw))
df = df.reset_index(drop=True)
# 取后半段
m = len(df) //2
df = df[ df.index > m ]
dw = dw[ dw.index > m ]
print(df.head())
print(dw.head())
df.index = pd.to_datetime(df.date)
dw.index = pd.to_datetime(df.date)
# 设置画布,纵向排列的三个子图
fig, ax = plt.subplots(3, 1)
# 设置标签显示中文
#plt.rcParams['font.sans-serif'] = ['SimHei']
#plt.rcParams['axes.unicode_minus'] = False
# 调整子图的间距,hspace表示高(height)方向的间距
plt.subplots_adjust(hspace=.3)
# 画股票收盘价图
df[['close', 'ma10']].plot(ax=ax[0], grid=True, title=code)
# 应用同步缩放
#ax[1] = plt.subplot(312, sharex=ax[0])
# 画 MACD 曲线图
dw[['MACD','MACDsignal', 'MACDhist']].plot(ax=ax[1], grid=True)
# 应用同步缩放
#ax[2] = plt.subplot(313, sharex=ax[0])
dw['MACDhist'].plot(ax=ax[2], color='gray', kind='bar', grid=True, use_index=False)
# 设置间隔,以便图形横坐标可以正常显示(否则数据多了x轴会重叠)
scale = len(dw['MACDhist'].values)
interval = 10 # scale // 20
#print(scale, interval)
# 设置x轴参数,应用间隔设置
# 时间序列转换,(否则日期默认会显示时分秒数据00:00:00)
# x轴标签旋转便于显示
pl.xticks([i for i in range(1, scale + 1, interval)], [i for i in range(1, scale + 1, interval)],
#[datetime.strftime(i, format='%m-%d') for i in pd.date_range(df.index[0], df.index[-1], freq='B')],
rotation=45)
plt.legend(loc='best', shadow=True)
plt.show()
运行 python talib_macd.py 601318