0.前言
使用matplotlib.finance.candlestick_ohlc来绘制k线图。参考地址:https://www.jianshu.com/p/0e846ad44b3d。不过,存在k线断开的问题,如下图
根据此教程可以解决此问题。
1.数据类型
本数据是由数据库中db2数据库中获取的,使用db2数据库的参考地址:https://www.jianshu.com/p/eff44fed856c。也可从雅虎新浪等地下载,参考地址:https://www.jianshu.com/p/0e846ad44b3d。
数据格式如下:
日期 开盘价 最高价 最低价 收盘价 交易量
735835.0 92.366 95.605 88.588 91.466 289470686.0
735836.0 93.026 97.224 91.526 95.245 235214588.0
735837.0 96.085 101.663 95.005 101.003 212008806.0
735838.0 101.723 103.042 100.223 102.562 208950955.0
735841.0 102.323 107.001 100.883 106.881 202628515.0
735842.0 105.082 109.16 103.582 109.1 304904688.0
735843.0 106.521 109.34 105.441 106.461 255045273.0
735848.0 105.501 107.181 102.083 104.122 287948628.0
735849.0 104.242 108.08 102.442 107.481 330814193.0
其中,每一个日期的所有数据(上面数据中的一行)为一个元组,所有元组组成一个list。日期为float,使用matplotlib.pylab.date2num(datetime.datetime)可以将datetime.datetime数据化为float型。其余属性均为float型。根据matplotlib.finance.candlestick_ohlc中对k线属性的要求,属性排列顺序不可变。
2.解决k线断裂的问题
从数据格式中可知日期的数据类型为float型,相邻两个日期相差1.0。故而把日期改为连续的float序列即可。例如,第一个日期为0,第二个日期为1,第三个日期为2……若是采取这样的办法,会报错。因此把日期的第一个值改为数据中第一个日期使用matplotlib.pylab.date2num(datetime.datetime)得出其真实值,剩下的日期依据此初始日期递推。代码如下:
def get_detail(stock_id):
stock_days = []
detail_dict = {}
sql1 = "select * from stock.stock_day_market where stock_id='%s' order by stock_day" % stock_id
stmt = ibm_db.exec_immediate(conn, sql1)
row = ibm_db.fetch_assoc(stmt)
__i = 0
flag = 0
while (row):
if flag == 0:
__i = date2num(row.get('STOCK_DAY'))
flag = 1
__stock_day = row.get('STOCK_DAY')
__open = float(row.get('REHAB_PRICE_OPEN'))
__high = float(row.get('REHAB_PRICE_MAX'))
__low = float(row.get('REHAB_PRICE_MIN'))
__close = float(row.get('REHAB_PRICE_CLOSE'))
__volume = float(row.get('REHAB_COUNT_BS'))
stock_days.append(__stock_day)
detail_dict[__stock_day] = (__i, __open, __high, __low, __close, __volume)
print(__stock_day, __open, __high, __low, __close, __volume)
__i += 1
row = ibm_db.fetch_assoc(stmt)
return stock_days, detail_dict
3.解决画图label中文乱码问题
采用临时解决办法:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号