回測小報

引言

如果你經(jīng)過仔細思考認真研究終于產(chǎn)生了一個好想法(交易策略),當然恨不得立刻投入交易賺大錢岖寞。但是抡四,世間不如意十之八九,往往好想法并不一定產(chǎn)生好結(jié)果仗谆。市場并沒有按照預期的情況發(fā)展指巡,結(jié)果不但沒有賺還虧損不少。:-(

怎么才能在不虧損的情況下隶垮,先驗證下我們的交易策略是否有效藻雪?碼農(nóng)說,測試唄@晖獭(另一種驗證方法是“證明”勉耀,此處暫不涉及)

怎么測試?兩條路:

  1. 虛擬交易蹋偏,假投資便斥,好處是實際交易情況,不足是費時費力威始,而且大家都知道測試只能測試某些情況很難全覆蓋所有的情況椭住,就算虛擬交易多年勝利也不能保證之后的勝利。
  2. 拿過去的交易數(shù)據(jù)測試字逗,好處就是數(shù)據(jù)大覆蓋的可能情況多測試更全面京郑。另外宅广,就是快!迅速獲得驗證后些举,結(jié)果好的話就可以投入實際使用了跟狱!這就是回測。

兩種回測方式

回測分兩種:事件驅(qū)動回測户魏,向量化回測驶臊。兩種有什么不同呢?

  • 事件驅(qū)動回測一般一次處理一個事件(通常就是一個歷史數(shù)據(jù)叼丑,如日線中的一天數(shù)據(jù)关翎,實時交易中的一次報價)
  • 向量化回測則一次處理所有事件,對所有向量或矩陣數(shù)據(jù)進行同時計算鸠信。(在pandas中纵寝,向量就是Series,矩陣就是DataFrame

舉例

舉一個簡單的例子星立,我們的策略是在價格低于10元的時候買進爽茴,高于10元的時候賣出。假設(shè)我們有價格數(shù)據(jù)绰垂,想要確定哪天買入哪天賣出室奏。

data = {
    "2017-02-01": 10.07,
    "2017-02-02": 9.87,
    "2017-02-03": 9.91,
    "2017-02-04": 10.01
 }

如果使用事件驅(qū)動回測,我們循環(huán)遍歷每天的數(shù)據(jù)劲装,檢查價格因素:

for date, price in data.items():
    if price < 10:
        buy_signal = True
    else:
        buy_signal = False
    print(date, buy_signal)

結(jié)果顯示:

2017-02-01 False
2017-02-02 True
2017-02-03 True
2017-02-04 False

如果使用向量化回測胧沫,我們一次性檢查所有的價格以確定買賣信號:

import pandas as pd

prices = pd.Series(data)
buy_signals = prices < 10
buy_signals.head()

結(jié)果顯示:

2017-02-01 False
2017-02-02 True
2017-02-03 True
2017-02-04 False
dtype: bool

兩種回測的方式不同,產(chǎn)生的結(jié)果是相同的占业。

兩種回測方式的特點

向量化回測比事件驅(qū)動回測快得多

我們之所以做回測绒怨,一個非常重要的原因就是可以快速基于大量的歷史數(shù)據(jù)做策略測試。實際情況下纺酸,回測數(shù)據(jù)是非常大量的窖逗,而我們需要做測試的策略可能很多址否,對于每個策略需要調(diào)整的參數(shù)也可能很多餐蔬,所以,速度是可能是一個非常關(guān)鍵的考慮佑附。在高速的情況下樊诺,我們可以做大量的策略測試以尋找合適的策略。想象一下音同,如果我們一天可以跑人家100天甚至1000天的回測词爬,那效果......
做了一個實驗比較pyalgotrade和vector-bt的運行情況(實現(xiàn)了同樣的均線策略,跑同樣的數(shù)據(jù)集合):

from timeit import default_timer as timer

......此處忽略start策略的定義

t = timer()
strat.run()
print("done. %.4fs" % (timer() - t))

......此處忽略mybt的定義

t = timer()
a = mybt(rate_sr)
print("done. %.4fs" % (timer() - t))

結(jié)果如下:

記錄條目數(shù)量 pyalgotrade 耗時 vector-bt 耗時 耗時相對倍數(shù)
日線 111 0.0241s 0.0027s 9
分鐘線 26400 6.0542s 0.0103s 588
兩線倍數(shù) 237.8 251 3.8
- - - - -
日線 289 0.0783s 0.0026s 30
分鐘線 69360 16.0826s 0.0220s 731
兩線倍數(shù) 240 205 8.46

注:這里vector-bt沒有使用多核并行权均,從vector-bt的實驗情況可知使用多核并行可以獲得700倍的速度提升顿膨。

結(jié)論: 從結(jié)果可看出锅锨,事件驅(qū)動回測的處理時間和需要處理的數(shù)據(jù)條目數(shù)量成正比,符合預期恋沃;向量化回測處理300條數(shù)據(jù)的情況下必搞,比事件驅(qū)動回測快30倍,而且和數(shù)據(jù)規(guī)模不成正比囊咏,70000條數(shù)據(jù)的情況下恕洲,比事件驅(qū)動回測快700倍!如果需要批量處理數(shù)據(jù)的情況梅割,使用多核并行霜第,700*700=490000倍速度!OMG户辞,我的判斷沒錯泌类!

向量化回測適合統(tǒng)計和機器學習算法

絕大部分統(tǒng)計和機器學習算法都基于向量或矩陣數(shù)據(jù)。事件驅(qū)動回測一次處理一個數(shù)據(jù)的方式無法適用這些先進的算法咆课,而向量化回測正好合適末誓。

事件驅(qū)動回測適合初學者或者非程序猿

事件驅(qū)動回測一般接口比較簡單,多數(shù)情況下只要給出 OnBar/OnTick 之類的函數(shù)以定義買入賣出條件和動作就可以了书蚪,所以方便使用喇澡。
因為使用的人多,所以能夠找到的文檔也多殊校,所以更方便使用晴玖。然后......循環(huán)回復......

向量化回測則相對復雜,需要懂得向量運算为流,懂的和用的人就少呕屎,就沒有啥文檔指導使用,然后......呵呵

切換到實際交易

對于事件驅(qū)動回測敬察,需要把歷史數(shù)據(jù)源切換為實時市場數(shù)據(jù)源秀睛,再把虛擬買賣換成實際交易接口就可以了。

對于向量化回測莲祸,需要做一次即時回測蹂安,然后拿交易信號向量的最后一行去交易就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锐帜,一起剝皮案震驚了整個濱河市田盈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缴阎,老刑警劉巖允瞧,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡述暂,警方通過查閱死者的電腦和手機痹升,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畦韭,“玉大人视卢,你說我怎么就攤上這事±韧眨” “怎么了据过?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妒挎。 經(jīng)常有香客問我绳锅,道長,這世上最難降的妖魔是什么酝掩? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任鳞芙,我火速辦了婚禮,結(jié)果婚禮上期虾,老公的妹妹穿的比我還像新娘原朝。我一直安慰自己,他們只是感情好镶苞,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布喳坠。 她就那樣靜靜地躺著,像睡著了一般茂蚓。 火紅的嫁衣襯著肌膚如雪壕鹉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天聋涨,我揣著相機與錄音晾浴,去河邊找鬼。 笑死牍白,一個胖子當著我的面吹牛脊凰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茂腥,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狸涌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了础芍?” 一聲冷哼從身側(cè)響起杈抢,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤数尿,失蹤者是張志新(化名)和其女友劉穎仑性,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體右蹦,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡诊杆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年歼捐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晨汹。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡豹储,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淘这,到底是詐尸還是另有隱情剥扣,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布铝穷,位于F島的核電站钠怯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏曙聂。R本人自食惡果不足惜晦炊,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宁脊。 院中可真熱鬧断国,春花似錦、人聲如沸榆苞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坐漏。三九已至宋彼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仙畦,已是汗流浹背输涕。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慨畸,地道東北人莱坎。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像寸士,于是被迫代替她去往敵國和親檐什。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容