------從零開始學量化------
簡書:量化目錄傳送門
知乎:量化目錄傳送門
0. 前言
為什么去畫k線圖???同花順上不是已經有了嗎???
我的痛點:
場景一:在后期的代碼中,我們會使用svm、神經網絡中需要對數據進行打標簽,主要標記合適的買點和賣點,當你標記好的時候,沒有一個直觀的圖形來觀察標記的結果。
場景二:當你完成了一個量化策略,根據策略預測出的買點和賣點是否完全符合預期,有沒有錯誤,同樣也沒有一個直觀的圖形來觀察。
綜上,所以我選擇自己做一個k線圖,主要用于以上兩個場景。
1. 使用的開源框架
- tushare
- talib
- pyecharts
tushare,前面已經介紹過,是獲取金融數據的框架。
talib,前面也介紹過,用于計算技術指標。
pyecharts,前面并沒有介紹過,該框架用于繪制k線圖。
為什么不用matplotlib或者是seaborn畫k線圖呢?主要是因為seaborn繪制出來的是一個圖片,不能像同花順軟件一樣,對k線進行縮放、移動,不便于進行交互。所以此處使用pyecharts,但目前pyecharts社區還不太活躍,并且靈活性遠不如echarts,后面盡量不再使用pyecharts。
## 安裝pyecharts
pip install pyecharts
2. 代碼效果
image
3. 代碼簡介
- tushare抓取了2015-2018年的貴州茅臺(600519)的日線數據。
- 使用talib計算cci指標(Commodity Channel Index,順勢指標)
- 當cci>=50則選擇買入股票,當cci<50則賣出股票
- 繪制出k線圖和持倉情況
4. 參考代碼
import talib
import tushare
from pyecharts import Line, Kline, Bar, Overlap, Grid
# get 300ETF from tushare
data = tushare.get_k_data('600519', ktype='D', autype='None', start='2015-01-01', end='2018-07-01')
# 計算并畫出cci
cci = talib.CCI(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)
# 簡單的一個擇時策略,當cci>50則持倉,當cci<50則空倉
position = [50 if idx >= 50 else 0 for idx in cci]
# 定義k線圖的提示框的顯示函數
def show_kline_data(params, pos):
param = params[0]
if param.data[4]:
return "date = " + param.name + "<br/>" + "open = " + param.data[1] + "<br/>" + "close = " + param.data[
2] + "<br/>" + "high = " + param.data[3] + "<br/>" + "low = " + param.data[
4] + "<br/> "
else:
return "date = " + param.name + "<br/>" + "cci = " + param.value + "<br/>"
# 繪制cci
cci_line = Line()
cci_line.add("cci", x_axis=data['date'], y_axis=cci, is_datazoom_show=True,
datazoom_xaxis_index=[0, 1],
tooltip_tragger='axis',
is_toolbox_show=True,
yaxis_force_interval=100,
legend_top="70%",
legend_orient='vertical',
legend_pos='right',
yaxis_pos='left',
is_xaxislabel_align=True,
tooltip_formatter=show_kline_data,
)
# 繪制持倉
bar = Bar()
bar.add('持倉', data['date'], position, is_datazoom_show=True)
# 將持倉和cci重疊在一個圖中
cci_overlap = Overlap()
cci_overlap.add(cci_line)
cci_overlap.add(bar)
cci_overlap.render()
# 畫出K線圖
price = [[open, close, lowest, highest] for open, close, lowest, highest in
zip(data['open'], data['close'], data['low'], data['high'])]
kline = Kline("貴州茅臺", title_pos='center')
kline.add('日線', x_axis=data['date'], y_axis=price, is_datazoom_show=True,
is_xaxislabel_align=True,
tooltip_tragger='axis',
yaxis_pos='left',
legend_top="20%",
legend_orient='vertical',
legend_pos='right',
is_toolbox_show=True,
tooltip_formatter=show_kline_data)
# 將cci折線圖和K線圖合并到一張圖表中
grid = Grid()
grid.add(cci_overlap, grid_top="70%")
grid.add(kline, grid_bottom="40%")
grid.render()
如果你對我的文章有興趣,可以關注一下我的簡書和知乎,后期會在簡書和知乎上定期更新,傳送門在下方:
簡書:瀟瀟夜雨歸何處
知乎:瀟瀟夜雨
我相信,有趣的靈魂總會相遇!!!
你的關注,是我前進的動力!!!