導(dǎo)讀:通常情況下,我們使用線性去回歸因子數(shù)據(jù),用來解釋因子對于收益的貢獻(xiàn)程度。但事實情況下,此類方法過于簡單,且市場收益并不一定與各類因子線性相關(guān),難以達(dá)到預(yù)期效果。眾所周知,樹是機(jī)器學(xué)習(xí)中的一類算法,決策樹算法則是其中的基礎(chǔ),而隨機(jī)森林則是利用多棵決策樹對樣本進(jìn)行訓(xùn)練并預(yù)測的一種算法。它們不同于支持向量機(jī),KNN等需要大量數(shù)據(jù)前處理,且能處理復(fù)雜問題。
一、 決策樹概念
分類決策樹的核心思想就是在一個數(shù)據(jù)集中找到一個最優(yōu)特征,然后從這個特征的選值中找一個最優(yōu)候選值,根據(jù)這個最優(yōu)候選值將數(shù)據(jù)集分為兩個子數(shù)據(jù)集,然后遞歸上述操作,直到滿足指定條件為止。
決策樹示例圖
二、因子選取
我們從趨勢類,反趨勢類,量價指標(biāo),壓力支撐型,成交量,超買超賣,擺動型,強(qiáng)弱型,日期類10個維度共選取了39個技術(shù)因子作為特征值,并與橫截面下的未來收益做合并,以方便數(shù)據(jù)處理。
趨勢類 | bbi | 多空指數(shù) |
ma | 5日移動平均 |
expma | 5日指數(shù)移動平均數(shù) |
priceosc | 價格震蕩指數(shù) |
ddi | 方向標(biāo)準(zhǔn)差偏離指數(shù) |
反趨勢 | bias | 乖離率 |
cci | 順勢指標(biāo) |
dbcd | 異同離差乖離率 |
dpo | 區(qū)間震蕩線 |
kdj_k | 隨機(jī)指標(biāo)K值 |
量價指標(biāo) | mfi | 資金流向指標(biāo) |
obv | 能量潮 |
pvt | 量價趨勢指標(biāo) |
wvad | 威廉變異離散量 |
壓力支撐型 | bbiboll | BBI多空布林線 |
boll | 布林線MID |
cdp | 逆勢操作 |
env | ENV指標(biāo) |
mike | 麥克指標(biāo) |
成交量 | vr | 量比 |
vma | 量簡單移動平均 |
vmacd | 量指數(shù)平滑異同平均 |
vosc | 成交量震蕩 |
vstd | 成交量標(biāo)準(zhǔn)差 |
tapi | 加權(quán)指數(shù)成交值 |
超買超賣 | adtm | 動態(tài)買賣氣指標(biāo) |
擺動類 | mi | 動量指標(biāo) |
micd | 異同離差動力指數(shù) |
rc | 變化率指數(shù) |
rccd | 異同離差變化率指數(shù) |
srmi | SRMIMI修正指標(biāo) |
強(qiáng)弱型 | dptb | 大盤同步指標(biāo) |
jdqs | 階段強(qiáng)勢指標(biāo) |
jdrs | 階段弱勢指標(biāo) |
zdzb | 筑底指標(biāo) |
atr | 真實波幅 |
mass | 梅絲線 |
日期類 | up_n | 連漲天數(shù) |
down_n | 連跌天數(shù) |
技術(shù)因子列表
三、決策樹策略
我們選取的時間為2017-01-01到2019-01-21,這段時間基本處于熊市階段,我們使用train_test_split將樣本數(shù)據(jù)劃分為二,我們從中發(fā)現(xiàn)整體數(shù)據(jù)的正向樣本(即收益數(shù)據(jù)大于某特定值)為0.02347312703583062,而在測試集中的正向樣本為0.023768322475570033,兩者數(shù)據(jù)相似,與此同時,我們可以開始進(jìn)行訓(xùn)練數(shù)據(jù)的步驟。
clf=tree.DecisionTreeClassifier(criterion='gini',max_features='sqrt',max_depth=100,class_weight='balanced')clf.fit(x_train,y_train)
代碼展示
我們可以看到在criterion中我們選取了gini,這是基尼不純度,可以理解為對數(shù)據(jù)集進(jìn)行隨機(jī)分類,分類錯誤出現(xiàn)的概率的期望。其中數(shù)據(jù)純度越高,基尼不純度越低。
公式展示
其次,在max_features參數(shù),我們選取特征數(shù)量的sqrt作為節(jié)點分裂時使用的特征數(shù)量。在max_depth參數(shù),我們選取120作為基礎(chǔ)模型的最大深度,如果不選取,模型會進(jìn)行到最深部分,容易產(chǎn)生過擬合。在class_weight部分,即類別權(quán)重,由于正向樣本無論在整體數(shù)據(jù)還是測試數(shù)據(jù)都表現(xiàn)特別稀少,如果每個數(shù)據(jù)等權(quán),則不合適,故我們使用 'balanced',其表示為類別的權(quán)重與樣本所占比例成反比。
接下來,我們畫出特征值在訓(xùn)練時各個因子的重要程度對比圖,我們可以看出srmi和mfi指標(biāo)重要性極大。
因子的重要程度對比圖
緊接著我們開始基于訓(xùn)練集訓(xùn)練好的模型,使用決策樹對測試集的數(shù)據(jù)進(jìn)行驗證,我們從滬深300中選取相應(yīng)股票,并結(jié)合對比滬深300本身的指數(shù)凈值數(shù)據(jù),畫出相應(yīng)圖像。
data_300 = get_price(['000300.SH'], start_date, end_date, '1d', ['close'], True, None, is_panel=1)['close']data_300.columns=['close300']data_300['return300']=data_300['close300'].pct_change()data_300['net_value']=(1+data_300['return300']).cumprod()df_portfolio['HS300']=data_300.ix[df_portfolio.index,'net_value']df_portfolio[['strategy_return','HS300']].plot(figsize=(20,8))plt.title('Decision Tree Strategy',y=1.05,size=25)
代碼展示
我們對股票使用的方式是等權(quán)買入,并持有一段固定時間,下圖藍(lán)線表示決策樹策略凈值曲線,綠線表示為滬深300作為基準(zhǔn)的凈值曲線。
決策樹策略凈值曲線
四、 隨機(jī)森林策略
隨機(jī)森林是指利用多棵決策樹對樣本進(jìn)行訓(xùn)練并預(yù)測的一種算法,它是一種平均法得到的集成模型。也就是說隨機(jī)森林算法是一個包含多個決策樹的算法,其輸出的類別是由個別決策樹輸出的類別的眾樹來決定的,也就是說它要求的基礎(chǔ)模型,即多個決策樹模型,必須是低偏差,高方差的強(qiáng)模型。
隨機(jī)森林模型示意圖
我們依舊選取的時間為2017-01-01到2019-01-21。并開始進(jìn)行訓(xùn)練數(shù)據(jù)的步驟。其中,我們選擇20作為n_estimators的值,即基礎(chǔ)模型(決策樹)的數(shù)量。
clf_randomforest=RandomForestClassifier(n_estimators=20,criterion='gini',max_features='sqrt',max_depth=100,class_weight='balanced')clf_randomforest.fit(x_train,y_train)
代碼展示
我們在訓(xùn)練數(shù)據(jù)的同時,畫出特征值在訓(xùn)練時各個因子的重要程度對比圖,我們可以看出srmi、kdj_k、dpo和bias四個技術(shù)指標(biāo)重要性極大。
因子的重要程度對比圖
我們將訓(xùn)練好的隨機(jī)森林模型運(yùn)用到劃分出來的測試數(shù)據(jù)上進(jìn)行驗證,并相應(yīng)地畫出相關(guān)凈值曲線圖。
predict=clf_randomforest.predict(x_test)data_total.ix[x_test.index,'predict']=predictdata_holding=pd.DataFrame({i:data_total.predict.groupby(level=0).apply(lambda x:x.shift(i)) for i in range(1,6)})data_holding['total']=data_holding.sum(axis=1)data_total['flag_holding']=data_holding.total>0
代碼展示
我們對股票使用的方式是等權(quán)買入,并持有一段固定時間,下圖藍(lán)線表示隨機(jī)森林模型凈值曲線,綠線表示為滬深300作為基準(zhǔn)的凈值曲線。
隨機(jī)森林模型凈值曲線
結(jié)束語:無論在決策樹模型,還是在此基礎(chǔ)之上的隨機(jī)森林模型都可以利用多個技術(shù)面因子進(jìn)行有效選股判斷,但所選因子應(yīng)該來自于多個維度,以分散集中風(fēng)險。我們在實驗的過程中循環(huán)劃分訓(xùn)練和測試數(shù)據(jù),發(fā)現(xiàn)bias,srmi因子經(jīng)常表現(xiàn)突出,重要性明顯。策略表現(xiàn)也在18年以后有顯著超額收益。