這篇文章主要介紹“Python量化回測常見陷阱有哪些”,在日常操作中,相信很多人在Python量化回測常見陷阱有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python量化回測常見陷阱有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
網(wǎng)站設(shè)計(jì)制作過程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺管理系統(tǒng);成都網(wǎng)站建設(shè)、成都做網(wǎng)站收費(fèi)合理;免費(fèi)進(jìn)行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).我們是一家持續(xù)穩(wěn)定運(yùn)營了十多年的創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司。很多量化交易的朋友在指定策略時(shí)往往容易犯下這幾種類型的錯(cuò)誤:前視偏差、不設(shè)置滑點(diǎn)、無手續(xù)費(fèi)、過度優(yōu)化等。這些錯(cuò)誤可以使你在回測階段把不盈利策略變得盈利,但是在真正的交易中卻會(huì)造成災(zāi)難性的后果。
首先介紹下前視偏差。前視偏差是指在策略回測階段采取了未來的信息來決定之前的交易,而這些信息在實(shí)盤操作中是無法獲知的。這里我們提供幾個(gè)典型的案例來介紹下:
買入策略1:“當(dāng)天的收盤價(jià)突破前一天的最高價(jià),則利用當(dāng)天開盤價(jià)買入股票”,很明顯,在開盤價(jià)成交幾乎是不可能的事情了。
前視偏差是我們要極力避免的錯(cuò)誤。如何避免前視偏差?可以使用“滯后”的歷史數(shù)據(jù)來計(jì)算策略信號。滯后的數(shù)據(jù)意味著,在涉及到移動(dòng)平均值、最高價(jià)、最低價(jià)、成交量等指標(biāo)時(shí),只使用“上一”交易日的收盤數(shù)據(jù)。比如:
shift(1)是在index不變的情況下對序列的值向后移動(dòng)一個(gè)單位。目的是獲取昨天為止的最高/最低價(jià)格。這樣就能使用“滯后”的歷史數(shù)據(jù)來計(jì)算策略信號。
如果一個(gè)交易策略要求你利用信號觸發(fā)時(shí)的價(jià)格進(jìn)行交易,那么這個(gè)交易策略就存在偷價(jià)的情況。
很多人會(huì)低估偷價(jià)的危害性,事實(shí)上,固定點(diǎn)數(shù)的偷價(jià)相當(dāng)于在原本的資金曲線上疊加了一條斜率為正的直線(在每次交易都是固定手?jǐn)?shù)的情況下)。假設(shè)一年250個(gè)交易日,每個(gè)交易日均對一只長期保持10元的股票執(zhí)行一次100股的買賣,每次買賣都偷價(jià)1個(gè)tick(tick設(shè)置為1個(gè)點(diǎn),即0.1元),那么全年下來可以多獲利5000.1100 = 5000元,這甚至超越了你的本金(10*100=1000)。
然而,現(xiàn)實(shí)的情況是不但無法低于一個(gè)tick的價(jià)格成交,更多的反而是高于一個(gè)甚至多個(gè)tick的價(jià)格成交。原因很簡單,大多數(shù)趨勢交易者都會(huì)在某個(gè)關(guān)鍵點(diǎn)位建倉,競爭導(dǎo)致價(jià)格在這些關(guān)鍵位置形成劇烈波動(dòng),并且這種波動(dòng)通常是對程序化交易不利的波動(dòng)。所以在構(gòu)建一個(gè)頻率較高的交易系統(tǒng)的時(shí)候,更多是要考慮和解決滑點(diǎn)問題。
手續(xù)費(fèi)相當(dāng)于在原本的資金曲線上疊加了一條斜率為負(fù)的直線(在每次交易都是固定手?jǐn)?shù)的情況下)。策略進(jìn)行測試時(shí),如果不計(jì)入手續(xù)費(fèi),資金曲線可能會(huì)產(chǎn)生巨大差異,甚至不計(jì)手續(xù)費(fèi)時(shí)盈利的策略,在計(jì)入手續(xù)費(fèi)后可能產(chǎn)生虧損。
當(dāng)前股票交易費(fèi)用由三部分組成:傭金、印花稅、過戶費(fèi)(僅上海股票收?。?/p>
印花稅:成交金額的1‰ 。
過戶費(fèi):這是指股票成交后,更換戶名所需支付的費(fèi)用。此費(fèi)用按成交金額的0.02‰收取。
交易傭金:最高收費(fèi)為3‰,最低收費(fèi)5元。
假設(shè)你買入10000股,每股票價(jià)格為10元,以此為例,對其買入成本計(jì)算:
買入股票所用金額:10元/股×10000股=100000元;
過戶費(fèi):0.02‰×100000=2元;
交易傭金:100000×3‰=300元(按最高標(biāo)準(zhǔn)計(jì)算,正常情況下都小于這個(gè)值);
買入總成本:100000元+300元+2元=100302元(買入10000股,每股10元,所需總資金)
若以10.08每股賣出價(jià)格計(jì)算:
股票金額:10.08元/股×10000股=100800元;
印花稅:100800元×1‰=100.8元;
過戶費(fèi):0.002%×100800元≈2元;
交易傭金:100800元×3‰=302.4元;
賣出后收入:100800元-100.8元-2元-302.4元=100394.8元;
滑點(diǎn)是指觸發(fā)指令的價(jià)格和最終成交價(jià)格之間的差異,它是難免會(huì)發(fā)生的情況,通?;c(diǎn)產(chǎn)生的原因有以下兩類:
1.行情波動(dòng)劇烈、市場容量不夠等情況導(dǎo)致的
2.網(wǎng)絡(luò)延遲、交易平臺不穩(wěn)定等情況導(dǎo)致的
滑點(diǎn)是一個(gè)合格的交易策略必須充分考慮的因素。如果在一個(gè)交易策略中,將滑點(diǎn)數(shù)設(shè)置為0,即采用現(xiàn)價(jià)指令買賣證券其資金曲線就會(huì)優(yōu)于同一個(gè)滑點(diǎn)數(shù)不為0的策略。通常我們要在最極端的條件下去構(gòu)建和測試系統(tǒng),一般系統(tǒng)都是高于2個(gè)tick的滑點(diǎn)來構(gòu)建的。
接下來談?wù)勥^度優(yōu)化。過度優(yōu)化是指為了遷就歷史數(shù)據(jù)的噪音而將一個(gè)策略的參數(shù)或者規(guī)則反復(fù)優(yōu)化到最佳的情況。
假如要把某個(gè)策略的資金曲線做的非常出色,我們可以這么優(yōu)化:針對某段特定的行情進(jìn)行參數(shù)優(yōu)化,之后將分段行情對應(yīng)的資金曲線拼接起來,得到一個(gè)表現(xiàn)更優(yōu)秀的資金曲線。也可以指定過去某幾個(gè)表現(xiàn)較差的交易日不進(jìn)行交易。上述經(jīng)過加工的回測一定表現(xiàn)優(yōu)異,單純?yōu)榱俗非筚Y金曲線,這類策略模型僅僅適用于過去發(fā)生但未來不會(huì)再重現(xiàn)的歷史偶然事件,并不考慮是否適用于未來的行情。
避免過度優(yōu)化的有效辦法有以下幾個(gè):
一般而言,策略的規(guī)則越多,模型的參數(shù)越多,就越可能出現(xiàn)過度擬合問題。因此采用的參數(shù)越少,可以優(yōu)化的規(guī)則越少,自然過度優(yōu)化的情況就能夠得到很好的避免,并且,越少參數(shù)構(gòu)建的策略,往往越穩(wěn)健,無論其時(shí)效性或魯棒性均能超越眾多復(fù)雜的策略。
合理選擇樣本。有些策略覆蓋的股票品種太少,時(shí)間周期太短,不能充分展現(xiàn)策略效果。這些策略只能用于個(gè)別品種上,或者在更長時(shí)間周期上的資金曲線可能表現(xiàn)的并沒有那么好。有些策略雖然覆蓋了較長的時(shí)間段,或較多的品種或市場,但僅僅覆蓋了一種類型的行情(例如一輪較長時(shí)間的大牛市)。這些策略在遇到截然不同的市場情況時(shí),表現(xiàn)可能會(huì)大相徑庭。
進(jìn)行樣本外測試。構(gòu)建策略模型時(shí),將歷史數(shù)據(jù)根據(jù)時(shí)間先后分為兩段。參數(shù)優(yōu)化和定性選擇使用前一段數(shù)據(jù)(訓(xùn)練集),策略模型的測試使用后一段數(shù)據(jù)(測試集)。兩段數(shù)據(jù)的大小要大致相等,若數(shù)據(jù)量不夠,則至少用三分之一的數(shù)據(jù)做測試。訓(xùn)練集的最小含量由樣本含量經(jīng)驗(yàn)規(guī)則確定。
到此,關(guān)于“Python量化回測常見陷阱有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!