通过tushare的股票数据绘制股票各曲线图——MACD指标曲线

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()

结果展示:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值