import tushare as ts
import numpy as np
import pandas as pd
import datetime as dt
import matplotlib.pyplot as mp
import matplotlib.dates as md
#引入自己的api,把股票数据引入放到df里面
pro = ts.pro_api('ee5e027680ee512ab9783ae3e78d766ada5b959b441f4b2bba7db241')
df = pro.daily(ts_code='000001.SZ', start_date='20210401', end_date='20210601')
#print(df)
#EMA(12)的数据
EMA12_Data = {
"trade_date":[],
"E12_value":[]
}
#EMA(26)的数据
EMA26_Data = {
"trade_date":[],
"E26_value":[]
}
#DIF的数据
DIF_Data = {
"trade_date":[],
"DIF_value":[]
}
#DEA的数据
DEA_Data = {
"trade_date":[],
"DEA_value":[]
}
MACD_Data = {
"trade_date":[],
"MACD_value":[]
}
#定义计算EMA(12)值的函数
def Compute1(i,data):
if i == data.trade_date.size - 1:
return data.pre_close[i] + (data.close[i] - data.pre_close[i])*2/13 #计算首日的EMA(12)
else:
return 2/13*data.close[i] + 11/13*Compute1(i + 1,data)
#print(Compute1(13,df))
#定义计算EMA(26)值的函数
def Compute2(i,data):
if i == data.trade_date.size - 1:
return data.pre_close[i] + (data.close[i] - data.pre_close[i])*2/27 #计算首日的EMA(26)
else:
return 2/27*data.close[i] + 25/27*Compute2(i + 1,data)
#定义计算DEA值的函数
def Compute3(i,data):
if i == data.trade_date.size - 1:
return data.DIF_value[i] * 2/10
else:
return 2/10*data.DIF_value[i] + 8/10*Compute3(i + 1,data)
#计算EMA(12)的值
for i in (range(0,df.trade_date.size)):
EMA12_Data.setdefault("trade_date",[]).append(df.trade_date[i])
EMA12_Data.setdefault("E12_value",[]).append(Compute1(i,df))
MyEMA12_Data = pd.DataFrame(EMA12_Data)
#print(MyEMA12_Data)
#计算EMA(26)的值
for i in (range(0,df.trade_date.size)):
EMA26_Data.setdefault("trade_date",[]).append(df.trade_date[i])
EMA26_Data.setdefault("E26_value",[]).append(Compute2(i,df))
MyEMA26_Data = pd.DataFrame(EMA26_Data)
#print(MyEMA26_Data)
#计算DIF的值
for i in (range(0,MyEMA12_Data.trade_date.size)):
DIF_Data.setdefault("trade_date",[]).append(MyEMA12_Data.trade_date[i])
DIF_Data.setdefault("DIF_value",[]).append(MyEMA12_Data.E12_value[i] - MyEMA26_Data.E26_value[i])
MyDIF_Data = pd.DataFrame(DIF_Data)
#print(MyDIF_Data)
#计算DEA的值
for i in (range(0,MyDIF_Data.trade_date.size)):
DEA_Data.setdefault("trade_date",[]).append(MyDIF_Data.trade_date[i])
DEA_Data.setdefault("DEA_value",[]).append(Compute3(i,MyDIF_Data))
MyDEA_Data = pd.DataFrame(DEA_Data)
#print(MyDEA_Data)
#计算MACD的值
for i in (range(0,MyDEA_Data.trade_date.size)):
MACD_Data.setdefault("trade_date",[]).append(MyDEA_Data.trade_date[i])
MACD_Data.setdefault("MACD_value",[]).append(2*(MyDIF_Data.DIF_value[i] - MyDEA_Data.DEA_value[i]))
MyMACD_Data = pd.DataFrame(MACD_Data)
#print(MyMACD_Data)
#创建图形实例,设置xy轴
mp.figure("MACD Line", figsize=(15, 5),facecolor="lightgray")
mp.title("MACD Line", fontsize=18)
mp.xlabel("Date", fontsize=15)
mp.ylabel("MACD", fontsize=15)
mp.tick_params(labelsize=5) #设置刻度标签的字体大小
mp.grid(linestyle=":") #显示网格
#绘制DIF线
mp.plot(MyDIF_Data.trade_date,MyDIF_Data.DIF_value, color="blue", linestyle="-",
linewidth=2, label="DIFValue", alpha=0.3)
#绘制DEA线
mp.plot(MyDEA_Data.trade_date,MyDEA_Data.DEA_value, color="purple", linestyle="-",
linewidth=2, label="DEAValue", alpha=0.3)
#确定MACD画图的颜色
colors_bool = MyMACD_Data.MACD_value > 0
colors = np.zeros(colors_bool.size, dtype="U5")
colors[:] = "green"
colors[colors_bool] = "red"
#绘制MACD柱状图
mp.bar(MyMACD_Data.trade_date,MyMACD_Data.MACD_value, 0.3, color=colors,
edgecolor=colors, zorder=3)
ax=mp.gca() #gca:get current axis得到当前轴
#挪动x,y轴的位置,也就是图片下边框和左边框的位置
ax.spines['bottom'].set_position(('data',0)) #data表示通过值来设置x轴的位置,将x轴绑定在y=0的位置
#最终展示
mp.legend() #图例
mp.gcf().autofmt_xdate() #使X轴坐标斜着显示
mp.show()
结果展示: