如果沒有意外,你之前一直在使用前復權價格做回測,使用前復權價格回測存在未來函數(未卜先知,提前使用未來的數據),因此你的回測結果都是錯的。
Tell me why?
使用前復權價格,不論回測開始時間、結束時間是何時,使用的數據都是基於今天(回測當天)或某個時間的復權因子進行前復權獲得的價格,因此使用前復權價格進行回測,回測結果肯定有問題。示意圖如下:
不論歷史時刻1或歷史時刻2,拿到的數據都是基於未來某一天的前復權價格,使用這樣的數據存在未來函數(未來函數是回測最大的敵人之一)
真實價格回測(動態復權回測)是如何解決這個問題的?
使用真實價格回測模式,回測到歷史時刻1,使用歷史時刻1的真實價格撮合成交;如果需要復權,會使用的歷史時刻1的復權因子,對“歷史時刻1"之前的價格進行前復權,這樣有效避免了未來函數,因為回測全程都不可能使用未來的數據。
你可能沒有看懂,下面舉個例子:
如現有一只股票,股價一直沒有波動,只進行了拆分。
-
前復權回測模式
- 站在“歷史時刻3”看歷史數據:因為使用今天的復權因子,“歷史時刻3”之前的股價均為2;
- 站在“歷史時刻2”看歷史數據:因為使用今天的復權因子,“歷史時刻3”的股價是2;
- 站在“歷史時刻1”看歷史數據,因為使用今天的復權因子,“歷史時刻2”和“歷史時刻3”的股價是2;
-
真實價格回測模式
- 站在“歷史時刻3”看歷史數據:因為使用歷史時刻3的復權因子,“歷史時刻3”之前的股價均為8
- 站在“歷史時刻2”看歷史數據:因為使用歷史時刻2的復權因子,“歷史時刻3”的股價是4;
- 站在“歷史時刻1”看歷史數據:因為使用歷史時刻1的復權因子,“歷史時刻2”和“歷史時刻3”的股價是2;
因為使用了未來的復權因子,前復權回測模式,回測過程中使用的價格是不正確的。
下面再舉一個真實的例子,比較一下前復權回測模式和真實價格回測模式的區別
2007-01-30,波導股份的真實股價(綠色曲線)是低於格力電器(黑色曲線)的;但使用前復權價格,波導股份的價格會高於格力電器。
采用最簡單的交易思路,購買股價低的股票並持有,前復權模式會買入格力電器,真實價格回測模式會買入波導股份。
下面我們使用JoinQuant進行回測,根據2007-01-30當天格力電器與波導股份的收盤價,買入低價位股票並持有到現在。回測結果如下所示:
前復權回測模式的回測結果:
初始資金:100,000
策略收益:776.54%
滬深300收益:21.98%
最大回撤:64.98%
真實價格回測模式的回測結果:
初始資金:100,000
策略收益:78.35%
滬深300收益:21.98%
最大回撤:79.78%
由回測結果不難看出,前復權回測模式因為存在未來函數,結果是不准確的,使用前復權回測模式可能會讓你獲得非常高的收益,但實盤時,效果卻非常一般;
如果你想要獲得正確的回測結果,請使用真實價格回測。
作為最專業的量化交易平台,JoinQuant全球首推真實價格回測,從此,再也不用擔心回測結果不准確了。
如何開啟真實價格回測功能?
其實很簡單,只需一步即可搞定:
在initialize中使用set_option即可,如下所示:
def initialize(context):
set_option('use_real_price', True)