量化技術分析應用

阿布量化發表於2017-08-28

作者: 阿布

阿布量化版權所有 未經允許 禁止轉載

abu量化系統github地址(歡迎+star)

本節ipython notebook

量化交易的最大優勢即為通過計算機強大的運算能力,在市場廣度分析上佔有絕對優勢,通過歷史規律的總結,在規律的基礎上發現概率優勢,形成良好投機優勢,量化交易離不開技術分析,本節將主要示例一些常用的技術分析在abupy中的介面實現。

將abupy內建沙盒資料中美股,A股,港股市場中的symbol都列出來,稍後繪製這些symbol的阻力線,支援線:

us_choice_symbols = ['usTSLA', 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usWUBA', 'usVIPS']
cn_choice_symbols = ['002230', '300104', '300059', '601766', '600085', '600036', '600809', '000002', '002594', '002739']
hk_choice_symbols = ['hk03333', 'hk00700', 'hk02333', 'hk01359', 'hk00656', 'hk03888', 'hk02318']複製程式碼

1. 阻力線,支撐線自動繪製

對趨勢技術分析很熟悉的朋友們對上升趨勢線,下降趨勢線,阻力線, 支撐線這些概念很熟悉,但是從理論出發,很難有兩個人畫出的線是完全一樣的,即使是一個人不同的時候去畫也會有精度的誤差,使用資料分析自己畫出趨勢與阻力是對量化分析的最根本詮釋,人對資料的敏感度一定不如死的機器,因為人是有感情的,也許你會畫出自己想要的趨勢線阻力線來騙自己,再堅持一下馬上就阻力了就上去了等等,快交給機器吧!別自己畫了!

封裝一個函式預設繪製usTSLA的趨勢線,主要將AbuTLine中繪製阻力線,支撐線的函式進行封裝,程式碼如下所示:

def plot_trend(symbol='usTSLA', n_folds=1, only_last=False, how='both', show_step=False):
    n_folds = int(n_folds)
    # 獲取symbol的n_folds年資料
    kl = ABuSymbolPd.make_kl_df(symbol, n_folds=n_folds)
    # 構造技術線物件
    kl_tl = tl.AbuTLine(kl.close, 'kl')
    if how == 'support':
        # 只繪製支援線
        kl_tl.show_support_trend(only_last=only_last, show=True, show_step=show_step)
    elif how == 'resistance':
        # 只繪製阻力線
        kl_tl.show_resistance_trend(only_last=only_last, show=True, show_step=show_step)
    else:
        # 支援線和阻力線都繪製
        kl_tl.show_support_resistance_trend(only_last=only_last, show=True, show_step=show_step)
plot_trend()複製程式碼

上面的函式繪製了tsla一年中的支撐線和阻力線,由於一年內會存在可能會存在多條阻力線,以及多條支撐線,有些支撐線也已經明顯破位,比如上面淺藍色那根早期的支撐線,還有黃色的早期阻力線,如果只想繪製最近的阻力線和支援線,可以使用only_last引數,如下所示,最近的阻力線紅色,最近的支援線藍色,可以發現兩根線馬上就要相交了:

plot_trend(only_last=True)複製程式碼

abupy中阻力線,支撐線基本繪製原理如下所示:

  • 首先分析原始曲線的最佳擬合次數,根據最佳擬合次數對曲線進行多項式擬合,
  • 擬合後的函式通過bfgs演算法尋找阻力位支撐位,即過濾篩選出趨勢關鍵骨架點
  • 對趨勢關鍵骨架點通過聚類演算法(kmean)以及方差最優計算,獲取最終的兩個關鍵點,兩點繪製阻力線或者支撐線

下面通過引數show_step為True將繪製阻力線,支撐線的中間分析步驟進行繪製,如下所示:

  • 下第一圖即為根據最佳擬合次數對曲線得到的擬合函式,通過bfgs演算法濾篩選出趨勢關鍵骨架點
  • 下第二圖通過聚類演算法以及方差最優計算出的聚類結果,不同的顏色代表不同的聚類簇
  • 下第三圖找到支撐線最終的兩個關鍵點,兩點繪製支撐線
  • 下第四圖找到阻力線最終的兩個關鍵點,兩點繪製阻力線

更多實現細節請閱讀原始碼AbuTLine以及ABuTLExecute

plot_trend(only_last=True, show_step=True)複製程式碼

下面嘗試繪製其它symbol的趨勢線,一個個引數換太麻煩了,使用ipywidgets進行互動,如下所示:

from ipywidgets import interact, Checkbox 


symbol_range = us_choice_symbols + cn_choice_symbols + hk_choice_symbols
n_folds_range =  [1, 2, 3, 4, 5, 6]
only_last_check = Checkbox(False)
show_step_check = Checkbox(False)
how_range = ['both', 'support', 'resistance']

_ = interact(plot_trend, symbol=symbol_range, n_folds=n_folds_range, 
             only_last=only_last_check, how=how_range, show_step=show_step_check)複製程式碼

通過阻力線,支撐線的確定,可以實現均值回覆型別的擇時策略,比如在支撐線位置買入股票,之後在阻力線位置賣出股票。

但是並不建議像上面這種簡單實現,因為阻力線和支撐線的確定本身即存在很大分歧,即在本節初始說的,很難有兩個人畫出的線是完全一樣的,即使是一個人不同的時候去畫也會有精度的誤差,使用程式去繪製的好處是規避感情,人去繪製很容易繪製出自己希望的走勢,看上去好像還挺有道理。

建議的使用方式是類似閥值支援度的方式,比如在一個均值回覆策略中:使用黃金分割線的0.382附近做為初始檢測買入點,這時候可以同時度量一下現在是否同樣處在支撐線附近,且離阻力線足夠遠,同時做為買入條件,也可以再並上其它條件,形成一個苛刻的買入策略,即買入條件為:

  1. 黃金分割線的0.382附近
  2. 支撐線附近
  3. 離阻力線足夠遠
  4. .....................
  5. .....................

量化分析的最大長處即是通過計算機強大的運算能力,在廣度上佔有絕對優勢,即如果是傳統人腦的分析方式上述方法是行不通的,因為人的能力範圍內所能涉及的交易目標數量有限,上述苛刻條件可能導致交易者很長時間無交易可做,但通過量化交易可以在短時間內完成對不同市場的不同交易目標分析,林子大了什麼鳥都有,一定會有符合條件的買入目標。

在之後的章節會使用阻力線和支撐線編寫一個完整的擇時選股策略,,請關注公眾號的更新提醒。

2. 跳空技術分析

跳空缺口是指股價開盤價高於昨天的最高價或低於昨天的最低價,使K線圖出現空檔的現象。

  • 普通缺口:特點就是很快被回補,價格在幾天之內就會回補
  • 突破缺口:當價格和成交量伴隨跳空(向上或者向下)跳出震盪區,則預示著新趨勢的形成
  • 衰竭缺口:缺口沒有很快回補,走勢也反覆無常,最終慢慢的回補缺口,預示著市場走勢將可能劇烈的反轉

本節只從使用的角度出發,示例abupy中的跳空統計分析介面的使用:

tsla_df = ABuSymbolPd.make_kl_df('usTSLA')
jumps = tl.jump.calc_jump(tsla_df)複製程式碼

缺口最大的意義在於存在很強的支撐或者阻力,你可以發現上述實現的缺口選取了很多點,那首先做做減法,選取那些阻力支撐最強的缺口,從程式碼來說就是jump_power最大的那些缺口。

可以使用tl.jump.calc_jump_line()獲取jump_power大於閥值的缺口,如下所示以2.8為跳空能量篩選閥值:

jump_pd = tl.jump.calc_jump_line(tsla_df, power_threshold=2.8)複製程式碼

tl.jump.calc_jump_line_weight()函式與上面使用的calc_jump_line()函式區別是根據時間權重重新計算了jump_power,也就比如一年前有個jump_power=2的缺口,昨天也有個jump_power=2的缺口,根據時間線性加權的結果,一年前的jump_power要遠遠小於2可能只有0.8了,但是昨天的缺口jump_power還是2。

使用時間加權的一個原因是隨著時間的流逝,越遠的記憶越淡忘,不管你當時有多懊悔多傷悲,另一個原因是針對同一個市場一支股票的交易者可能已經交替更換,新的交易者沒有之前或惋惜或懊悔的記憶,每7年我們就是一個全新的自己,所有細胞血液更新一遍完成。

下面的程式碼使用tl.jump.calc_jump_line_weight()函式即時間加權方式,對缺口行進行過濾:

# sw[0]代表非時間因素的jump_power,sw[1]代表時間加權因素的jump_power,當sw[0]=1時與非加權方式相同,具體實現請參考原始碼  
jump_pd = tl.jump.calc_jump_line_weight(tsla_df, sw=(0.5, 0.5))複製程式碼

得到跳空的缺口後,與上面所說的支撐線,阻力線的應用方式類似,可以直接做為策略觸發點,也可以做為輔助判斷條件使用。

3. 傳統技術指標技術分析

abupy中內建了傳統技術指標視覺化及度量方法,如下示例,首先使用usTSLA進行回測,從回測結果中取出一個交易單:

# 設定初始資金數
read_cash = 1000000
# 買入因子依然延用向上突破因子
buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak},
               {'xd': 42, 'class': AbuFactorBuyBreak}]
# 賣出因子繼續使用上一節使用的因子
sell_factors = [
    {'stop_loss_n': 1.0, 'stop_win_n': 3.0,
     'class': AbuFactorAtrNStop},
    {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
    {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
]

abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
                                                   buy_factors,
                                                   sell_factors,
                                                   choice_symbols=['usTSLA'])

order = abu_result_tuple.orders_pd.ix[0]複製程式碼

繪製macd以及交易的買入賣出點位,如下所示:

nd.macd.plot_macd_from_order(order)複製程式碼

繪製boll以及交易的買入賣出點位,如下所示:

nd.boll.plot_boll_from_order(order)複製程式碼

繪製多條均線以及交易的買入賣出點位,如下所示:

nd.ma.plot_ma_from_order(order, time_period=[10, 20, 30, 60, 90, 120])複製程式碼

abupy中內建的技術分析介面還有一些暫時沒有示例,在之後的章節會陸續進行示例,請關注公眾號的更新提醒。

abu量化文件目錄章節

  1. 擇時策略的開發
  2. 擇時策略的優化
  3. 滑點策略與交易手續費
  4. 多支股票擇時回測與倉位管理
  5. 選股策略的開發
  6. 回測結果的度量
  7. 尋找策略最優引數和評分
  8. A股市場的回測
  9. 港股市場的回測
  10. 比特幣,萊特幣的回測
  11. 期貨市場的回測
  12. 機器學習與比特幣示例
  13. 量化技術分析應用
  14. 量化相關性分析應用
  15. 量化交易和搜尋引擎
  16. UMP主裁交易決策
  17. UMP邊裁交易決策
  18. 自定義裁判決策交易
  19. 資料來源
  20. A股全市場回測
  21. A股UMP決策
  22. 美股全市場回測
  23. 美股UMP決策

abu量化系統文件教程持續更新中,請關注公眾號中的更新提醒。

更多阿布量化量化技術文章

更多關於量化交易相關請閱讀《量化交易之路》

更多關於量化交易與機器學習相關請閱讀《機器學習之路》

更多關於abu量化系統請關注微信公眾號: abu_quant

相關文章