一個完整的量化交易策略指考慮到交易的方方面面,可是能不能賺錢,誰知道呢 :)python
可是一個量化交易能夠經過回測系統創建信心而後讓其一如既往的運行,以達到讓錢生錢的目的,而且是自動的。git
筆者主要談純技術面的量化交易,基本面的一些狀況並很差處理及量化,我也暫時沒有涉及。github
一個完整的量化交易策略,我的以爲應該包含如下兩個部分:app
一個完整的交易策略應該包含什麼時候買,什麼時候賣。ide
到底應該如何買賣,市場上大體分爲兩個技術流派。code
這個流派認爲,股票的走勢是有延續性的,因此買賣點的機會在於抓住走勢。blog
表明指標: MACD, 移動平均線。ip
評語: 半年不開張,開張吃半年。ci
這個流派認爲,股票是有內在價值的,雖然無序的來回跳動,可是自始至終圍繞着本身的內在價值來回波動,因此買賣的機會抓住股票的超買,超賣點來進行買賣。get
表明指標: 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在這段時間內沒有超賣的狀況也就沒有買入點。
沒有萬能的指標,關鍵在於使用指標的人。