決策樹(shù)算法: 量化選股案例
來(lái)源:Stata與風(fēng)險(xiǎn)管理
作者:首都經(jīng)濟(jì)貿(mào)易大學(xué)
金融學(xué)院
田文濤
郵箱:tianwentao1999@163.com
什么是決策樹(shù)
- 如何做決策
eg:是否學(xué)習(xí)[1]? 二食、三食or華僑? If-Then算法? - 決策樹(shù)是仿樹(shù)結(jié)構(gòu)來(lái)進(jìn)行決策的

是否學(xué)習(xí)的決策過(guò)程
解決什么問(wèn)題
- 分類(lèi)問(wèn)題
- 訓(xùn)練集、測(cè)試集(7:3、6:4)
sklearn學(xué)習(xí)訓(xùn)練生成模型
測(cè)試集驗(yàn)證
- 評(píng)估指標(biāo):
| 混淆矩陣 | 預(yù)測(cè)為正樣本 | 預(yù)測(cè)為負(fù)樣本 |
|---|---|---|
| 實(shí)際為正樣本 | True Positive (TP) | False Negative (FN) |
| 實(shí)際為負(fù)樣本 | False Positive (FP) | True Negative (TN) |
準(zhǔn)確率(ACC)
精確度(PPV)
召回率(TPR、Recall)
特異度(TNR)
有關(guān)“樹(shù)”的基本概念
- 節(jié)點(diǎn)
根節(jié)點(diǎn)
內(nèi)部節(jié)點(diǎn)
葉節(jié)點(diǎn) - 深度

決策樹(shù)節(jié)點(diǎn)圖
如何構(gòu)造“樹(shù)”——三要素
- 屬性構(gòu)造
- 離散變量
二元屬性
多元屬性 - 連續(xù)變量
序數(shù)屬性
- 指標(biāo)度量
- 信息熵
的值越小,代表該樣本集
的純度越高。
- 信息增益
說(shuō)明
-- 假設(shè)屬性
有
個(gè)可能取值,用
對(duì)樣本集進(jìn)行劃分,就會(huì)產(chǎn)生
個(gè)分支節(jié)點(diǎn),
是第
個(gè)分支所包含的樣本。從而計(jì)算出用屬性
對(duì)樣本集
進(jìn)行劃分所獲得的信息增益。
-- 信息增益越大,用屬性對(duì)樣本進(jìn)行劃分的純度越高。
--選擇信息增益最大的屬性進(jìn)行劃分。
- 基尼系數(shù)
基尼系數(shù)越小,純度越高。
舉例:
label=0:5個(gè),label=1:5個(gè)
label=0:2個(gè),label=1:8個(gè)
label=0:0個(gè),label=1:10個(gè)
- 模型生成
- 在第一級(jí)節(jié)點(diǎn),尋求某個(gè)特征,按照該特征的標(biāo)準(zhǔn)(熵或者基尼系數(shù))進(jìn)行分組,分組后得到的純度最大
- 完成第一級(jí)節(jié)點(diǎn),在第二級(jí)節(jié)點(diǎn)上按照類(lèi)似的思路找特征
- 直到最后一個(gè)節(jié)點(diǎn),分類(lèi)完畢
算法實(shí)現(xiàn)
- 手動(dòng)造輪子
- 導(dǎo)入包
- 數(shù)據(jù)清洗
數(shù)據(jù)集劃分 - 函數(shù)定義
信息熵、信息增益、基尼系數(shù) - 結(jié)果輸出
- 調(diào)包俠
- 核心算法:
from sklearn.tree import DecisionTreeClassifier
tree=DecisionTreeClassifier(max_depth=2,criterion='gini')
tree.fit(X,y)
print("準(zhǔn)確度:",tree.score(X,y))
- 相關(guān)參數(shù):
max_depth
criterion - 具體實(shí)例(鳶尾花數(shù)據(jù)集)
from sklearn.datasets import load_iris,load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
import pydotplus
iris = load_iris( )
clf = DecisionTreeClassifier( )
clf_iris = clf.fit(iris.data,iris.target)
dot_Data = export_graphviz(clf_iris,out_file=None)
graph_iris = pydotplus.graph_from_dot_data(dot_Data)
graph_iris.write_pdf("./load_iris.pdf")

鳶尾花數(shù)據(jù)分類(lèi)結(jié)果
量化案例:股票購(gòu)買(mǎi)投資策略[2]
-
數(shù)據(jù)
數(shù)據(jù)集
說(shuō)明:標(biāo)黃的為測(cè)試集,標(biāo)紅的為模型訓(xùn)練結(jié)果。
- 代碼展示:
userpath('D:\4-Project\決策樹(shù)模型\DecisionTree2Demo')%設(shè)置路徑為存放CSV的位置
TrainInput=readtable('TrainInput.csv');%錄入訓(xùn)練集的輸入部分
TrainOutput=readtable('TrainOutput.csv');%錄入訓(xùn)練集的輸出部分
TestInput=readtable('TestInput.csv');%錄入測(cè)試集的輸入部分
TestOutput=readtable('TestOutput.csv');%錄入測(cè)試集的輸出部分
S=fitctree(TrainInput,TrainOutput,'MinParentSize',3);%建立模型,并存入S
view(S,'Mode','Graph')%繪制決策樹(shù)
InvestStrategy=S.predict(TestInput);%使用剛才建立的模型預(yù)測(cè)股票漲跌,漲就是買(mǎi),跌就是賣(mài),因此構(gòu)建了一個(gè)投資策略
ActualPriceChange=table2cell(TestOutput);%轉(zhuǎn)化TestOutput的數(shù)據(jù)格式(table格式)并存入變量ActualPriceChange(cell格式)
confusionmat(ActualPriceChange,InvestStrategy)%計(jì)算擬合值和真實(shí)值的混淆矩陣
-
結(jié)果展示:
決策結(jié)果
| 混淆矩陣 | 預(yù)測(cè)為正樣本 | 預(yù)測(cè)為負(fù)樣本 |
|---|---|---|
| 實(shí)際為正樣本 | 3 | 0 |
| 實(shí)際為負(fù)樣本 | 1 | 1 |
總結(jié)
- 決策樹(shù)定義
- 決策樹(shù)用途
- 決策樹(shù)構(gòu)造
- 決策樹(shù)量化應(yīng)用
決策樹(shù)前沿發(fā)展
- 經(jīng)典決策樹(shù):CLS、ID3、C4.5和CART樹(shù)(李強(qiáng),2006)
- 決策樹(shù)組合:RF(隨機(jī)森林)、ET(極端隨機(jī)樹(shù))、GBDT(梯度提升決策樹(shù))、XGB和LGB(李想,2017)
- 神經(jīng)網(wǎng)絡(luò):神經(jīng)支持決策樹(shù)(Wan A, et al,2020)
研究發(fā)現(xiàn)在保留決策樹(shù)可解釋性的同時(shí)取得了當(dāng)前神經(jīng)網(wǎng)絡(luò)才能達(dá)到的準(zhǔn)確率,比其他基于決策樹(shù)的圖像分類(lèi)方法高出了大約14%。
總結(jié)
- 決策樹(shù)定義
- 決策樹(shù)用途
- 決策樹(shù)構(gòu)造
- 決策樹(shù)量化應(yīng)用
- 決策樹(shù)前沿發(fā)展
-
案例來(lái)源于CSDN ?

