溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

用Python可視化股票指標(biāo)

發(fā)布時(shí)間:2020-08-03 12:35:14 來(lái)源:網(wǎng)絡(luò) 閱讀:5835 作者:youerning 欄目:編程語(yǔ)言

用Python可視化股票指標(biāo)

一個(gè)完整的量化交易策略指考慮到交易的方方面面,但是能不能賺錢(qián),誰(shuí)知道呢 :)

但是一個(gè)量化交易可以通過(guò)回測(cè)系統(tǒng)建立信心然后讓其一如既往的運(yùn)行,以達(dá)到讓錢(qián)生錢(qián)的目的,并且是自動(dòng)的。

筆者主要談純技術(shù)面的量化交易,基本面的一些情況并不好處理及量化,我也暫時(shí)沒(méi)有涉及。

量化交易

一個(gè)完整的量化交易策略,個(gè)人覺(jué)得應(yīng)該包含以下兩個(gè)部分:

  • 交易策略
  • 資金管理

交易策略

一個(gè)完整的交易策略應(yīng)該包含何時(shí)買(mǎi),何時(shí)賣(mài)。

到底應(yīng)該如何買(mǎi)賣(mài),市場(chǎng)上大致分為兩個(gè)技術(shù)流派。

  • 趨勢(shì)跟隨
  • 價(jià)值回歸

趨勢(shì)跟隨

這個(gè)流派認(rèn)為,股票的走勢(shì)是有延續(xù)性的,所以買(mǎi)賣(mài)點(diǎn)的機(jī)會(huì)在于抓住走勢(shì)。

代表指標(biāo): MACD, 移動(dòng)平均線。

評(píng)語(yǔ): 半年不開(kāi)張,開(kāi)張吃半年。

價(jià)值回歸

這個(gè)流派認(rèn)為,股票是有內(nèi)在價(jià)值的,雖然無(wú)序的來(lái)回跳動(dòng),但是自始至終圍繞著自己的內(nèi)在價(jià)值來(lái)回波動(dòng),所以買(mǎi)賣(mài)的機(jī)會(huì)抓住股票的超買(mǎi),超賣(mài)點(diǎn)來(lái)進(jìn)行買(mǎi)賣(mài)。

代表指標(biāo): RSI。

評(píng)語(yǔ): 積少成多。

無(wú)論是趨勢(shì)跟隨還是價(jià)值回歸,其實(shí)還是沒(méi)有解決買(mǎi)賣(mài)的最核心的問(wèn)題,即到底何時(shí)買(mǎi)賣(mài),雖然每個(gè)流派都有它的解決方案,但是它的方案卻是拋出了一個(gè)新的問(wèn)題來(lái)解決我們要解決的問(wèn)題。

不過(guò)這些問(wèn)題是存在一些技術(shù)指標(biāo)來(lái)輔助我們觀察走勢(shì)以及超買(mǎi)超賣(mài)的。

技術(shù)指標(biāo)

這里主要討論一下常用的技術(shù)指標(biāo),比如MACD, 均線, RSI.除此之外還有一些有意思的圖形指標(biāo),通過(guò)判斷圖表的形狀來(lái)判斷買(mǎi)賣(mài),而圖形派是既能做趨勢(shì)跟隨也能做價(jià)值回歸

下面是它們的計(jì)算公式及介紹。

MACD

MACD稱為異同移動(dòng)平均線,是從雙指數(shù)移動(dòng)平均線發(fā)展而來(lái)的,由快的指數(shù)移動(dòng)平均線(EMA12)減去慢的指數(shù)移動(dòng)平均線(EMA26)得到快線DIF,再用2×(快線DIF-DIF的9日加權(quán)移動(dòng)均線DEA)得到MACD柱。--- 摘自百度百科

這個(gè)指標(biāo)的快線DIF是是兩個(gè)指數(shù)平均線的差,所以當(dāng)走勢(shì)上揚(yáng)的時(shí)候,會(huì)是正數(shù),而上揚(yáng)的曲率很大的時(shí)候則也會(huì)迅速變大,而它的DEA自然是在其下方,而趨勢(shì)向下的時(shí)候相反。所以這個(gè)指標(biāo)可以反映出歷史的走勢(shì),并且過(guò)濾一部分并沒(méi)有明顯趨勢(shì)的走勢(shì),但是如果沒(méi)有明顯走勢(shì)則是交叉死叉來(lái)回糾纏,對(duì)于局勢(shì)的判斷就不太明顯。

移動(dòng)平均線

移動(dòng)平均線,Moving Average,簡(jiǎn)稱MA,MA是用統(tǒng)計(jì)分析的方法,將一定時(shí)期內(nèi)的證券價(jià)格(指數(shù))加以平均,并把不同時(shí)間的平均值連接起來(lái),形成一根MA,用以觀察證券價(jià)格變動(dòng)趨勢(shì)的一種技術(shù)指標(biāo)。--- 摘自百度百科

移動(dòng)平均線應(yīng)該是應(yīng)用最廣泛的技術(shù)指標(biāo)了,因?yàn)閹缀跛械慕灰总浖紩?huì)繪制移動(dòng)平均線,它就是反應(yīng)了歷史的趨勢(shì),走勢(shì)向上則向上,反之亦然。

RSI

N日RSI =N日內(nèi)收盤(pán)漲幅的平均值/(N日內(nèi)收盤(pán)漲幅均值+N日內(nèi)收盤(pán)跌幅均值) × 100 --- 摘自百度百科

RSI很有意思,如果N日內(nèi)全是上漲則是100,全是下跌則是0,所以100代表市場(chǎng)太樂(lè)觀,0代表市場(chǎng)太悲觀,這在走勢(shì)震蕩的時(shí)候自然有用,但是如果就是走勢(shì)一路上揚(yáng),那么其實(shí)不是太樂(lè)觀,而是市場(chǎng)就是如此,這個(gè)時(shí)候不應(yīng)該反向操作。

蠟燭圖

即我們熟悉的K線圖,通過(guò)開(kāi)盤(pán)價(jià),最高價(jià),最低價(jià),表示一個(gè)時(shí)間周期的交易情況,蠟燭圖有許多的有意義圖形,這里主要說(shuō)幾個(gè)我覺(jué)得有點(diǎn)道理的圖形,長(zhǎng)實(shí)體,十字星

長(zhǎng)實(shí)體指單根k線的最高價(jià)與最低價(jià)相差很大,然后收盤(pán)價(jià)與開(kāi)盤(pán)價(jià)分別非??拷罡邇r(jià)最低價(jià)。之所以這樣是因?yàn)橘I(mǎi)方或者賣(mài)方非常強(qiáng)勢(shì)。可以用來(lái)推測(cè)后面的走勢(shì),可用作趨勢(shì)跟隨。

十字星指開(kāi)盤(pán)價(jià)與收盤(pán)價(jià)的差距非常小,幾乎重合,然后有一部分的影線。之所以這樣是因?yàn)橘I(mǎi)方賣(mài)方反復(fù)糾纏,卻誰(shuí)又干不過(guò)誰(shuí),可以用來(lái)推測(cè)局勢(shì)的反轉(zhuǎn),可用作價(jià)值回歸。

最近的上證指數(shù)很有意思,這兩個(gè)圖形啥都有。

用Python可視化股票指標(biāo)

所有技術(shù)指標(biāo)都有其內(nèi)在的含義,通過(guò)觀察它的計(jì)算公式就知道,而且所有技術(shù)指標(biāo)都存在一樣的問(wèn)題,那就是滯后性,或者說(shuō)只是反映了歷史的走勢(shì),不過(guò),這是理所應(yīng)當(dāng)?shù)模磥?lái)還未來(lái)。如果哪個(gè)指標(biāo)可以預(yù)測(cè)未來(lái),這個(gè)未來(lái)就太沒(méi)意思了。

總結(jié)而言,無(wú)論是主觀交易還是通過(guò)技術(shù)指標(biāo)判斷而進(jìn)行交易,最終的判斷在于決策者的經(jīng)驗(yàn),這個(gè)經(jīng)驗(yàn)也許可以量化也許不可以量化。可以量化自然是最好的,不可以量化那也沒(méi)問(wèn)題,只要能掙錢(qián)不就夠了嘛,不過(guò)是手動(dòng)跟自動(dòng)的區(qū)別。

可視化

多說(shuō)無(wú)益,讓我們看看這些指標(biāo)的買(mǎi)賣(mài)情況吧。

這里使用上證指數(shù)

import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
import talib
import tushare as ts
# pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
from mpl_finance import candlestick_ohlc
from matplotlib.pylab import date2num

# 使用ggplot樣式,好看些
mpl.style.use("ggplot")
# 獲取上證指數(shù)數(shù)據(jù)
data = ts.get_k_data("000001", index=True, start="2019-01-01")
# 將date值轉(zhuǎn)換為datetime類(lèi)型,并且設(shè)置成index
data.date = pd.to_datetime(data.date)
data.index = data.date

# 計(jì)算MACD指標(biāo)數(shù)據(jù)
data["macd"], data["sigal"], data["hist"] = talib.MACD(data.close)

# 計(jì)算移動(dòng)平均線
data["ma10"] = talib.MA(data.close, timeperiod=10)
data["ma30"] = talib.MA(data.close, timeperiod=30)

# 計(jì)算RSI
data["rsi"] = talib.RSI(data.close)

# 計(jì)算MACD指標(biāo)數(shù)據(jù)
data["macd"], data["sigal"], data["hist"] = talib.MACD(data.close)

# 計(jì)算移動(dòng)平均線
data["ma10"] = talib.MA(data.close, timeperiod=10)
data["ma30"] = talib.MA(data.close, timeperiod=30)

# 計(jì)算RSI
data["rsi"] = talib.RSI(data.close)

# 繪制第一個(gè)圖
fig = plt.figure()
fig.set_size_inches((16, 20))

ax_canddle = fig.add_axes((0, 0.7, 1, 0.3))
ax_macd = fig.add_axes((0, 0.45, 1, 0.2))
ax_rsi = fig.add_axes((0, 0.23, 1, 0.2))
ax_vol = fig.add_axes((0, 0, 1, 0.2))

data_list = []
for date, row in data[["open", "high", "low", "close"]].iterrows():
    t = date2num(date)
    open, high, low, close = row[:]
    datas = (t, open, high, low, close)
    data_list.append(datas)

# 繪制蠟燭圖
candlestick_ohlc(ax_canddle, data_list, colorup='r', colordown='green', alpha=0.7, width=0.8)
# 將x軸設(shè)置為時(shí)間類(lèi)型
ax_canddle.xaxis_date()
ax_canddle.plot(data.index, data.ma10, label="MA10")
ax_canddle.plot(data.index, data.ma30, label="MA30")
ax_canddle.legend()

# 繪制MACD
ax_macd.plot(data.index, data["macd"], label="macd")
ax_macd.plot(data.index, data["sigal"], label="sigal")
ax_macd.bar(data.index, data["hist"] * 2, label="hist")
ax_macd.legend()

# 繪制RSI
# 超過(guò)85%設(shè)置為超買(mǎi), 超過(guò)25%為超賣(mài)
ax_rsi.plot(data.index, [80] * len(data.index), label="overbuy")
ax_rsi.plot(data.index, [25] * len(data.index), label="oversell")
ax_rsi.plot(data.index, data.rsi, label="rsi")
ax_rsi.set_ylabel("%")
ax_rsi.legend()

# 將volume除以100w
ax_vol.bar(data.index, data.volume / 1000000)
# 設(shè)置成百萬(wàn)位單位
ax_vol.set_ylabel("millon")
ax_vol.set_xlabel("date")
fig.savefig("index.png")

# 標(biāo)記移動(dòng)平均線買(mǎi)入賣(mài)出點(diǎn)
for date, point in data[["ma_point"]].itertuples():
    if math.isnan(point):
        continue
    if point > 0:
        ax_canddle.annotate("",
                    xy=(date, data.loc[date].close),
                    xytext=(date, data.loc[date].close - 10),
                    arrowprops=dict(facecolor="r",
                                    alpha=0.3,
                                    headlength=10,
                                    width=10))
    elif point < 0:
        ax_canddle.annotate("",
                    xy=(date, data.loc[date].close),
                    xytext=(date, data.loc[date].close + 10),
                    arrowprops=dict(facecolor="g",
                                    alpha=0.3,
                                    headlength=10,
                                    width=10))

如果通過(guò)pip install ta-lib安裝不上,可以通過(guò)地址http://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib下載響應(yīng)的.whl包進(jìn)行安裝

顯示結(jié)果如下:

用Python可視化股票指標(biāo)

如果簡(jiǎn)單的通過(guò)指標(biāo)的金叉死叉會(huì)出現(xiàn)反常多的買(mǎi)點(diǎn)賣(mài)點(diǎn),所以這里只是標(biāo)記了移動(dòng)平均線的買(mǎi)賣(mài)點(diǎn)。

通過(guò)簡(jiǎn)單觀察我們發(fā)現(xiàn)RSI在這段時(shí)間內(nèi)沒(méi)有超賣(mài)的情況也就沒(méi)有買(mǎi)入點(diǎn)。

總結(jié)

沒(méi)有萬(wàn)能的指標(biāo),關(guān)鍵在于使用指標(biāo)的人。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI