本文主要用折線圖描繪瑞幸咖啡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()