畫k線需要的包和環境:
python36
import tushare as ts
import re
import matplotlib.pyplot as plt
import mpl_finance as mpf
import numpy as np
import talib as tl
tushare是python的一個第三方庫,通過它可以獲取股票的當日數據和歷史數據,可以通過這里進行詳細了解;matplotlib用於數據的可視化;mpl_finance是python中可以用來畫出蠟燭圖、線圖的分析工具,目前已經從matplotlib中獨立出來;talib是一個Python 金融指數處理庫.
股票數據准備:
獲取股票歷史數據可通過tushare庫調用get_hist_data或者pro_bar來完成,這里我們通過第二種方法進行采集:
api = ts.pro_api()
首先要實例化api,需要在tushare平台注冊賬號,並獲取token(免費);
df = ts.pro_bar('600073.SH', start_date='2019-12-30 00:00:00', end_date='2019-12-30 15:00:00', freq='1min')[::-1]
該方法會以dataframe的格式返回數據,其參數分別表示股票代碼,起始時間,終止時間,要查詢的頻率,具體可參考下邊參數,由於返回的數據時間上是從后往前的,所以我們通過[::-1]進行調換.
ts_code |
證券代碼,支持股票,ETF/LOF,期貨/期權,港股,數字貨幣 |
start_date |
開始日期 YYYYMMDD |
end_date |
結束日期 YYYYMMDD |
freq |
支持1/5/15/30/60分鍾,周/月/季/年 |
asset |
證券類型 E:股票和交易所基金,I:滬深指數,C:數字貨幣,FT:期貨 FD:基金/O期權/H港股/CB可轉債 |
exchange |
市場代碼,用戶數字貨幣行情 |
adj |
復權類型,None不復權,qfq:前復權,hfq:后復權 |
ma |
均線,支持自定義均線頻度,如:ma5/ma10/ma20/ma60/maN |
offset |
開始行數(分頁功能,從第幾行開始取數據) |
limit |
本次提取數據行數 |
factors |
因子數據,目前支持以下兩種:vr:量比,默認不返回,返回需指定:factor=['vr'],tor:換手率,默認不返回,返回需指定:factor=['tor'], |
retry_count |
網絡重試次數 |
index = list(map(lambda i: re.findall(r'\d{2}:\d{2}', i)[0], df.trade_time))
我們以時間為x軸,所以要提取df中的trade_time數據,因為我們的時間比較長,如果都顯示看起來比較冗余,所以我們通過正則提取其中的時分秒即可.
下邊我們就開始畫k線圖:
sma_10 = tl.SMA(np.array(df['close']), 10)
sma_30 = tl.SMA(np.array(df['close']), 30)
畫均線,上邊分別是10天內的和30天內的均值計算
fig = plt.figure(figsize=(38, 18), dpi=100)
ax = fig.add_subplot(1, 1, 1)
常見一個畫布,設置其長寬,可通過dpi來設置生成圖片的像素;在畫布中生成一張子圖.
ax.set_title(f'2019-12-27 {600073}', fontsize=30, color='red')
ax.set_xticks(range(0, len(df.index)))ax.set_xticklabels(index, rotation=-80)
給子圖添加標題,可設置字體大小和顏色,這里為了醒目我們設置成紅色;設置x軸,按照df的長度來設定,然后把上邊通過正則獲取的時間添加在x軸上,為了避免顯示重疊,可通過rotation參數設置旋轉,如圖:
mpf.candlestick2_ochl(ax, df['open'], df['close'], df['high'],df['low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
candlestick2_ochl方法用來生成k線,非常的方便,只需把開盤,收盤,最高,最低參數傳入即可.
最后設置圖例:
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] # 設置字體ax.plot(sma_10, label='10日均線')
ax.plot(sma_30, label='30日均線')
ax.legend()
這樣指定股票的日k線就完成了,完整代碼點擊,參考圖: