1.4 量化技術(shù)篇—完成一個(gè)簡(jiǎn)單k線圖和擇時(shí)策略

------從零開(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. 代碼效果

image

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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容