演算法交易策略的成功回測之一
介紹
本來來自英文網站 QuantStart 中對於演算法交易策略回測描述的一篇文章,原文可以參見腳註。[ Successful Backtesting of Algorithmic Trading Strategies - Part I] 市面上介紹演算法交易的文章雖然不算多,但也不少,很多量化愛好者也會在各大論壇對自己的策略進行分享, 一般的流程就是策略描述,策略程式碼,策略回測表現。但是,就筆者所看到的,很多類似的量化研究還停留 在比較初級的階段,很多回測中的問題,策略實現者並沒有意識到,最後回測出來一條貌似很牛逼的曲線, 就認為他的策略差不多可用了,印鈔機哪裡這麼容易去造成。當然,對於這些熱心分享的網友們,筆者表示 由衷感謝,正是從他們無私分享中,筆者也從一個普通菜鳥,漸漸成熟到能夠去獨立開發一些實盤策略,但 是,對於其中的一些坑坑窪窪,尤其是筆者也踩過了不少的坑,也不想後來人再去走一次這樣的彎路,因此, 去對回測中可能遇到的坑進行一些總結和分享,還是挺有必要的。
之前的文章中,筆者曾經提到過一些回測的坑,包括未來函式、偷價等常見的易犯的錯誤,不過經驗與能力 所限,筆者所言,在廣度與深度上也沒有那麼盡如人意。
恰巧,最近在 QuantStart 網站上看到了關於回測的一系列文章,很多論述,哪怕看過幾次都值得回味, 因此,筆者這裡斗膽,對這篇文章進行翻譯與二次加工,以饗讀者,希望讀者們能夠仔細閱讀這篇文章,如果 覺得筆者翻譯與註解的不行,完全可以去參照英文原文,多次品讀與回味。
什麼是回測
演算法交易和其他投資門類差別很大,相比其他投資方式,在提供了足夠豐富的資料後,演算法交易可以根據歷史 資料,對未來收益有一個更好的估計。通過歷史資料去估計未來收益,這樣的回程稱之為回測 (backtesting).
簡單而言,回測就是將你的獨特的策略應用到歷史金融資料上,得到一系列交易訊號,每次交易 (這裡的一次 包含買入和賣出) 都會有相應的利潤或者損失。將回測時間區間內的收益與損失進行累加,可以得到總盈虧。 這些就是回測的精華部分。當然,實際中還是會有各種問題,所謂 “魔鬼藏在細節中” (devil is always in the details),後續會提到.
那麼,為什麼要回測呢,下面是一些關鍵原因:
1.過濾
策略的研發過程,一般包括建模、研究、回測、模擬、實盤等階段,在研究過程中,對於我們去考慮策略 中設定的一些條件是否合適,回測可以提供一個比較好的評價標準,對於拖累回測結果的過濾條件,我們可 以評估需要加入這樣的過濾條件所有合適。
2.建模
回測允許我們 (安全地) 去測試對於市場建立的模型,譬如交易損失,買賣盤傳遞,延遲,流動性以及其 他市場微觀結構方面的問題。
3.優化
儘管策略優化很容易引入過擬合,回測不失為策略引數優化的有效手段。
4.驗證
策略通常是在外部進行編碼實現的,並僅通過策略自己的管道。但是,我們依然可以通過 對一個策略進行回測,看策略是否被正確地實現。儘管我們很難去觀察外部策略的訊號,但是通過 回測表現,譬如夏普、最大回撤等績效指標,我們可以大體評估我們寫下的程式碼是否達到我們所計劃 的那樣.
儘管回測對於演算法交易有著巨大的幫助,但是,對一個策略直接進行回測很多時候還是不可能的。通常而言, 隨著策略的時間頻率提升,回測的難度隨之加大。因為此時通過回測去正常衡量市場和交易的微觀結構 會變得非常困難,回測的可靠性也隨著急劇縮減。在超高頻演算法中,交易系統對於策略表現更為關鍵。
很不幸,儘管回測有著各種優點,但是它也會引入各種型別的偏差,下面,我們會深入討論這些偏差。
影響策略回測的偏差
對於策略回測,有很多因素會影響回測效果。而且更不幸的是,這些因素大部分都會造成回測效果比實際 交易效果更好。因此,在根據回測結果去評估策略效果的時候,最好將回測結果作為策略能達到效果的上 界。將影響回測的所有因素都消除是不可能的,我們能做到的就是儘量去減少會影響回測的因素,使其盡 量貼近實盤。
這裡,我們希望討論四種主要影響回測偏差的因素:過度優化、未來偏差、倖存者偏差以及心理承受偏差。
過度優化
過度優化可能是所有回測偏差中出現的最多的。優化和引入額外的交易引數,一般而言,在回測資料集上 策略回測績效表現非常吸引人的時候,往往都是過度優化,一旦實盤,策略表現就會表現的和回測差異 非常大。
由於策略中包含了很多引數,包括進出場條件,回溯週期,平均值週期 (譬如移動均線週期) 等, 消除過度優化往往很難。一種避免過度優化的方式是,減少引數的數量同時增加訓練集中的資料點。 但是,增加資料點也可能導致問題,由於回測週期過長,很久之前的資料與當前環境可能差異已經很大。 (譬如以牛市的歷史資料去評估熊市中策略的表現,很顯然是不合理的。)
有一種緩解過度優化的方式,稱之為 'sensitivity analysis'. 通過漸進地改變引數的數值 並畫出回測績效表現 “超曲面”。這樣子,選擇的合理的引數應該是一個引數域內表現比較平穩,且回測 結果不錯的引數組合,而對於回測績效曲面產生躍變的引數組合,顯然應該被排除。
未來偏差
當回測系統中不小心用到了未來的資料,也就是引入了實際在歷史中這個時刻應該沒有的資料,就產生未來偏 差。譬如我們按照時序來進行回測,當我們回測到了第 個數據點的時候,但是假如我們用到了第 個數據點, , 未來偏差就發生了。未來偏差的引入很微妙,這裡列出了三種可能引入未來偏差的 情況。
1.技術漏洞
程式碼中的陣列或者向量往往需要迭代或者進行索引,這些指標的不正確的偏移,可能導致原本我們想要取 的資料點,結果取到了 的資料點,這裡 .
2.引數計算
另外一種未來偏差可能在進行引數優化的時候出現,譬如對兩個時間序列進行線性迴歸,假如整個資料集 都被用來計算迴歸係數,並用來優化交易策略的時候,此時未來偏差就引入進來了,因為回測的時間點, 我們並不知道之後的資料點是什麼樣的,如果用這樣的引數去實盤,效果與回測就會偏差很大。
3.極值點
很多交易策略會用到一段時間內的極值點,譬如利用 OHLC (開高低收) 資料中的 high 和 low 的價格 序列。但是,這些極值點之後在相應的 bar 結束後才可以用來計算,如果在對應的 bar 還沒有走完就採 用極值點,往往就會引入未來偏差。無論在哪個交易策略中,如果要用到 high/low 的資訊,等上一個 bar 走完再進行計算,都是有必要的。
未來偏差往往是導致我們回測效果很好但是實盤卻很失敗的主要原因。
倖存者偏差
倖存者偏差對於策略而言,非常危險,往往會導致策略表現比實際好很多。通常這樣的偏差出現在我們當前所用 的資料集不包括一些歷史上原本應該存在的標的的時候,我們只考慮了當前仍然可以交易的標的,而歷史上的有 些退市或者 ST 股等並沒有加入到我們的初始股票池中。
經常會看到一些選股策略,只考慮當前的滬深 300的成分股,或者當前 A 股中沒有被 ST或停牌的股票組合, 這樣是不合理的,筆者曾經開發一個策略,在歷史上某個時刻,海南椰島被選入了模擬盤,但是第二天,海南椰島 被 ST, 如果回測時候刨除這樣的股票,無疑是引入了未來資訊。 (筆者注)
為了避免這樣的問題,可行的方式有兩種,
1.包含所有非倖存者的全量資料集
當然,這會引入其他問題,譬如,回測的時候,為了儘量避免出現倖存者偏差,筆者的選股程式會在每個歷史 交易日重置初始股票池,但這樣,無法一次快取歷史上所有歷史資料,導致回測速度變得很慢,所需資料量也 變得很大。(筆者注)
2.使用離當前時間更近的資料集
離當前更近的時間意味著挑出的股票池和當前應該更接近,但是沒有足夠長的回測時間,可能我們回測的資料 會比較少,不具有統計意義。(筆者注)
心理承受偏差
這種特殊的現象往往在量化交易中鮮被提及,但是,考慮到更自由的交易方式的時候,這種現象值得被展開講 一講。這種現象有很多名字,這裡,我決定稱之為 “心理承受偏差”,因為它揭示了問題的本質。
當我們開發一個策略,並對過去 5 年或者更長時間進行回測的時候,很容易看到一條向上的淨值曲線,回測 績效,包括綜合年化收益率,夏普,甚至是最大回測等都足以讓我們滿意。但是,假如這樣的策略最大回撤為 25%,回撤時間持續了 4 個月,對於動量策略,這樣的例子應該是常見的。通過回測結果,讓我們去接受這 樣的回撤週期和這樣的回撤值似乎是合理的,但是,真到實盤的時候,這遠比我們想象中的要難得多。
如果回測的時候看到了最大回撤有 25%,在實盤中,幾乎肯定會出現類似的甚至比回測的歷史回撤更大的回撤 以及回撤週期。這些回撤時期,心理上會非常難熬。之所以這裡將這樣的現象作為回測偏差,是因為策略如果 在回撤的時候就停止執行,策略當然還是一個成功的策略,但是這樣一來的話,相比回測,實際表現往往又會 遠遠不如回測結果。這樣,即使策略在客觀上是演算法式的,心理因素仍然對策略有著非常大的影響。應對方式 上,當你看到歷史回測中有這樣大的回撤和回撤市場,就需要對實盤時遇到類似的回撤,有足夠的堅持去繼續 執行自己的策略。
總結
開發一個屬於自己的策略往往需要在很多細節上花費非常多的心思,當回測出現一個很好的策略的時候,不必 先欣喜若狂,先仔細回顧自己的交易邏輯,然後再仔細調整自己在回測程式碼中的邏輯漏洞,儘量去做到盡善盡美, 同樣的策略交易邏輯,不同的人來寫,可能會有不同的結果,而往往,成敗就在邏輯的細節處,希望大家能夠 在開發自己的策略的時候,能夠小心小心再小心!!!
來源:QuantStart Team 翻譯:胡琛
------------------------------------------------------------------------------------
推薦閱讀:
相關推薦
演算法交易策略的成功回測之一
介紹 本來來自英文網站 QuantStart 中對於演算法交易策略回測描述的一篇文章,原文可以參見腳註。[ Successful Backtesting of Algorithmic Trading Strategies - Part I] 市面上介紹演算法交易的文章雖然不
阿爾法:比特幣演算法交易策略研究,你與賺錢只需一個量化
數字貨幣演算法交易模型和策略並非易事。更糟糕的是,目前的數字貨幣狀態是高度不穩定和迅速變化的。由於美國證券交易委員會和各種政府針對數字貨幣交換的規定,市場已成為戰區。儘管存在所有負面訊息,但許多交易員在日內交易數字貨幣資產方面做得很好。 我是Charles,目前就職於阿爾法數字貨幣量化平臺(m.aicoin
量化進階——多策略量化回測實錄(一)
京東金融官方資訊QQ群:456448095 有什麼想諮詢的都可以來詢問我們 移動平均線是技術分析中最常用的,作為一種簡單有效的數學模型而被廣泛使用。均線使用的方式的差異在於均線的計算方式與價格使用方式。不同的均線計算方式會產生不同的結果,不同的價格使用也會有不同的效
量化交易入門筆記-策略回測與評估
首先,編寫一個簡單的“雙均線量化策略” 程式碼如下: def initialize(context): """雙均線量化策略的初始化函式""" # 定義一個區域性變數,儲存要操作的股票 g.security = '000002.XSHE' #
自己做量化交易軟體(7)通通量化回測設計2-雙均線策略回測
前一篇介紹了回測類的設計,我們這篇簡單介紹一下回測程式設計。 我們以5日均線和20日均線的交叉作為買賣點策略,來計算對一隻股票交易的收益情況。這裡僅僅是一個雙均線策略演示的例子。讀者可以在此基礎上,修改為自己的策略。 程式test_df01.py 是雙均線回測程
交易策略的構建——在回測和優化之後
轉載原文: http://www.19lh.com/News_265.html 那些擁有豐富經驗的交易員們都知道,想要開發一個持續有效的系統是有多麼困難。但是,很多市場的參與者常常憑藉某一圖形就輕易地確定他們的交易規則。誠然,這種方式能夠完美地契合他們所觀察到的某一特
C#比特幣網格交易策略實現及回測分析-基於OKex交易所
網格交易法或者網格交易策略,網上有很多的介紹,這裡是利用C#實現了比特幣網格交易的策略及程式化交易,並利用OKex上的K線資料進行了回測驗證,同時也進行視覺化的K線展示。對於網格交易策略簡單的說就是低買高賣策略,網格的含義是指對買賣區間和買賣倉位的控制手段。比如這裡我有8萬的
基於回歸幅度的反轉交易策略
長時間 圖片 基本上 clas 騙子 是個 態度 結果 bfd 基於回歸幅度的反轉交易策略 NO1:前言 河水並不需要計劃自己的行進路線,卻毫無例外的到達海洋。價格也同樣如此,它總是沿著最小阻力線去運動,它總是怎麽容易怎麽來。如果上升的阻力比下跌的阻力小,價格就會上漲
自己做量化交易軟體(6)通通量化歷史交易回測設計1
下面開始介紹回測功能的設計。我們前面軟體主要用的python函式設計,從現在開始使用python的類設計。 首先設計類class hpQuant(object)。初始化函式中存放一些交易變數。其中一些變數可以外部設定,例如總資金,交易手續費等等,我們按照A股交
JQData + matplotlib 實現回測日誌的交易細節視覺化 量化資料介面
原文:https://zhuanlan.zhihu.com/p/49051899 前言: 做量化交易的朋友都知道回測的重要性,回測結果是衡量一個量化交易策略是否靠譜的重要依據。回測平臺會按歷史行情資料模擬成交,並將回測結果彙總成報告。 在很多時候,僅有一份回測的最終結果是不夠的。比如
量化投資策略回測框架(一):勝率的估算
上次簡單介紹了回測之前的一些準備工作。這裡,將進一步介紹如何對一個投資策略就行完整的回測。 雜言:人啊,還是要做自己喜歡做的事情。勇於嘗試,是非常好的,當感覺不合適的時候,要儘早跳出。年輕人,還是不要太安逸,所以從財富跳到了私募。事情也是自己喜歡做的了。有時你會糾結,
python回測與交易框架之坑爹的類與類之間變數的傳輸
python類之間變數的傳輸的時候變數是字串和變數是列表或者字典是完全不同的: 試著把self.time的格式分別用字串,列表,和字典,看輸出的結果: import time class Book: def __init__(self): se
部署JupyterLab和pyalgotrade搭建web策略回測環境
pen vat pac 配置 rate jupyter com linux .sh ==========================================================================安裝anaconda 3 64位版本cd
量化學習 | GTquant量化回測框架之雙均線策略(一)
信號 應該 來看 hat 更新 圖片 而是 原理 暫時 做過量化投資或者對量化投資感興趣的朋友想必對雙均線策略是非常熟悉了。 作為技術分析中最基本的策略,雙均線策略大概就是新手村的第一個任務,所以作為本系列第一篇,我們也從雙均線策略開始吧! 雙均線策略是非常經典的趨
有關交易的性能測試點
異常 執行 處理 正常 檢測 都在 內存泄露 mil 宕機 有關交易的性能測試點 1.交易結果(Load Test Summary) a.測試並發用戶數 b.測試的持續時間 c.交易成功個數 d.交易成功率 以上都在交易執行結果報告中 2.響應時間(Response Tim
量化框架zipline--分鐘回測改寫
blog -- sim 第一個 數據 test elf 返回結果 line 轉自:http://www.cnblogs.com/dxf813/p/7845398.html 基於zipline的分鐘回測改寫,其中數據源為自定義,使用bcolz的ctable,該數據格式與pa
結合量價持倉分析的股指期貨日內交易策略
結合量價持倉分析的股指期貨日內交易策略 在股票市場中,量價關係是技術面分析的重點之一。在股指期貨市場中,由於T+0交易制度,以及期指上市後不同階段的投機程度不同,股指期貨的成交量和價格之間的關係並不明朗。 持倉量是期貨交易區別於股票交易的重要市場變數,任何時點上,期
量化回測平臺Backtrader實戰-陸一瀟-專題視訊課程
量化回測平臺Backtrader實戰—240人已學習 課程介紹 課程通過學習Backtrader這一功能豐富的開源回測平臺來逐步實現多個量化cta策略的回測實現。Backtrader
【邢不行|量化小講堂系列34-python量化入門】萬能Python | 交易策略買點、賣點視覺化
引言: 邢不行的系列帖子“量化小講堂”,通過實際案例教初學者使用python進行量化投資,瞭解行業研究方向,希望能對大家有幫助。 【歷史文章彙總】請點選此處 【必讀文章】EOS期現套利,一週時間,15%無風險收益
美麗的回測 —— 教你定量計算過擬合概率
作者:石川,量信創始合夥人,清華大學學士、碩士,麻省理工學院博士;精通各種概率模型和統計方法,擅長不確定性隨機系統的建模及優化。知乎專欄:https://zhuanlan.zhihu.com/mitcshi。 摘要:金融資料的信噪比很低,使得過擬合成為回測中的必然。本文介紹一個量化分析框架,它可