­

用Python可視化股票指標

用Python可視化股票指標

一個完整的量化交易策略指考慮到交易的方方面面,但是能不能賺錢,誰知道呢 🙂

但是一個量化交易可以通過回測系統建立信心然後讓其一如既往的運行,以達到讓錢生錢的目的,並且是自動的。

筆者主要談純技術面的量化交易,基本面的一些情況並不好處理及量化,我也暫時沒有涉及。

量化交易

一個完整的量化交易策略,個人覺得應該包含以下兩個部分:

  • 交易策略
  • 資金管理

交易策略

一個完整的交易策略應該包含何時買,何時賣。

到底應該如何買賣,市場上大致分為兩個技術流派。

  • 趨勢跟隨
  • 價值回歸

趨勢跟隨

這個流派認為,股票的走勢是有延續性的,所以買賣點的機會在於抓住走勢。

代表指標: MACD, 移動平均線。

評語: 半年不開張,開張吃半年。

價值回歸

這個流派認為,股票是有內在價值的,雖然無序的來回跳動,但是自始至終圍繞着自己的內在價值來回波動,所以買賣的機會抓住股票的超買,超賣點來進行買賣。

代表指標: RSI。

評語: 積少成多。

無論是趨勢跟隨還是價值回歸,其實還是沒有解決買賣的最核心的問題,即到底何時買賣,雖然每個流派都有它的解決方案,但是它的方案卻是拋出了一個新的問題來解決我們要解決的問題。

不過這些問題是存在一些技術指標來輔助我們觀察走勢以及超買超賣的。

技術指標

這裡主要討論一下常用的技術指標,比如MACD, 均線, RSI.除此之外還有一些有意思的圖形指標,通過判斷圖表的形狀來判斷買賣,而圖形派是既能做趨勢跟隨也能做價值回歸

下面是它們的計算公式及介紹。

MACD

MACD稱為異同移動平均線,是從雙指數移動平均線發展而來的,由快的指數移動平均線(EMA12)減去慢的指數移動平均線(EMA26)得到快線DIF,再用2×(快線DIF-DIF的9日加權移動均線DEA)得到MACD柱。— 摘自百度百科

這個指標的快線DIF是是兩個指數平均線的差,所以當走勢上揚的時候,會是正數,而上揚的曲率很大的時候則也會迅速變大,而它的DEA自然是在其下方,而趨勢向下的時候相反。所以這個指標可以反映出歷史的走勢,並且過濾一部分並沒有明顯趨勢的走勢,但是如果沒有明顯走勢則是交叉死叉來回糾纏,對於局勢的判斷就不太明顯。

移動平均線

移動平均線,Moving Average,簡稱MA,MA是用統計分析的方法,將一定時期內的證券價格(指數)加以平均,並把不同時間的平均值連接起來,形成一根MA,用以觀察證券價格變動趨勢的一種技術指標。— 摘自百度百科

移動平均線應該是應用最廣泛的技術指標了,因為幾乎所有的交易軟件都會繪製移動平均線,它就是反應了歷史的趨勢,走勢向上則向上,反之亦然。

RSI

N日RSI =N日內收盤漲幅的平均值/(N日內收盤漲幅均值+N日內收盤跌幅均值) × 100 — 摘自百度百科

RSI很有意思,如果N日內全是上漲則是100,全是下跌則是0,所以100代表市場太樂觀,0代表市場太悲觀,這在走勢震蕩的時候自然有用,但是如果就是走勢一路上揚,那麼其實不是太樂觀,而是市場就是如此,這個時候不應該反向操作。

蠟燭圖

即我們熟悉的K線圖,通過開盤價,最高價,最低價,表示一個時間周期的交易情況,蠟燭圖有許多的有意義圖形,這裡主要說幾個我覺得有點道理的圖形,長實體,十字星

長實體指單根k線的最高價與最低價相差很大,然後收盤價與開盤價分別非常靠近最高價最低價。之所以這樣是因為買方或者賣方非常強勢。可以用來推測後面的走勢,可用作趨勢跟隨。

十字星指開盤價與收盤價的差距非常小,幾乎重合,然後有一部分的影線。之所以這樣是因為買方賣方反覆糾纏,卻誰又干不過誰,可以用來推測局勢的反轉,可用作價值回歸。

最近的上證指數很有意思,這兩個圖形啥都有。

所有技術指標都有其內在的含義,通過觀察它的計算公式就知道,而且所有技術指標都存在一樣的問題,那就是滯後性,或者說只是反映了歷史的走勢,不過,這是理所應當的,未來還未來。如果哪個指標可以預測未來,這個未來就太沒意思了。

總結而言,無論是主觀交易還是通過技術指標判斷而進行交易,最終的判斷在於決策者的經驗,這個經驗也許可以量化也許不可以量化。可以量化自然是最好的,不可以量化那也沒問題,只要能掙錢不就夠了嘛,不過是手動跟自動的區別。

可視化

多說無益,讓我們看看這些指標的買賣情況吧。

這裡使用上證指數

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")  # 獲取上證指數數據  data = ts.get_k_data("000001", index=True, start="2019-01-01")  # 將date值轉換為datetime類型,並且設置成index  data.date = pd.to_datetime(data.date)  data.index = data.date    # 計算MACD指標數據  data["macd"], data["sigal"], data["hist"] = talib.MACD(data.close)    # 計算移動平均線  data["ma10"] = talib.MA(data.close, timeperiod=10)  data["ma30"] = talib.MA(data.close, timeperiod=30)    # 計算RSI  data["rsi"] = talib.RSI(data.close)    # 計算MACD指標數據  data["macd"], data["sigal"], data["hist"] = talib.MACD(data.close)    # 計算移動平均線  data["ma10"] = talib.MA(data.close, timeperiod=10)  data["ma30"] = talib.MA(data.close, timeperiod=30)    # 計算RSI  data["rsi"] = talib.RSI(data.close)    # 繪製第一個圖  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軸設置為時間類型  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  # 超過85%設置為超買, 超過25%為超賣  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)  # 設置成百萬位單位  ax_vol.set_ylabel("millon")  ax_vol.set_xlabel("date")  fig.savefig("index.png")    # 標記移動平均線買入賣出點  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))

如果通過pip install ta-lib安裝不上,可以通過地址http://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib下載響應的.whl包進行安裝

顯示結果如下:

如果簡單的通過指標的金叉死叉會出現反常多的買點賣點,所以這裡只是標記了移動平均線的買賣點。

通過簡單觀察我們發現RSI在這段時間內沒有超賣的情況也就沒有買入點。

總結

沒有萬能的指標,關鍵在於使用指標的人。