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()
结果展示: