黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

(三)使用Python進(jìn)行交易的隨機(jī)森林算法

系統(tǒng) 2161 0

作者:chen_h
微信號(hào) & QQ:862251340
微信公眾號(hào):coderpai


(一)機(jī)器學(xué)習(xí)中的集成學(xué)習(xí)入門(mén)

(二)bagging 方法

(三)使用Python進(jìn)行交易的隨機(jī)森林算法


在這篇文章中,我們將討論什么是隨機(jī)森林,他們?nèi)绾喂ぷ鳎麄內(nèi)绾螏椭朔Q策樹(shù)的局限性。

隨著機(jī)器學(xué)習(xí)及其技術(shù)在當(dāng)前環(huán)境中的蓬勃發(fā)展,越來(lái)越多的算法在各種領(lǐng)域中找到應(yīng)用。 機(jī)器學(xué)習(xí)各個(gè)算法的工作彼此不同,其中一個(gè)算法對(duì)于某個(gè)問(wèn)題可能比另一個(gè)算法更好。 機(jī)器學(xué)習(xí)算法不斷更新和升級(jí),以擴(kuò)大其應(yīng)用范圍并最大限度地減少其缺點(diǎn)。

隨機(jī)森林算法就是這樣一種算法,旨在克服決策樹(shù)的局限性。在這篇博客中,我們將介紹它。在直接介紹隨機(jī)森林之前,讓我們首先簡(jiǎn)要了解決策樹(shù)及其工作原理。

什么是決策樹(shù)?

正如其名稱(chēng)所示,決策樹(shù)具有分層或者樹(shù)狀結(jié)構(gòu),其分支充當(dāng)節(jié)點(diǎn)。我們可以通過(guò)遍歷這些節(jié)點(diǎn)來(lái)做出某個(gè)決策,這些節(jié)點(diǎn)通過(guò)數(shù)據(jù)特征進(jìn)行參數(shù)選擇。
但是,決策樹(shù)存在過(guò)度擬合的問(wèn)題。 過(guò)度擬合通常在樹(shù)中添加越來(lái)越多的節(jié)點(diǎn)來(lái)增加樹(shù)內(nèi)的特異性以達(dá)到某個(gè)結(jié)論,從而增加樹(shù)的深度并使其更復(fù)雜。

此外,在本博客中,我們將了解 Random Forest 如何幫助克服決策樹(shù)的這一缺點(diǎn)。

什么是隨機(jī)森林?

隨機(jī)森林是一種使用集成方法的監(jiān)督分類(lèi)機(jī)器學(xué)習(xí)算法。 簡(jiǎn)而言之,隨機(jī)森林由眾多決策樹(shù)組成,有助于解決決策樹(shù)過(guò)度擬合的問(wèn)題。 通過(guò)從給定數(shù)據(jù)集中選擇隨機(jī)特征來(lái)隨機(jī)構(gòu)造這些決策樹(shù)。
隨機(jī)森林根據(jù)從決策樹(shù)收到的最大投票數(shù)得出決策或預(yù)測(cè)。 通過(guò)眾多決策樹(shù)達(dá)到最大次數(shù)的結(jié)果被隨機(jī)森林視為最終結(jié)果。

隨機(jī)森林的工作原理

隨機(jī)森林基于集成學(xué)習(xí)技術(shù),簡(jiǎn)單地表示一個(gè)組合或集合,在這種情況下,它是決策樹(shù)的集合,一起稱(chēng)為隨機(jī)森林。集合模型的準(zhǔn)確性優(yōu)于單個(gè)模型的準(zhǔn)確性,因?yàn)樗鼌R總了單個(gè)模型的結(jié)果并提供了最終結(jié)果。
那么,如何從數(shù)據(jù)集中選擇特征以構(gòu)建隨機(jī)森林的決策樹(shù)呢?

我們使用稱(chēng)為 bagging 的方法隨機(jī)選擇特征。根據(jù)數(shù)據(jù)集中可用的特征集,通過(guò)選擇具有替換的隨機(jī)特征來(lái)創(chuàng)建許多訓(xùn)練子集。這意味著可以在不同的訓(xùn)練子集中同時(shí)重復(fù)一個(gè)特征。

例如,如果數(shù)據(jù)集包含20個(gè)特征,并且要選擇5個(gè)特征的子集來(lái)構(gòu)建不同的決策樹(shù),則將隨機(jī)選擇這5個(gè)特征,并且任何特征都可以是多個(gè)子集的一部分。這確保了隨機(jī)性,使樹(shù)之間的相關(guān)性更小,從而克服了過(guò)度擬合的問(wèn)題。

選擇特征后,將根據(jù)最佳分割構(gòu)建樹(shù)。每棵樹(shù)都給出一個(gè)輸出,該輸出被認(rèn)為是從該樹(shù)到給定輸出的“投票”。輸出

接收最大’投票’的隨機(jī)森林選擇最終輸出/結(jié)果,或者在連續(xù)變量的情況下,所有輸出的平均值被視為最終輸出。

(三)使用Python進(jìn)行交易的隨機(jī)森林算法_第1張圖片

例如,在上圖中,我們可以觀察到每個(gè)決策樹(shù)已經(jīng)投票或者預(yù)測(cè)了特定的類(lèi)別。隨機(jī)森林選擇的最終輸出或類(lèi)別將是N類(lèi),因?yàn)樗哂卸鄶?shù)投票或者是四個(gè)決策樹(shù)中的兩個(gè)預(yù)測(cè)輸出。

隨機(jī)森林的 Python 代碼

在此代碼中,我們將創(chuàng)建一個(gè)隨機(jī)森林分類(lèi)器并對(duì)其進(jìn)行訓(xùn)練,并且給出每日回報(bào)。

導(dǎo)入庫(kù)
            
              
                import
              
               quantrautil 
              
                as
              
               q

              
                import
              
               numpy 
              
                as
              
               np

              
                from
              
               sklearn
              
                .
              
              ensemble 
              
                import
              
               RandomForestClassifier

            
          

上面導(dǎo)入的庫(kù)將按照如下方式使用:

  • quantrautil:這將用于從雅虎 finance 中獲取 BAC 股票的價(jià)格數(shù)據(jù);
  • numpy:對(duì)BAC股票價(jià)格執(zhí)行數(shù)據(jù)操作,以計(jì)算輸入特征和輸出結(jié)果。如果你想要了解更多關(guān)于 numpy 的信息,可以查看 numpy 官網(wǎng);
  • Sklearn:sklearn 是很多工具和機(jī)器學(xué)習(xí)模型的集合,你可以很自由使用;
  • RandomForestClassifier:將用于創(chuàng)建 Random Forest 分類(lèi)器模型;
獲取數(shù)據(jù)

下一步是從 quantrautil 導(dǎo)入 BAC 庫(kù)存的價(jià)格數(shù)據(jù)。quantrautil 的 get_data 函數(shù)用于獲取從 2000 年1月1日到2019年1月31日的 BAC 數(shù)據(jù)。如下所示:

            
              data 
              
                =
              
               q
              
                .
              
              get_data
              
                (
              
              
                'BAC'
              
              
                ,
              
              
                '2000-1-1'
              
              
                ,
              
              
                '2019-2-1'
              
              
                )
              
              
                print
              
              
                (
              
              data
              
                .
              
              tail
              
                (
              
              
                )
              
              
                )
              
            
          
            
              [*********************100%***********************]  1 of 1 downloaded
             Open   High    Low  Close  Adj Close     Volume Source
Date                                                               
2019-01-25  29.28  29.72  29.14  29.58      29.27   72182100  Yahoo
2019-01-28  29.32  29.67  29.29  29.63      29.32   59963800  Yahoo
2019-01-29  29.54  29.70  29.34  29.39      29.08   51451900  Yahoo
2019-01-30  29.42  29.47  28.95  29.07      28.77   66475800  Yahoo
2019-01-31  28.75  28.84  27.98  28.47      28.17  100201200  Yahoo

            
          
創(chuàng)建輸入和輸出數(shù)據(jù)

在這一步中,我將創(chuàng)建輸入和輸出變量。

輸入變量:我使用 (open-close)/open ,(High-Low)/Low,過(guò)去5議案的標(biāo)準(zhǔn)差(std_5),過(guò)去五天的平均值(ret_5)。

輸出變量:如果明天的收盤(pán)價(jià)大于今天的收盤(pán)價(jià),則輸出變量設(shè)置為 1 ,否則設(shè)置為 -1。1 表示購(gòu)買(mǎi)股票,-1表示賣(mài)出股票。

輸入和輸出數(shù)據(jù)的特征完全是隨機(jī)的,如果你有興趣可以查看 wiki 。

            
              
                # Features construction 
              
              
data
              
                [
              
              
                'Open-Close'
              
              
                ]
              
              
                =
              
              
                (
              
              data
              
                .
              
              Open 
              
                -
              
               data
              
                .
              
              Close
              
                )
              
              
                /
              
              data
              
                .
              
              Open
data
              
                [
              
              
                'High-Low'
              
              
                ]
              
              
                =
              
              
                (
              
              data
              
                .
              
              High 
              
                -
              
               data
              
                .
              
              Low
              
                )
              
              
                /
              
              data
              
                .
              
              Low
data
              
                [
              
              
                'percent_change'
              
              
                ]
              
              
                =
              
               data
              
                [
              
              
                'Adj Close'
              
              
                ]
              
              
                .
              
              pct_change
              
                (
              
              
                )
              
              
data
              
                [
              
              
                'std_5'
              
              
                ]
              
              
                =
              
               data
              
                [
              
              
                'percent_change'
              
              
                ]
              
              
                .
              
              rolling
              
                (
              
              
                5
              
              
                )
              
              
                .
              
              std
              
                (
              
              
                )
              
              
data
              
                [
              
              
                'ret_5'
              
              
                ]
              
              
                =
              
               data
              
                [
              
              
                'percent_change'
              
              
                ]
              
              
                .
              
              rolling
              
                (
              
              
                5
              
              
                )
              
              
                .
              
              mean
              
                (
              
              
                )
              
              
data
              
                .
              
              dropna
              
                (
              
              inplace
              
                =
              
              
                True
              
              
                )
              
              
                # X is the input variable
              
              

X 
              
                =
              
               data
              
                [
              
              
                [
              
              
                'Open-Close'
              
              
                ,
              
              
                'High-Low'
              
              
                ,
              
              
                'std_5'
              
              
                ,
              
              
                'ret_5'
              
              
                ]
              
              
                ]
              
              
                # Y is the target or output variable
              
              

y 
              
                =
              
               np
              
                .
              
              where
              
                (
              
              data
              
                [
              
              
                'Adj Close'
              
              
                ]
              
              
                .
              
              shift
              
                (
              
              
                -
              
              
                1
              
              
                )
              
              
                >
              
               data
              
                [
              
              
                'Adj Close'
              
              
                ]
              
              
                ,
              
              
                1
              
              
                ,
              
              
                -
              
              
                1
              
              
                )
              
            
          
訓(xùn)練集合和測(cè)試集合的劃分

我們現(xiàn)在將數(shù)據(jù)集拆分為 75% 的訓(xùn)練數(shù)據(jù)集,25% 的測(cè)試數(shù)據(jù)集。

            
              
                # Total dataset length
              
              
dataset_length 
              
                =
              
               data
              
                .
              
              shape
              
                [
              
              
                0
              
              
                ]
              
              
                # Training dataset length
              
              

split 
              
                =
              
              
                int
              
              
                (
              
              dataset_length 
              
                *
              
              
                0.75
              
              
                )
              
              

split

            
          
            
              3597

            
          
            
              
                # Splitiing the X and y into train and test datasets
              
              
X_train
              
                ,
              
               X_test 
              
                =
              
               X
              
                [
              
              
                :
              
              split
              
                ]
              
              
                ,
              
               X
              
                [
              
              split
              
                :
              
              
                ]
              
              
y_train
              
                ,
              
               y_test 
              
                =
              
               y
              
                [
              
              
                :
              
              split
              
                ]
              
              
                ,
              
               y
              
                [
              
              split
              
                :
              
              
                ]
              
              
                # Print the size of the train and test dataset
              
              
                print
              
              
                (
              
              X_train
              
                .
              
              shape
              
                ,
              
               X_test
              
                .
              
              shape
              
                )
              
              
                print
              
              
                (
              
              y_train
              
                .
              
              shape
              
                ,
              
               y_test
              
                .
              
              shape
              
                )
              
            
          
            
              
                (
              
              
                3597
              
              
                ,
              
              
                4
              
              
                )
              
              
                (
              
              
                1199
              
              
                ,
              
              
                4
              
              
                )
              
              
                (
              
              
                3597
              
              
                ,
              
              
                )
              
              
                (
              
              
                1199
              
              
                ,
              
              
                )
              
            
          
訓(xùn)練機(jī)器學(xué)習(xí)模型

全部數(shù)據(jù)設(shè)置完畢!讓我們訓(xùn)練一個(gè)決策樹(shù)分類(lèi)器模型。樹(shù)中的 RandomForestClassifier 函數(shù)存儲(chǔ)在變量 clf 中,然后使用 X_train 和 y_train 數(shù)據(jù)集作為參數(shù)調(diào)用 fit 方法,以便分類(lèi)器模型可以學(xué)習(xí)輸入和輸出之間的關(guān)系。

            
              clf 
              
                =
              
               RandomForestClassifier
              
                (
              
              random_state
              
                =
              
              
                5
              
              
                )
              
            
          
            
              
                # Create the model on train dataset
              
              
model 
              
                =
              
               clf
              
                .
              
              fit
              
                (
              
              X_train
              
                ,
              
               y_train
              
                )
              
            
          
            
              
                from
              
               sklearn
              
                .
              
              metrics 
              
                import
              
               accuracy_score

              
                print
              
              
                (
              
              
                'Correct Prediction (%): '
              
              
                ,
              
               accuracy_score
              
                (
              
              y_test
              
                ,
              
               model
              
                .
              
              predict
              
                (
              
              X_test
              
                )
              
              
                ,
              
               normalize
              
                =
              
              
                True
              
              
                )
              
              
                *
              
              
                100.0
              
              
                )
              
            
          
            
              Correct Prediction 
              
                (
              
              
                %
              
              
                )
              
              
                :
              
              
                50.29190992493745
              
            
          
            
              
                # Run the code to view the classification report metrics
              
              
                from
              
               sklearn
              
                .
              
              metrics 
              
                import
              
               classification_report
report 
              
                =
              
               classification_report
              
                (
              
              y_test
              
                ,
              
               model
              
                .
              
              predict
              
                (
              
              X_test
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              report
              
                )
              
            
          
            
                           precision    recall  f1-score   support

         -1       0.50      0.61      0.55       594
          1       0.51      0.40      0.45       605

avg / total       0.50      0.50      0.50      1199

            
          
策略回報(bào)
            
              data
              
                [
              
              
                'strategy_returns'
              
              
                ]
              
              
                =
              
               data
              
                .
              
              percent_change
              
                .
              
              shift
              
                (
              
              
                -
              
              
                1
              
              
                )
              
              
                *
              
               model
              
                .
              
              predict
              
                (
              
              X
              
                )
              
            
          
每日返回直方圖
            
              
                %
              
              matplotlib inline

              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt
data
              
                .
              
              strategy_returns
              
                [
              
              split
              
                :
              
              
                ]
              
              
                .
              
              hist
              
                (
              
              
                )
              
              
plt
              
                .
              
              xlabel
              
                (
              
              
                'Strategy returns (%)'
              
              
                )
              
              
plt
              
                .
              
              show
              
                (
              
              
                )
              
            
          

(三)使用Python進(jìn)行交易的隨機(jī)森林算法_第2張圖片

策略回報(bào)
            
              
                (
              
              data
              
                .
              
              strategy_returns
              
                [
              
              split
              
                :
              
              
                ]
              
              
                +
              
              
                1
              
              
                )
              
              
                .
              
              cumprod
              
                (
              
              
                )
              
              
                .
              
              plot
              
                (
              
              
                )
              
              
plt
              
                .
              
              ylabel
              
                (
              
              
                'Strategy returns (%)'
              
              
                )
              
              
plt
              
                .
              
              show
              
                (
              
              
                )
              
            
          

(三)使用Python進(jìn)行交易的隨機(jī)森林算法_第3張圖片

圖中輸出是根據(jù)隨機(jī)森林分類(lèi)器的代碼顯示策略回報(bào)和每日回報(bào)。

優(yōu)點(diǎn)
  • 避免過(guò)度擬合
  • 可用于分類(lèi)和回歸
  • 可以處理缺失值
缺點(diǎn)
  • 大量的樹(shù)結(jié)構(gòu)會(huì)占用大量的空間和利用大量時(shí)間

在這篇博客中,我們學(xué)習(xí)了利用隨機(jī)森林來(lái)進(jìn)行簡(jiǎn)單的策略編寫(xiě)。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論