通过tushare的股票数据绘制股票各曲线图——周K线

#给每天打上标记,标记为第几周
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()

 运行结果展示:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值