Python量化交易進階講堂-扒一扒量化回測中常見的陷阱

歡迎你們訂閱《Python實戰-構建基於股票的量化交易系統》小冊子,小冊子會陸續推出與小冊內容相關的專欄文章,對涉及到的知識點進行更全面的擴展介紹,而且會有選擇地收錄至小冊中,更便於廣大讀者查閱知識點。本篇專欄爲小冊子內容的加推篇!!!微信

前言

目前量化交易正在不斷地快速發展,量化交易的可回測性是區別於主觀投資的重要特徵。量化回測是指基於歷史行情數據將交易策略產生歷史交易,從而評估交易策略的歷史表現。網絡

網上出現了愈來愈多的分析軟件、交易策略,咋一看回測的效果都很是漂亮,獲利百分之幾百的收益十分廣泛。可是這個收益業績卻有多是高估的,不明真相的朋友購買後本身使用時才發現現實是殘酷的。測試

這裏建議你們在親眼看到策略代碼以前,都要保持半信半疑的謹慎態度,由於策略的收益是能夠人爲作出來的。真正賺錢的策略必定是由本身開發並創建起自信的策略,這也是筆者爲何要介紹你們製做量化交易策略的方法,授人魚不如授人以漁嘛。優化

對於我的編寫的交易策略每每也會存在,回測效果很是完美,實盤卻可能表現不佳。spa

爲了不在回測過程當中高估策略的業績表現,咱們須要考慮如何編寫回測程序以及如何構造交易策略。code

本次小冊的加推篇咱們來一塊兒扒一扒量化交易中常見回測陷阱。cdn

前視誤差

前視誤差是指在策略回測階段採起了將來的信息來決定以前的交易,而這些信息在實盤操做中是沒法獲知的。這裏咱們提供幾個典型的案例來介紹下:blog

  • 買入策略1:「當天的收盤價突破前一天的最高價,則利用當天開盤價買入股票」,很明顯,在開盤價成交幾乎是不可能的事情了。開發

  • 買入策略2:「當日K線突破M20均線的時候以當前開盤價買入股票」,很明顯,在開盤的時候是沒法預知今日K線最終是否是可以突破M20均線。get

前視誤差是咱們要極力避免的錯誤。如何避免前視誤差?可使用「滯後」的歷史數據來計算策略信號。滯後的數據意味着,在涉及到移動平均值、最高價、最低價、成交量等指標時,只使用「上一」交易日的收盤數據。好比如下代碼:

""" 收盤價超過N1最高價 買入股票持有"""
buy_index = stock_df[stock_df.Close > stock_df.N1_High.shift(1)].index 
stock_df.loc[buy_index,'signal'] = 1

""" 收盤價超過N2最低價 賣出股票持有"""
sell_index = stock_df[stock_df.Close < stock_df.N2_Low.shift(1)].index 
stock_df.loc[sell_index,'signal'] = 0
複製代碼

shift(1)是在index不變的狀況下對序列的值向後移動一個單位。目的是獲取昨天爲止的最高/最低價格。這樣就能使用「滯後」的歷史數據來計算策略信號。

偷價

若是一個交易策略要求你利用信號觸發時的價格進行交易,那麼這個交易策略就存在偷價的狀況。

不少人會低估偷價的危害性,事實上,固定點數的偷價至關於在本來的資金曲線上疊加了一條斜率爲正的直線(在每次交易都是固定手數的狀況下)。

假設一年250個交易日,每一個交易日均對一隻長期保持10元的股票執行一次100股的買賣,每次買賣都偷價1個tick(tick設置爲1個點,即0.1元),那麼整年下來能夠多獲利500*0.1*100 = 5000元,這甚至超越了你的本金。

然而,現實的狀況是不但沒法低於一個tick的價格成交,更多的反而是高於一個甚至多個tick的價格成交。緣由很簡單,大多數趨勢交易者都會在某個關鍵點位建倉,競爭致使價格在這些關鍵位置造成劇烈波動,而且這種波動一般是對程序化交易不利的波動。因此在構建一個頻率較高的交易系統的時候,更可能是要考慮和解決滑點問題。

手續費

手續費至關於在本來的資金曲線上疊加了一條斜率爲負的直線(在每次交易都是固定手數的狀況下)。策略進行測試時,若是不計入手續費,資金曲線可能會產生巨大差別,甚至不計手續費時盈利的策略,在計入手續費後可能產生虧損。 當前股票交易費用由三部分組成:佣金、印花稅、過戶費(僅上海股票收取)

  • 印花稅:成交金額的1‰。2008年9月19日至今由向雙邊徵收改成向出讓方單邊徵收(賣的時候才收取)。受讓者再也不繳納印花稅。投資者在買賣成交後支付給財稅部門的稅收。上海股票及深圳股票均按實際成交金額的千分之一支付,此稅收由券商代扣後由交易所統一代繳。債券與基金交易均免交此項稅收。

  • 過戶費:這是指股票成交後,更換戶名所需支付的費用。根據中國登記結算公司的發文《關於調整A股交易過戶費收費標準有關事項的通知》,從2015年8月1日起已經更改成上海和深圳都進行收取,此費用按成交金額的0.02‰收取。

  • 交易佣金:最高收費爲3‰,最低收費5元。

滑點

滑點是指觸發指令的價格和最終成交價格之間的差別,它是不免會發生的狀況,一般滑點產生的緣由有如下兩類:

  • 行情波動劇烈、市場容量不夠等狀況致使的

  • 網絡延遲、交易平臺不穩定等狀況致使的

滑點是一個合格的交易策略必須充分考慮的因素。若是在一個交易策略中,將滑點數設置爲0,即採用現價指令買賣證券其資金曲線就會優於同一個滑點數不爲0的策略。一般咱們要在最極端的條件下去構建和測試系統,通常系統都是高於2個tick的滑點來構建的。

過分優化

過分優化是指爲了遷就歷史數據的噪音而將一個策略的參數或者規則反覆優化到最佳的狀況。

顯然,即使是一個不能賺錢的策略,若是用暴力枚舉法優化選取參數,也可以有個別參數可以使策略盈利,可是根據過分優化獲得的最佳參數來制定策略和控制風險,在實盤中是難以盈利的。

避免過分優化的有效辦法有如下幾個:

  • 通常而言,策略的規則越多,模型的參數越多,就越可能出現過分擬合問題。所以採用的參數越少,能夠優化的規則越少,天然過分優化的狀況就可以獲得很好的避免,而且,越少參數構建的策略,每每越穩健。

  • 合理選擇樣本。有些策略覆蓋的股票品種太少,時間週期過短,不能充分展示策略效果。好比策略只用於個別品種上,或者僅僅覆蓋了一種類型的行情。這些策略在遇到大相徑庭的市場狀況時,表現可能會截然不同。

  • 進行樣本外測試。構建策略模型時,將歷史數據根據時間前後分爲兩段。參數優化和定性選擇使用前一段數據(訓練集),策略模型的測試使用後一段數據(測試集)。

總結

以上介紹的這些策略陷阱都有一個共性,就是在回測時表現地很是優異,但與實盤並不相符,不少交易者在策略的開發中不自覺地會犯下這類錯誤,若是將回測結果做爲本身預期收益和風險管理的依據,後果不堪設想,你們千萬要引覺得戒。

更多的量化交易內容歡迎你們訂閱小冊閱讀!!同時也歡迎你們關注個人微信公衆號【元宵大師帶你用Python量化交易】瞭解更多Python量化交易相關內容

相關文章
相關標籤/搜索