matplotlib 股票走势图 瑞幸咖啡
本文主要用折线图描绘瑞幸咖啡19年上市以来的股价走势,再利用线条颜色、标注、箭头等突出财务造假丑闻对估价的影响。
数据源:雅虎财经信息。如何获取股价信息可以看这里:https://www.cnblogs.com/chenboshi/p/13539918.html
画图思路:
1.选取收盘价和时间这两个字段,x轴为交易日,y轴为收盘价;
下载的数据集日期只有股票交易日,绘制时间轴时,不填充节假日,直接进行按照月份聚合。
2.以4月1日(财务造假丑闻爆出)作为界限,用不同颜色标记。4月1日前用深蓝色画图,因为瑞幸咖啡品牌颜色是深蓝色。4月1日后用红色。
3.添加虚横线,利用刻度对比估价涨跌幅度;
4.添加文本标注和箭头,指出导致股价暴跌的事件和时间点;
5.添加长方形阴影,再加个4月1日前后的对比。完事ヽ( ̄▽ ̄)و
代码地址 →→ github
1 import matplotlib.patches as patches 2 import matplotlib.pyplot as plt 3 import pandas as pd 4 import numpy as np 5 plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 指定默认字体 6 plt.rcParams[\'axes.unicode_minus\'] = False # 解决保存图像是负号\'-\'显示为方块的问题 7 8 #导入数据 9 lk= pd.read_csv("C:\mypython\datasets\stock-LK.csv",encoding=\'utf-8\') 10 11 # 自上市以来 收盘价最低、最高点 12 print(np.min(lk[\'Close\'])) 13 print(np.max(lk[\'Close\'])) 14 # 将时间转换成 yyyy-mm格式 15 lk[\'Ymnth\']=lk[\'Date\'].apply(lambda x : x[:7]) 16 17 # 以2020-04-01为界限区分财务造假新闻爆出前后的股价走势 18 before=lk[lk[\'Date\']<\'2020-04-01\'] 19 after=lk[lk[\'Date\']>=\'2020-04-01\'] 20 21 fig, ax = plt.subplots(1,1,figsize=(16,9), dpi= 300) 22 ax.plot(before[\'Date\'], before[\'Close\'], color=\'#142975\',lw=2) 23 ax.plot(after[\'Date\'], after[\'Close\'], color=\'#B00E11\',lw=2) 24 25 #y轴刻度和标签设置 26 ax.set_ylim(0,55) 27 ax.set_yticklabels(labels=range(0,61,10),fontsize=14,fontweight=\'medium\') 28 for y in range(0,55,10): 29 plt.axhline(y=y,color=\'gray\',linestyle=\'--\',alpha=0.3) 30 31 #日期缺失非工作日和节假日,可以选择填充,或者忽略x轴上每月总天数长度,进行聚合。此处选择后者 32 #首先按照年月分组,选取每月最小值即第一个股票交易日 作为刻度 比如 33 xticks=lk[[\'Date\',\'Ymnth\']].groupby(lk[\'Ymnth\']).agg(\'min\')[\'Date\'].tolist() 34 ax.set_xticks(xticks) 35 #print(xticks) #[\'2019-05-17\', \'2019-06-03\', \'2019-07-01\'...] 36 xtick_color= [ \'#142975\' if x <\'2020-04-01\' else \'#B00E11\' for x in xticks ] 37 38 #然后刻度标签设置为 上述列表中每个刻度的前四位 [\'2014\', \'2015\', \'2016\',... 39 ax.set_xticklabels([x[:7] for x in xticks ], rotation=30,fontsize=14) 40 # 根据时间分割线,设置不同的刻度标签颜色 41 [t.set_color(i) for (i,t) in zip(xtick_color,ax.xaxis.get_ticklabels())] 42 43 # 文本标注 44 box = { 45 \'facecolor\' : \'white\', 46 \'edgecolor\' : \'red\', 47 \'boxstyle\' : \'round\' 48 } 49 ax.text(\'2020-04-15\',25,"爆出财务造假丑闻",bbox=box,color=\'red\',fontsize=20) 50 51 # 箭头指向文本 文本此物为空格. 4月1日估价为26块多 52 plt.annotate(\' \', 53 ha = \'center\', va = \'bottom\', 54 xytext = (\'2020-04-07\', 26), 55 xy = (\'2020-04-01\', 26), 56 arrowprops = {\'color\':\'red\'}) 57 58 #给红色部分加上灰色阴影 59 start=before.shape[0] 60 offset=after.shape[0]+50 61 shape = patches.Rectangle((start,-5),offset,60,color = \'#E9ECEF\') 62 plt.gca().add_patch(shape) 63 64 plt.title("瑞幸咖啡历史收盘价",fontsize=26) 65 66 fig.tight_layout() 67 plt.savefig("C:\mypython\plots\stock_lk4.png") 68 69 plt.show() 70 plt.close()