------從零開(kāi)始學(xué)量化------
簡(jiǎn)書:量化目錄傳送門
知乎:量化目錄傳送門
0. 前言
為什么去畫k線圖???同花順上不是已經(jīng)有了嗎???
我的痛點(diǎn):
場(chǎng)景一:在后期的代碼中,我們會(huì)使用svm、神經(jīng)網(wǎng)絡(luò)中需要對(duì)數(shù)據(jù)進(jìn)行打標(biāo)簽,主要標(biāo)記合適的買點(diǎn)和賣點(diǎn),當(dāng)你標(biāo)記好的時(shí)候,沒(méi)有一個(gè)直觀的圖形來(lái)觀察標(biāo)記的結(jié)果。
場(chǎng)景二:當(dāng)你完成了一個(gè)量化策略,根據(jù)策略預(yù)測(cè)出的買點(diǎn)和賣點(diǎn)是否完全符合預(yù)期,有沒(méi)有錯(cuò)誤,同樣也沒(méi)有一個(gè)直觀的圖形來(lái)觀察。
綜上,所以我選擇自己做一個(gè)k線圖,主要用于以上兩個(gè)場(chǎng)景。
1. 使用的開(kāi)源框架
- tushare
- talib
- pyecharts
tushare,前面已經(jīng)介紹過(guò),是獲取金融數(shù)據(jù)的框架。
talib,前面也介紹過(guò),用于計(jì)算技術(shù)指標(biāo)。
pyecharts,前面并沒(méi)有介紹過(guò),該框架用于繪制k線圖。
為什么不用matplotlib或者是seaborn畫k線圖呢?主要是因?yàn)閟eaborn繪制出來(lái)的是一個(gè)圖片,不能像同花順軟件一樣,對(duì)k線進(jìn)行縮放、移動(dòng),不便于進(jìn)行交互。所以此處使用pyecharts,但目前pyecharts社區(qū)還不太活躍,并且靈活性遠(yuǎn)不如echarts,后面盡量不再使用pyecharts。
## 安裝pyecharts
pip install pyecharts
2. 代碼效果

3. 代碼簡(jiǎn)介
- tushare抓取了2015-2018年的貴州茅臺(tái)(600519)的日線數(shù)據(jù)。
- 使用talib計(jì)算cci指標(biāo)(Commodity Channel Index,順勢(shì)指標(biāo))
- 當(dāng)cci>=50則選擇買入股票,當(dāng)cci<50則賣出股票
- 繪制出k線圖和持倉(cāng)情況
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')
# 計(jì)算并畫出cci
cci = talib.CCI(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)
# 簡(jiǎn)單的一個(gè)擇時(shí)策略,當(dāng)cci>50則持倉(cāng),當(dāng)cci<50則空倉(cāng)
position = [50 if idx >= 50 else 0 for idx in cci]
# 定義k線圖的提示框的顯示函數(shù)
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,
)
# 繪制持倉(cāng)
bar = Bar()
bar.add('持倉(cāng)', data['date'], position, is_datazoom_show=True)
# 將持倉(cāng)和cci重疊在一個(gè)圖中
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("貴州茅臺(tái)", 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()
如果你對(duì)我的文章有興趣,可以關(guān)注一下我的簡(jiǎn)書和知乎,后期會(huì)在簡(jiǎn)書和知乎上定期更新,傳送門在下方:
簡(jiǎn)書:瀟瀟夜雨歸何處
知乎:瀟瀟夜雨
我相信,有趣的靈魂總會(huì)相遇!??!
你的關(guān)注,是我前進(jìn)的動(dòng)力?。。?/p>