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

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)


#记录第一步预处理的数据,计算9日内的最大最小值
KdjData = {
        "trade_date":[],
        "max_value":[],
        "min_value":[],
        "close":[]
        }
#Rsv数据
RsvData = {
        "trade_date":[],
        "Rsv_value":[]
        }
#K值数据
KData = {
        "trade_date":[],
        "K_value":[]
        }
#D值数据
DData = {
        "trade_date":[],
        "D_value":[]
        }
#J值数据
JData = {
        "trade_date":[],
        "J_value":[]
        }

#初步整理数据  其中 N=9 不包含当日    即包含当日的话有10天
for i in (range(0,df.trade_date.size - 9)):
    KdjData.setdefault("max_value",[]).append(df.pre_close[i]) #设置初始值为前一天的close值
    KdjData.setdefault("min_value",[]).append(df.pre_close[i])
    KdjData.setdefault("close",[]).append(df.close[i])
    KdjData.setdefault("trade_date",[]).append(df.trade_date[i])
    for j in (range(i + 1,i + 10)):
        if df.close[j] > KdjData["max_value"][i]:   #找出前九天内的最大最小值
            KdjData["max_value"][i] = df.close[j]
        if df.close[j] < KdjData["min_value"][i]:
            KdjData["min_value"][i] = df.close[j]
myKdjData = pd.DataFrame(KdjData)
#print(myKdjData)


#计算RSV值
for i in (range(0,myKdjData.trade_date.size)):
    RsvData.setdefault("trade_date",[]).append(myKdjData.trade_date[i])
    rsv = (myKdjData.close[i] - myKdjData.min_value[i])/(myKdjData.max_value[i] - myKdjData.min_value[i])*100
    RsvData.setdefault("Rsv_value",[]).append(rsv)
MyRsvData = pd.DataFrame(RsvData)
#print(MyRsvData)
    

#定义计算K值的函数
def Compute1(i,data):
    if i == data.trade_date.size - 1:
        return 50
    else:
        return 2/3*Compute1(i + 1,data) + 1/3*data.Rsv_value[i]
#print(Compute1(2,MyRsvData))

#定义计算D值的函数
def Compute2(i,data):
    if i == data.trade_date.size - 1:
        return 50
    else:
        return 2/3*Compute2(i + 1,data) + 1/3*data.K_value[i]

#计算K值
for i in (range(0,MyRsvData.trade_date.size)):
    KData.setdefault("trade_date",[]).append(MyRsvData.trade_date[i])
    KData.setdefault("K_value",[]).append(Compute1(i,MyRsvData))
MyKData = pd.DataFrame(KData)    
#print(MyKData)
 

#计算D值
for i in (range(0,MyKData.trade_date.size)):
    DData.setdefault("trade_date",[]).append(MyKData.trade_date[i])
    DData.setdefault("D_value",[]).append(Compute2(i,MyKData))
MyDData = pd.DataFrame(DData)
#print(MyDData)

#计算J值
for i in(range(0,MyKData.trade_date.size)):
    JData.setdefault("trade_date",[]).append(MyKData.trade_date[i])
    JData.setdefault("J_value",[]).append(3*MyKData.K_value[i] - 2*MyDData.D_value[i])
MyJData = pd.DataFrame(JData)

#创建图形实例,设置xy轴
mp.figure("KDJ Line", figsize=(15, 5),facecolor="lightgray")
mp.title("KDJ Line", fontsize=18)
mp.xlabel("Date", fontsize=15)
mp.ylabel("KDJ", fontsize=15)

mp.tick_params(labelsize=5) #设置刻度标签的字体大小
mp.grid(linestyle=":")   #显示网格

#绘制K线
mp.plot(MyKData.trade_date,MyKData.K_value, color="blue", linestyle="-",
        linewidth=2, label="KValue", alpha=0.3)

#绘制D线
mp.plot(MyDData.trade_date,MyDData.D_value,color="green",linestyle= "-",
        linewidth=2, label="DValue", alpha=0.3)

#绘制J线
mp.plot(MyJData.trade_date,MyJData.J_value,color="purple",linestyle= "-",
        linewidth=2, label="JValue", alpha=0.3)

#最终展示
mp.legend() #图例
mp.gcf().autofmt_xdate() #使X轴坐标斜着显示
mp.show()

 结果展示:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值