上一節(jié)我們經(jīng)過(guò)簡(jiǎn)單優(yōu)化后實(shí)現(xiàn)了第一個(gè)盈利的策略,但我們依然需要思考一下策略參數(shù)是不是最優(yōu)的,是否還有優(yōu)化的空間? 本節(jié)我們將基于 freqtrade 的Hyperopt模塊,對(duì)我們的策略參數(shù)進(jìn)行優(yōu)化,Hyperopt本質(zhì)上還是基于scikit-optimize進(jìn)行開(kāi)發(fā)的。 我們先簡(jiǎn)單介紹一下原理,超參數(shù)優(yōu)化一般有三種方式: 1、網(wǎng)格搜索(Grid Search) 網(wǎng)格搜索是暴力搜索,在給定超參搜索空間內(nèi),嘗試所有超參組合,最后搜索出最優(yōu)的超參組合,主要缺點(diǎn)是耗時(shí),不適應(yīng)大量參數(shù)的窮舉,如下圖: ![]() 2、隨機(jī)搜索(Randomized Search) 隨機(jī)搜索是在搜索空間中采樣出超參組合,然后選出采樣組合中最優(yōu)的超參組合。隨機(jī)搜索的好處如下圖所示: ![]() 網(wǎng)格搜索和隨機(jī)搜索的對(duì)比[2] 網(wǎng)格搜索不會(huì)care這個(gè)參數(shù)是否為important parameter,對(duì)于所有參數(shù)一視同仁,窮舉所有的情況,尋找最優(yōu)參數(shù)組合;而隨機(jī)搜索會(huì)有更多的參數(shù)值參與到important parameter中,減少搜索范圍,提升搜索效率。 3、貝葉斯優(yōu)化(Bayesian Optimization) 調(diào)優(yōu)的目的是要找到一組最優(yōu)的超參組合,能使目標(biāo)函數(shù)f達(dá)到全局最小值。 ![]() 舉個(gè)例子,若學(xué)習(xí)率設(shè)置過(guò)大,模型可能會(huì)在代價(jià)函數(shù)的全局最優(yōu)點(diǎn)附近不斷來(lái)回震蕩,甚至跳出全局最優(yōu)點(diǎn),而設(shè)置過(guò)小,又可能會(huì)陷入局部最優(yōu),因此調(diào)學(xué)習(xí)率這一參數(shù),是為了讓模型能收斂到代價(jià)函數(shù)的全局最小值。可是在機(jī)器學(xué)習(xí)中,目標(biāo)函數(shù)f常是被稱作expensive blackbox function,計(jì)算開(kāi)銷大且不一定為凸函數(shù)。為此,貝葉斯優(yōu)化出現(xiàn)了,它特別適合針對(duì)expensive blackbox function找到全局最優(yōu)。 ![]() 隨機(jī)采樣10個(gè)點(diǎn)的目標(biāo)函數(shù)f(x)[4] 貝葉斯優(yōu)化使用了高斯過(guò)程(gasussian processes, GP)去構(gòu)建代理模型,基于給定的輸入和輸出,GP會(huì)推斷出一個(gè)模型(這里為代理模型)。假設(shè)我們從expensive step的f(x)采樣了4個(gè)點(diǎn),然后我們把這4個(gè)點(diǎn)交給GP,它會(huì)返回一個(gè)代理模型 ![]() 綠色實(shí)線就是GP的代理模型,綠色條帶是輸出分布的標(biāo)準(zhǔn)差(即為Uncertainty)。我們有了代理模型,后續(xù)我們?nèi)フ蚁乱粋€(gè)合適的超參值,就能帶入到計(jì)算開(kāi)銷相對(duì)較小的代理模型中,評(píng)估給定超參值的情況。 對(duì)上述原理感興趣的小伙伴,還可以再深入了解一下。 Code 實(shí)現(xiàn)我們HyperOpt的超參數(shù)調(diào)優(yōu)代碼:(相對(duì)比較簡(jiǎn)單) # Hyperoptable parametersbuy_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True)sell_rsi = IntParameter(low=50, high=100, default=70, space='sell', optimize=True, load=True)short_rsi = IntParameter(low=51, high=100, default=70, space='sell', optimize=True, load=True)exit_short_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True) 將買入?yún)?shù)變量替換至買入策略中: ![]() 同理將賣出參數(shù)變量替換至賣出策略中: ![]() 啟動(dòng)參數(shù)調(diào)優(yōu),設(shè)置為500epoch: docker-compose run --rm freqtrade hyperopt --config user_data/config.json --hyperopt-loss SharpeHyperOptLossDaily --strategy HyperIndexStrategy -e 500 ![]() 參數(shù)調(diào)優(yōu)結(jié)果 從截圖中可以看到,500 epoch運(yùn)行完成后,best結(jié)果是在第141個(gè)epoch中得到,最大收益率1.6%,最大回撤2.02%。給出最優(yōu)參數(shù)(買入、賣出、ROI、止損)組合如下: ![]() (吐槽:參數(shù)調(diào)優(yōu)太消耗CPU了,小機(jī)器調(diào)2次,2個(gè)晚上就沒(méi)了,傷不起。。。。。) 下一節(jié)準(zhǔn)備部署介紹一下如何將策略部署實(shí)盤。 |
|