午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

量化策略課第十關(guān)筆記

 skybook360 2022-12-14 發(fā)布于江蘇

在學(xué)習(xí) DQN 算法之前,先了解一下它所屬的分類——強化學(xué)習(xí)。

將強化學(xué)習(xí)和之前所學(xué)的有監(jiān)督學(xué)習(xí)做個對比:如果說有監(jiān)督學(xué)習(xí)是通過標(biāo)記來訓(xùn)練模型,強化學(xué)習(xí)則是通過獎勵來訓(xùn)練模型。

在強化學(xué)習(xí)中,機器基于環(huán)境做出行為,正確的行為能夠獲得獎勵。以獲得更多獎勵為目標(biāo),實現(xiàn)機器與環(huán)境的最優(yōu)互動。

做個類比,教狗子握手的時候,如果狗子正確握手,就能得到骨頭獎勵,不握手就沒有。倘若咬了主人一口,還會受到懲罰。長此以往,狗子為了得到更多骨頭,就能學(xué)會握手這個技能。

看似很直白,但這就是強化學(xué)習(xí)的原理,只不過要把狗子換成電腦。

強化學(xué)習(xí)之下有很多算法,它們的原理都是相同的——通過獎勵來訓(xùn)練模型。只是在實現(xiàn)方式和學(xué)習(xí)效率上各有不同。

理解了強化學(xué)習(xí)的原理后,再通過一個例子理解它和有監(jiān)督學(xué)習(xí)的區(qū)別。

還記得圍棋大師——AlphaGo 嗎?

有監(jiān)督學(xué)習(xí)就是給 AlphaGo 大量已經(jīng)標(biāo)記出最優(yōu)解的棋譜,告訴它在每個場景下的最優(yōu)落子位置,通過這種方式讓 AlphaGo 學(xué)習(xí)圍棋。

但是,棋局的走勢千變?nèi)f化,棋譜無法囊括所有情況。因此,強化學(xué)習(xí)試圖從另一個角度去解決這個問題。

強化學(xué)習(xí)讓 AlphaGo 不斷和對手下棋,如果一步棋對局勢有幫助,就給它獎勵;反之沒有獎勵,甚至受到懲罰。通過尋求更多獎勵,AlphaGo 就能掌握精湛的棋藝。

用圖片總結(jié)并對比了一下兩種方式的區(qū)別:

!
導(dǎo)入失敗
?

要素

在強化學(xué)習(xí)的過程中,會涉及六個要素:機器、環(huán)境、狀態(tài)、行為、獎勵、評論家。它們的關(guān)系如下圖所示:

!
導(dǎo)入失敗
?

繼續(xù)以 AlphaGo 為例,逐一講解它們的含義。

!
導(dǎo)入失敗
?

1)機器(Actor 或 Policy):是強化學(xué)習(xí)的訓(xùn)練對象,即決策模型,也就是 AlphaGo 。我們可以把它叫做機器或者策略,在算式中經(jīng)常用 π 來表示。

2)環(huán)境(Environment):和機器發(fā)生互動的環(huán)境。在 AlphaGo 的例子中,環(huán)境就是對弈場景,包括對手、圍棋規(guī)則等。

3)狀態(tài)(State 或 Observation):環(huán)境當(dāng)下所處的狀態(tài),可以理解為 AlphaGo 對弈時,每次落子前棋盤上的情況。

4)行為(Action):機器根據(jù)狀態(tài)所做出的行為,也就是 AlphaGo 根據(jù)當(dāng)前棋盤的情況,所選擇的落子位置。機器做出行為后,會進入下一個狀態(tài),并根據(jù)新的狀態(tài)再次做出行為,循環(huán)往復(fù),直到互動結(jié)束。

5)獎勵(Reward):機器的行為所獲得的獎勵。 對于 AlphaGo 來說,贏棋是一種正向獎勵,輸棋則是一種負(fù)面獎勵。

6)評論家(Critic):一套行為評價體系,根據(jù)每個行為的價值進行打分。

在一盤棋局中,贏棋是好,輸棋是壞,可是中間某一步棋的好壞很難評估,因此很難得到實時的獎勵。這時就需要評論家,它可以計算出一步棋對整盤棋的價值,為每一步棋打分,給出實時的獎勵。

用 AlphaGo 的例子,將這六個要素的關(guān)系串聯(lián)起來。

在對弈的環(huán)境中,AlphaGo 根據(jù)棋盤上的狀態(tài),做出落子行為,然后每盤棋的勝負(fù)獲得獎勵。模擬足夠多棋局后,評論家就可以通過計算預(yù)測出每步棋對整盤棋的價值,為其打分。

通過不斷訓(xùn)練,機器以贏更多局棋為目標(biāo),不斷更新優(yōu)化,成為一個圍棋大師。

分類

當(dāng)機器面對一個狀態(tài)時,可選的行為往往有很多。根據(jù)行為能否被全部列舉,可以將強化學(xué)習(xí)的場景分為兩類:離散場景和連續(xù)場景。

離散場景

離散指行為的個數(shù)有限或可數(shù)。一般來說,在離散場景下,可以把所有行為列舉出來。

下面,通過一個經(jīng)典游戲——坦克大戰(zhàn),進一步理解離散的含義:

!
導(dǎo)入失敗
?

在坦克大戰(zhàn)中,每個坦克可以做的行為是有限的、可數(shù)的,只有「向上、向下、向左、向右、開火」這五個動作,移動也只能一格一格地走。因此,如果你足夠的時間和耐心,一場游戲中的情況可以被全部列舉出來。

這種情況稱為離散。

在離散場景下,數(shù)據(jù)搜集的難度并不高(對計算機來說)。假如要訓(xùn)練一個智能坦克,可以把每個狀態(tài)下的所有行為列舉出來,用評論家為每個行為打分,通過選擇最高分的行為實現(xiàn)最優(yōu)互動。

因為需要評估每個行為的價值(Value),所以這種強化學(xué)習(xí)方法被稱為基于值(Value-Based)的方法,也可以被譯作基于價值的方法。

在基于值的方法下,有一個經(jīng)典算法,即本關(guān)學(xué)習(xí)的重點——DQN 算法。

連續(xù)場景

連續(xù)指在一定區(qū)間內(nèi)可以任意取值,相鄰兩個數(shù)值可以被無限分割。比如,從 0 到 1 之間,有 0.1、0.11、0.111、…

在強化學(xué)習(xí)的場景中,可以理解成機器的行為是連貫的。

比如模擬賽車的游戲,賽車的方向盤轉(zhuǎn)動角度可以在一定區(qū)間內(nèi)任意取值,角度之間可以無限分割。

!
導(dǎo)入失敗
?

在這種背景下,即便是計算機也無法窮舉出全部行為。因此,如果要訓(xùn)練一個智能駕駛員,基于值的方法就無法勝任。

這時需要用到另一種強化學(xué)習(xí)方法——基于策略(Policy-Based)的方法。它無需根據(jù)每個行為的價值來打分,可以很好地勝任連續(xù)場景。

DQN算法原理

概念

DQN 算法全稱 Deep Q Network,它以 Q-Learning 算法為基礎(chǔ),融合了神經(jīng)網(wǎng)絡(luò)(Neural Network),實現(xiàn)了更強大的強化學(xué)習(xí)功能。

Q-learning

Q-learning 也是一種基于值的強化學(xué)習(xí)算法,它在強化學(xué)習(xí)原理的基礎(chǔ)上,引入了一個概念——Q 值。

Q 值表示做出一個行為后能夠獲得的累計獎勵。它是算法模擬大量數(shù)據(jù)后,通過復(fù)雜的函數(shù)計算出來的。

并不需要深究具體計算過程,只需簡單地把 Q 值理解成評論家(Critic),它的大小表示每個行為的價值。一個行為的 Q 值越高,表示該行為能帶來的獎勵越多,越應(yīng)該被選擇。

在訓(xùn)練 Q-learning 算法時,需要用到以下三類數(shù)據(jù):

1) 環(huán)境的每一個狀態(tài),簡稱為 s(State);

2) 每個狀態(tài)下所有行為,簡稱為 a(Action);

3) 每個行為的 Q 值,簡稱為 Q。

總結(jié)一下,Q-learning 算法需要知道每個狀態(tài)(s)下,所有行為(a)的 Q 值。它的訓(xùn)練目標(biāo)是,讓機器在每個狀態(tài)(s)下都能做出 Q 值最大的行為(a),從而實現(xiàn)機器與環(huán)境的最優(yōu)交互。

神經(jīng)網(wǎng)絡(luò)

Q-learning 訓(xùn)練時需要用到狀態(tài)(s)和行為(a),以及它們所對應(yīng)的 Q 值。它用表格來儲存這三類數(shù)據(jù),如下圖所示:

!
導(dǎo)入失敗
?

可以這樣理解這張圖:在 狀態(tài) s1 下,行為 a1、a2、a3 的 Q 值分別是 1、0、2。因此 狀態(tài) s1下的最優(yōu)行為就是 a3。

可是,當(dāng)狀態(tài)和行為的數(shù)量非常龐大時,用表格儲存所有數(shù)據(jù)會占用非常多的資源。

比如下圍棋,棋盤一共有 361 個點位,每個點位有“黑”、“白”、“空”三種情況,因此整個棋盤的布局有 3 的 361 次方個狀態(tài)。用表格記錄所有 s 和 a,這張表會無比巨大。

這是 Q-learning 面對復(fù)雜場景時的局限。

但是,在機器學(xué)習(xí)中,剛好有一個算法,擅長解決各種復(fù)雜問題,那就是 神經(jīng)網(wǎng)絡(luò)(Neural Network)。

下圖是一張經(jīng)典的神經(jīng)網(wǎng)絡(luò)原理圖。最左邊一列稱為輸入層,最右邊一列為輸出層,中間統(tǒng)稱為隱藏層。神經(jīng)網(wǎng)絡(luò)的作用就是通過隱藏層來解釋輸入層與輸出層的關(guān)系。

!
導(dǎo)入失敗
?

可以將輸入層理解為高中數(shù)學(xué)函數(shù)里的 x,輸出層理解為 y,隱藏層就是一長串函數(shù)表達式。

不過,神經(jīng)網(wǎng)絡(luò)可比高中的數(shù)學(xué)函數(shù)復(fù)雜太多,無需深究它的細(xì)節(jié),可以簡單地把它想象成一個模擬大腦。

例如,現(xiàn)在有大量的人臉照片,需要根據(jù)年齡段,判斷照片上的人是兒童、青少年、青年、中年還是老年。

在這個場景中,所看到的照片就是輸入層,判斷結(jié)果就是輸出層,大腦的判斷過程就是隱藏層。

!
導(dǎo)入失敗
?

總結(jié)一下,神經(jīng)網(wǎng)絡(luò)就是通過算法來模擬大腦,解釋數(shù)據(jù)之間(輸入層、輸出層)關(guān)系的算法。隱藏層越多,可以解釋越復(fù)雜的數(shù)據(jù)。

Q-learning和神經(jīng)網(wǎng)絡(luò)的融合

既然 Q-learning 算法難以儲存龐大的數(shù)據(jù)量,神經(jīng)網(wǎng)絡(luò)幫它解決這個問題

神經(jīng)網(wǎng)絡(luò)的隱藏層可以找到 s、a、Q 之間的關(guān)系。根據(jù)這個關(guān)系,只要向神經(jīng)網(wǎng)絡(luò)中輸入 s,經(jīng)過分析計算,就能輸出對應(yīng)的 a 和 Q 值。

這樣一來,Q-Learning 就不再需要用巨大的表格儲存數(shù)據(jù),只需要知道狀態(tài)(s),就能用神經(jīng)網(wǎng)絡(luò)自動生成其余數(shù)據(jù)。這大大節(jié)省了 Q-Learning 所需的資源。

!
導(dǎo)入失敗
?

再拿 AlphaGo 做個類比,神經(jīng)網(wǎng)絡(luò)的應(yīng)用讓 AlphaGo 無需記憶所有棋譜,而是在學(xué)習(xí)一些經(jīng)典棋譜后,能夠根據(jù)棋盤上的狀態(tài),自動推演出每一步棋的結(jié)果。

Q-Learning 算法和神經(jīng)網(wǎng)絡(luò)的融合,大大提高了機器的學(xué)習(xí)效率,這個融合的產(chǎn)物就是 DQN 算法。

總結(jié)

DQN 算法是 Q-Learning 算法和神經(jīng)網(wǎng)絡(luò)算法的融合。Q-Learning 算法讓機器能根據(jù)狀態(tài)做出累計獎勵更多的行為,而神經(jīng)網(wǎng)絡(luò)則提高了數(shù)據(jù)儲存的效率。

利用DQN算法進行擇時

其實,量化交易和前面所講的下圍棋、玩游戲并沒有區(qū)別。可以將 DQN 模型放在投資環(huán)境中進行互動,訓(xùn)練出一個智能交易員。

其中:

1)機器所面對的狀態(tài)(s)就是每個交易日的市場信息;

2)機器能做的行為(s)就是買入、賣出或持有;

3)行為的Q 值就是每次交易所能帶來的累計收益。

因此,這個智能交易員的訓(xùn)練目標(biāo)就是:根據(jù)每個交易日的市場信息(狀態(tài)),決定買入、賣出或持有標(biāo)的(行為),使得在退場前獲得更多累計收益(Q 值)。

這其實就是量化交易中的擇時。將每個交易日的市場信息傳入 DQN 模型中,不斷訓(xùn)練,就能成長為一個擇時專家。

DQN 算法擇時的局限性

DQN 算法只能從買入、賣出和持有這三個行為中進行預(yù)測,但無法預(yù)測具體買賣多少。

原因很簡單,DQN 算法屬于基于值的方法,只能處理離散場景。

買入、賣出、持有,這是三個離散的行為。但涉及到具體倉位比例時,我可以買入 10% 的倉位,也可以買入 11%、11.1% 的倉位,這種行為是連續(xù)的。

所以,在使用 DQN 算法構(gòu)建量化策略時,它只能給出交易的“方向”,具體交易多少則需要手動設(shè)置。

DQN量化策略代碼講解

構(gòu)建策略的步驟

ForTrader 已經(jīng)內(nèi)嵌了 DQN 算法。

因此本環(huán)節(jié)要學(xué)的不是如何構(gòu)建 DQN 算法,而是如何使用 DQN 算法來構(gòu)建量化交易策略。

用 DQN 算法構(gòu)建策略,可以簡化成以下三個步驟。

!
導(dǎo)入失敗
?

第一步,在 DQN 算法開始訓(xùn)練前,進行一些基礎(chǔ)設(shè)置。

第二步不需要做任何操作,F(xiàn)orTrader 內(nèi)嵌的 DQN 算法會自動采集、處理數(shù)據(jù)并開始訓(xùn)練。訓(xùn)練完成后直接輸出每個交易日的最優(yōu)行為。

第三步,在進行交易決策時,不僅要考慮模型的預(yù)測結(jié)果,還要考慮賬戶的實際持倉情況。比如,即便 DQN 模型預(yù)測要賣出,但如果賬戶持倉不足,也無法進行交易。所以要進行額外的條件判斷。

策略代碼講解

指標(biāo)模塊

在指標(biāo)模塊,目的是為模型訓(xùn)練設(shè)置一些基礎(chǔ)參數(shù)。

參數(shù)有點多,根據(jù)作用可以分成三類:數(shù)據(jù)范圍相關(guān)參數(shù)、神經(jīng)網(wǎng)絡(luò)相關(guān)參數(shù)和交易相關(guān)參數(shù)。


數(shù)據(jù)范圍相關(guān)參數(shù)

通過 start_date、eval_date 和 end_date設(shè)置數(shù)據(jù)范圍。

在 DQN 算法中,一次完整的訓(xùn)練,需要用到三個數(shù)據(jù)集:訓(xùn)練集、驗證集和測試集。 這三個參數(shù)只和訓(xùn)練集與驗證集有關(guān):

!
導(dǎo)入失敗
?

其中,start_date 和 eval_date 之間是訓(xùn)練集;

eval_date 和 end_date 之間是驗證集;

而測試集的范圍就是在【條件設(shè)置】中設(shè)置的回測區(qū)間,無需用參數(shù)來設(shè)置。

在學(xué)習(xí) SVM 算法時,接觸了訓(xùn)練集和測試集的概念。在訓(xùn)練集中訓(xùn)練后的模型,可以直接放到測試集去檢驗效果(進行回測)。

但是,由于強化學(xué)習(xí)模型更加復(fù)雜,需要在訓(xùn)練集和測試集之間加一個中間步驟——驗證集。

作用是,由于強化學(xué)習(xí)的過程非常復(fù)雜,在訓(xùn)練模型時會產(chǎn)生很多個版本,算法需要從多個版本中選出效果最好的一版。

這個選優(yōu)的過程,就需要在驗證集中完成。選出最優(yōu)版本的模型后,再將它放到測試集中檢驗效果,即進行回測。

做個類比,可以將訓(xùn)練集理解為期末復(fù)習(xí),測試集是期末考試。而驗證集就是模擬考試,你可以在模擬考試中找到調(diào)整考試狀態(tài),找到最佳答題節(jié)奏。

為了讓回測結(jié)果更可靠,回測區(qū)間(即測試集)不可以與訓(xùn)練集(start_date 至 eval_date)有重合。因為模型本身就是根據(jù)訓(xùn)練集數(shù)據(jù)訓(xùn)練出來的,倘若用訓(xùn)練集的數(shù)據(jù)回測,很容易得出好結(jié)果,無法準(zhǔn)確反映模型的真實表現(xiàn)。

再提醒你一次,訓(xùn)練集、驗證集的區(qū)間用參數(shù)設(shè)置,測試集則在【條件設(shè)置】中設(shè)置,不要混淆啦。

!
導(dǎo)入失敗
?

神經(jīng)網(wǎng)絡(luò)相關(guān)參數(shù)

注意,這類參數(shù)涉及專業(yè)的神經(jīng)網(wǎng)絡(luò)知識,無需深究它們的算法含義,只需從量化策略的角度理解它們的用法即可。

1)hid_dim,表示神經(jīng)網(wǎng)絡(luò)隱藏層的維度。隱藏層的作用是尋找輸入層與輸出層之間的關(guān)系,隱藏層的維度越高,神經(jīng)網(wǎng)絡(luò)能處理的問題就越復(fù)雜。

!
導(dǎo)入失敗
?

基于經(jīng)驗,在 DQN 算法中將隱藏層維度設(shè)為 512(2 的 9 次方)是比較主流的做法。

2)learning_rate_q,表示神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)率。可以將強化學(xué)習(xí)的過程理解為機器一步一步向前更新的過程,學(xué)習(xí)率就表示向前的步長。

步長太大,盡管學(xué)得快,但會導(dǎo)致后期無法收斂于最優(yōu)解;步長太小,則會導(dǎo)致學(xué)得很慢,學(xué)到黃花菜都涼了。

在打高爾夫球的時候,揮桿越用力,球前進的步長就越大,雖然能讓球很快靠近洞口,但如果一直用力揮桿,球會一直在洞口附近反復(fù)橫跳,很難進洞。

相反,揮桿越輕,球前進的步長越小,球要雖然要花更長時間靠近洞口,但到達洞口附近后更容易進洞。

基于經(jīng)驗,可以在 DQN 算法中將學(xué)習(xí)率設(shè)為 0.0001。

3)break_epoch,表示將全部數(shù)據(jù)送到模型中進行訓(xùn)練的輪數(shù)。

在高考復(fù)習(xí)時,想要取得好成績,需要復(fù)習(xí)很多輪。第一輪先過一遍知識點,第二輪攻克重難點,第三輪刷重點題型、…。

訓(xùn)練模型也是同樣的道理,break_epoch = 7 就是指將全部數(shù)據(jù)送入模型中訓(xùn)練 7 輪,并且每輪訓(xùn)練都有不同的側(cè)重點。

4)repeat_times,表示每輪訓(xùn)練的重復(fù)次數(shù)。它和 break_epoch 比較類似,作用都是通過增加訓(xùn)練量讓機器學(xué)得更好。

還是以高考復(fù)習(xí)作類比,幫你理解它們的區(qū)別。雖然已經(jīng)將高考復(fù)習(xí)劃分成很多輪,但在每一輪復(fù)習(xí)中,每個知識點還是要反復(fù)背誦很多遍。

repeat_times 就等價于每輪復(fù)習(xí)中,反復(fù)背誦知識點的次數(shù)。

在 DQN 算法中,repeat_times 的取值范圍建議在 20 到 35 之間。

交易相關(guān)參數(shù)

buy_on_percent 和 sell_on_percent 指的是買賣比例。

前面提到過,DQN 算法無法預(yù)測買賣的倉位比例,需要手動設(shè)置。

buy_on_percent = 1 表示每次買入時,都使用全部資金;若buy_on_percent = 0.5,則每次只用 50% 的資金買入。

賣出同理。sell_on_percent = 1 表示每次賣出時,都賣出全部持倉;若 sell_on_percent = 0.5,則每次賣出 50% 的持倉。

至此已經(jīng)講完了所有的參數(shù)。

還需要將這些參數(shù)傳入給 DQN 算法。

DQN 算法的具體代碼都被封裝成了一個類,可以用 DQN()來調(diào)用它,然后將前面設(shè)置的參數(shù)一一對應(yīng)地傳入即可。

這些參數(shù)的取值可以影響訓(xùn)練效果。

參數(shù)有點多,用一張圖總結(jié)了它們的含義,以及調(diào)參思路:

!
導(dǎo)入失敗
?

擇時模塊

在講解擇時代碼前,先回顧一下第三步:交易判斷要做哪些事。

!
導(dǎo)入失敗
?

1)獲取 DQN 算法的預(yù)測結(jié)果,以及當(dāng)前的持倉規(guī)模;

2)根據(jù)二者的關(guān)系進行判斷,下達交易指令。

獲取模型的預(yù)測結(jié)果

通過 dqn.dqn_prediction[0] 就可以獲取模型預(yù)測出的最優(yōu)交易行為,以及訂單數(shù)量,命名為 size。

如果 size > 0,代表買入一定倉位,size < 0代表賣出一定倉位,size = 0 表示不需要交易。

要注意的是,由于 DQN 模型無法預(yù)測連續(xù)的行為。因此這里的訂單數(shù)量并不是模型預(yù)測的結(jié)果,而是根據(jù)指標(biāo)模塊所設(shè)置的參數(shù) buy_on_percent 和 sell_on_percent 確定的。

為了滿足 A 股市場的交易要求,因此需要將 size 轉(zhuǎn)換成 100 的整數(shù)倍。可以通過 int(size / 100) * 100 的方式實現(xiàn)這一點。

獲取當(dāng)前交易日的持倉規(guī)模,命名為 position。

至此,已經(jīng)獲取了所需數(shù)據(jù)。

接下來就要結(jié)合數(shù)據(jù)進行判斷,并下達交易指令了。

下達交易指令

先通過一張圖梳理一下判斷邏輯:

!
導(dǎo)入失敗
?

如果算法預(yù)測買入,即 size > 0,則下達買入指令,買入數(shù)量為 size。

這一步對應(yīng)擇時邏輯圖的最左邊一列:

!
導(dǎo)入失敗
?

如果當(dāng)前有持倉,且算法預(yù)測賣出。即 position > 0 且 size < 0 時,需要做進一步判斷。

如果當(dāng)前持倉規(guī)模大于預(yù)測賣出的數(shù)量,即 position > abs(size) 時,就按照預(yù)測的賣出數(shù)量賣出,即訂單數(shù)量為 size。

注意,這一由于 size < 0,所以要用 abs() 函數(shù)取它的絕對值,再進行比較。

這一步的判斷邏輯如下圖所示:

!
導(dǎo)入失敗
?

如果當(dāng)前持倉規(guī)模小于或等于預(yù)測賣出的數(shù)量,只好有多少賣多少,即執(zhí)行平倉。

!
導(dǎo)入失敗
?

由于其他情況的結(jié)果都是不執(zhí)行交易,因此可以省略。

初次回測結(jié)果

!
導(dǎo)入失敗
?

策略總收益率為 1.54%,跑贏了買入并持有收益,勉強能接受。

代碼執(zhí)行

指標(biāo)模塊代碼:

def indicators(context):
"""指標(biāo)"""
# 設(shè)置訓(xùn)練集起始時間
context.start_date = "2015-01-01"
# 設(shè)置驗證集起始時間
context.eval_date = "2018-07-01"
# 設(shè)置驗證集結(jié)束時間
context.end_date = "2020-01-01"
# 設(shè)置隱藏層維度
context.hid_dim = 512
# 設(shè)置買入倉位比例
context.buy_on_percent = 1
# 設(shè)置賣出倉位比例
context.sell_on_percent = 1
# 設(shè)置Q網(wǎng)絡(luò)學(xué)習(xí)率
context.learning_rate_q = 0.0001
# 設(shè)置訓(xùn)練epoch,即訓(xùn)練幾輪
context.break_epoch = 7
# 設(shè)置每輪訓(xùn)練的重復(fù)次數(shù)
context.repeat_times = 25
# 向DQN模型中傳入?yún)?shù)
context.dqn = DQN(start_date=context.start_date,
eval_date=context.eval_date,
end_date=context.end_date,
hid_dim=context.hid_dim,
buy_on_percent=context.buy_on_percent,
sell_on_percent=context.sell_on_percent,
learning_rate_q=context.learning_rate_q,
break_epoch=context.break_epoch,
repeat_times=context.repeat_times)

擇時模塊代碼:

def timing(context):
"""擇時"""
# 基于訓(xùn)練所得的DQN,獲取當(dāng)前交易日的預(yù)測交易規(guī)模
size = context.dqn.dqn_prediction[0]
size = int(size/100) * 100
# 獲取當(dāng)前持倉規(guī)模
position = context.getposition(context.data).size
# 如果預(yù)測交易規(guī)模大于0,出現(xiàn)買入信號
if size > 0:
# 發(fā)送買入指令
context.order = context.buy(size = size)
# 如果已持倉,且預(yù)測交易規(guī)模小于0,則需要進一步判斷
if position > 0 and size < 0:
# 如果持倉規(guī)模大于預(yù)測交易規(guī)模絕對值,出現(xiàn)賣出信號
if position > abs(size):
# 發(fā)送賣出指令
context.order = context.sell(size = abs(size))
# 如果持倉規(guī)模小于等于預(yù)測交易規(guī)模絕對值,出現(xiàn)平倉信號
else:
# 發(fā)送平倉指令
context.order = context.close()

DQN量化策略參數(shù)調(diào)優(yōu)

調(diào)參邏輯

在指標(biāo)模塊中,參數(shù)可以分成三類:數(shù)據(jù)范圍相關(guān)參數(shù)、神經(jīng)網(wǎng)絡(luò)相關(guān)參數(shù)、交易相關(guān)參數(shù)。

在講解這些參數(shù)含義的時候,已經(jīng)講過了它們的調(diào)參邏輯。先來回顧一下吧:

!
導(dǎo)入失敗
?

其中,數(shù)據(jù)范圍相關(guān)參數(shù)的作用最容易理解,它們決定了訓(xùn)練和檢驗?zāi)P蜁r所用的數(shù)據(jù)樣本量。一般來說,樣本量越大,有助于得出更好的結(jié)果。

而神經(jīng)網(wǎng)絡(luò)相關(guān)參數(shù)相對難懂一些。不過,正所謂“前人栽樹,后人乘涼”,站在巨人的肩膀上學(xué)習(xí)才真香。

業(yè)界已經(jīng)對 DQN 算法進行過大量研究。因此,不用漫無目的地調(diào)試參數(shù),可以基于經(jīng)驗進行取值。

至于交易相關(guān)參數(shù),可以明確 buy_on_percent和sell_on_percent 的取值范圍都在 0 到 1 之間。建議以 0.1 作為步長,逐個嘗試。

下面,就可以嘗試在 ForTrader 中進行參數(shù)調(diào)優(yōu)了。

嘗試調(diào)參

通過擴大訓(xùn)練集的數(shù)據(jù)范圍,可以擴大學(xué)習(xí)的樣本數(shù)量,讓模型學(xué)得更好。就好像考前復(fù)習(xí)時,刷過的題型越多,在正式考試中就越有把握。

不過,在選擇訓(xùn)練集時,需要注意數(shù)據(jù)的有效性。由于市場環(huán)境的變化,過于久遠(yuǎn)的的交易數(shù)據(jù)可能對當(dāng)下的投資不具備參考價值。

例如,2007 年 A 股市場發(fā)生過一次政策變化,如果囊括 2007 年以前的股票數(shù)據(jù),放入模型中訓(xùn)練,就如同讓學(xué)生按照已經(jīng)過時的考綱準(zhǔn)備考試,造成無效學(xué)習(xí)。

因此,不妨試試把訓(xùn)練集的起始時間提前到 2008-01-01。

!
導(dǎo)入失敗
?

將訓(xùn)練集擴大后,總收益率達到了 7.03%,收益相較原本的 1.54% 提升了很多。

思維導(dǎo)圖

!
導(dǎo)入失敗
?

提示:

本公司發(fā)布內(nèi)容均為市場公開信息,不構(gòu)成投資建議,投資者據(jù)此操作,風(fēng)險自擔(dān)。市場有風(fēng)險,投資需謹(jǐn)慎! 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多