#给每天打上标记,标记为第几周
Mark_Data = {
"date":[],
"value":[]
}
#中间数据
Temp_Data = {
"trade_date":[],
"high":[],
"low":[],
"open":[],
"close":[],
"mark":[]
}
#最终需要的数据 一周内的开盘收盘价 一周内的high和low
Week_Data = {
"week":[],
"trade_date":[],
"high":[],
"low":[],
"open":[],
"close":[]
}
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
from dateutil import rrule
#引入自己的api,把股票数据引入放到df里面
pro = ts.pro_api('ee5e027680ee512ab9783ae3e78d766ada5b959b441f4b2bba7db241')
df = pro.daily(ts_code='000001.SZ', start_date='20210401', end_date='20210601')
#print(df)
start_date = dt.datetime.strptime(df.trade_date[df.trade_date.size - 1], '%Y%m%d').date()
end_date = dt.datetime.strptime(df.trade_date[0], '%Y%m%d').date()
#print(start_date,end_date)
Days = (end_date - start_date).days
#print(Days)
#给全年每个日期都打上标识,判断日期为第几周
mark = 1 #标记第几周的标识
for i in range(Days+1):
day = start_date + dt.timedelta(days=i)
#print(day.weekday())
Mark_Data.setdefault("date",[]).append(day)
Mark_Data.setdefault("value",[]).append(mark)
if day.weekday() == 6:
mark += 1
MyMark_Data = pd.DataFrame(Mark_Data)
#print(MyMark_Data)
#获取需要的数据的中间值
for i in range(df.trade_date.size - 1,-1,-1):
Temp_Data.setdefault("trade_date",[]).append(df.trade_date[i])
Temp_Data.setdefault("high",[]).append(df.high[i])
Temp_Data.setdefault("low",[]).append(df.low[i])
Temp_Data.setdefault("open",[]).append(df.open[i])
Temp_Data.setdefault("close",[]).append(df.close[i])
Temp_Data.setdefault("mark",[]).append(0)
#print(pd.DataFrame(Temp_Data))
#这里是给需要的数据打上mark的标识用来判断是否为一周
j = 0 #设置j的目的是快速遍历
for i in range(0,MyMark_Data.date.size):
if j < df.trade_date.size: #因为df.trade_date.size的长度等于Temp_Data 的长度 这里想要的是Temp_Data的长度
temp_date = dt.datetime.strptime(Temp_Data["trade_date"][j], '%Y%m%d').date()
if temp_date == MyMark_Data.date[i]:
Temp_Data["mark"][j] = MyMark_Data.value[i]
j += 1
MyTemp_Data = pd.DataFrame(Temp_Data)
#print(MyTemp_Data)
#这里是获取最后的一周内数据
weeks = 1
#初始化Week_Data
Week_Data.setdefault("week",[]).append(weeks)
Week_Data.setdefault("trade_date",[]).append(MyTemp_Data.trade_date[0])
Week_Data.setdefault("high",[]).append(MyTemp_Data.high[0])
Week_Data.setdefault("low",[]).append(MyTemp_Data.low[0])
Week_Data.setdefault("open",[]).append(MyTemp_Data.open[0])
Week_Data.setdefault("close",[]).append(0)
for i in range(0,MyTemp_Data.trade_date.size):
if MyTemp_Data.mark[i] == weeks:
if MyTemp_Data.high[i] > Week_Data["high"][weeks - 1]:
Week_Data["high"][weeks - 1] = MyTemp_Data.high[i]
if MyTemp_Data.low[i] < Week_Data["low"][weeks - 1]:
Week_Data["low"][weeks - 1] = MyTemp_Data.low[i]
else:
Week_Data["close"][weeks - 1] = MyTemp_Data.close[i-1] #这个时候i已经走到了下一周 因此i - 1记录前一天的close值
weeks += 1 #把weeks往后调一周
Week_Data.setdefault("week",[]).append(weeks) #设置新的week
Week_Data.setdefault("trade_date",[]).append(MyTemp_Data.trade_date[i])
Week_Data.setdefault("open",[]).append(MyTemp_Data.open[i]) #记录新一周的open
Week_Data.setdefault("high",[]).append(MyTemp_Data.high[i]) #设置新一周的high和low的初始值为
Week_Data.setdefault("low",[]).append(MyTemp_Data.low[i])
Week_Data.setdefault("close",[]).append(0)
Week_Data["close"][weeks - 1] = MyTemp_Data.close[MyTemp_Data.trade_date.size - 1]
MyWeek_Data = pd.DataFrame(Week_Data)
#print(MyWeek_Data)
#下面开始画图
#创建图形实例,设置xy轴
mp.figure("Week K Line", figsize=(15, 5),facecolor="lightgray")
mp.title("Week K Line", fontsize=18)
mp.xlabel("Date", fontsize=15)
mp.ylabel("Price", fontsize=15)
mp.tick_params(labelsize=8) #设置刻度标签的字体大小
mp.grid(linestyle=":") #显示网格
# 判断收盘价与开盘价 确定蜡烛颜色
colors_bool = MyWeek_Data.close >= MyWeek_Data.open
colors = np.zeros(colors_bool.size, dtype="U5")
colors[:] = "blue"
colors[colors_bool] = "white"
# 确定实体边框颜色
edge_colors = np.zeros(colors_bool.size, dtype="U5")
edge_colors[:] = "blue"
edge_colors[colors_bool] = "red"
# 绘制开盘价折线图片
mp.plot(MyWeek_Data.trade_date, MyWeek_Data.open, color="b", linestyle="--",
linewidth=2, label="open", alpha=0.3)
# 绘制影线(最高价与最低价)
mp.vlines(MyWeek_Data.trade_date, MyWeek_Data.low, MyWeek_Data.high, color=edge_colors)
#绘制实体
mp.bar(MyWeek_Data.trade_date, (MyWeek_Data.close - MyWeek_Data.open), 0.3, bottom=MyWeek_Data.open, color=colors,
edgecolor=edge_colors, zorder=3)
#最终展示
mp.legend() #图例
mp.gcf().autofmt_xdate() #使X轴坐标斜着显示
mp.show()
运行结果展示: