邱吉爾 天擇君 3月22日
導讀:通常情況下,我們使用線性去回歸因子數(shù)據(jù),用來解釋因子對于收益的貢獻程度。但事實情況下,此類方法過于簡單,且市場收益并不一定與各類因子線性相關,難以達到預期效果。眾所周知,樹是機器學習中的一類算法,決策樹算法則是其中的基礎,而隨機森林則是利用多棵決策樹對樣本進行訓練并預測的一種算法。它們不同于支持向量機,KNN等需要大量數(shù)據(jù)前處理,且能處理復雜問題。
一、 決策樹概念
分類決策樹的核心思想就是在一個數(shù)據(jù)集中找到一個最優(yōu)特征,然后從這個特征的選值中找一個最優(yōu)候選值,根據(jù)這個最優(yōu)候選值將數(shù)據(jù)集分為兩個子數(shù)據(jù)集,然后遞歸上述操作,直到滿足指定條件為止。
決策樹示例圖
二、因子選取
我們從趨勢類,反趨勢類,量價指標,壓力支撐型,成交量,超買超賣,擺動型,強弱型,日期類10個維度共選取了39個技術因子作為特征值,并與橫截面下的未來收益做合并,以方便數(shù)據(jù)處理。
趨勢類bbi多空指數(shù)
ma5日移動平均
expma5日指數(shù)移動平均數(shù)
priceosc價格震蕩指數(shù)
ddi方向標準差偏離指數(shù)
反趨勢bias乖離率
cci順勢指標
dbcd異同離差乖離率
dpo區(qū)間震蕩線
kdj_k隨機指標K值
量價指標mfi資金流向指標
obv能量潮
pvt量價趨勢指標
wvad威廉變異離散量
壓力支撐型bbibollBBI多空布林線
boll布林線MID
cdp逆勢操作
envENV指標
mike麥克指標
成交量vr量比
vma量簡單移動平均
vmacd量指數(shù)平滑異同平均
vosc成交量震蕩
vstd成交量標準差
tapi加權指數(shù)成交值
超買超賣adtm動態(tài)買賣氣指標
擺動類mi動量指標
micd異同離差動力指數(shù)
rc變化率指數(shù)
rccd異同離差變化率指數(shù)
srmiSRMIMI修正指標
強弱型dptb大盤同步指標
jdqs階段強勢指標
jdrs階段弱勢指標
zdzb筑底指標
atr真實波幅
mass梅絲線
日期類up_n連漲天數(shù)
down_n連跌天數(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ù)相似,與此同時,我們可以開始進行訓練數(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ù)集進行隨機分類,分類錯誤出現(xiàn)的概率的期望。其中數(shù)據(jù)純度越高,基尼不純度越低。
公式展示
其次,在max_features參數(shù),我們選取特征數(shù)量的sqrt作為節(jié)點分裂時使用的特征數(shù)量。在max_depth參數(shù),我們選取120作為基礎模型的最大深度,如果不選取,模型會進行到最深部分,容易產生過擬合。在class_weight部分,即類別權重,由于正向樣本無論在整體數(shù)據(jù)還是測試數(shù)據(jù)都表現(xiàn)特別稀少,如果每個數(shù)據(jù)等權,則不合適,故我們使用 'balanced',其表示為類別的權重與樣本所占比例成反比。
接下來,我們畫出特征值在訓練時各個因子的重要程度對比圖,我們可以看出srmi和mfi指標重要性極大。
因子的重要程度對比圖
緊接著我們開始基于訓練集訓練好的模型,使用決策樹對測試集的數(shù)據(jù)進行驗證,我們從滬深300中選取相應股票,并結合對比滬深300本身的指數(shù)凈值數(shù)據(jù),畫出相應圖像。
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) 代碼展示
我們對股票使用的方式是等權買入,并持有一段固定時間,下圖藍線表示決策樹策略凈值曲線,綠線表示為滬深300作為基準的凈值曲線。
決策樹策略凈值曲線
四、 隨機森林策略
隨機森林是指利用多棵決策樹對樣本進行訓練并預測的一種算法,它是一種平均法得到的集成模型。也就是說隨機森林算法是一個包含多個決策樹的算法,其輸出的類別是由個別決策樹輸出的類別的眾樹來決定的,也就是說它要求的基礎模型,即多個決策樹模型,必須是低偏差,高方差的強模型。
隨機森林模型示意圖
我們依舊選取的時間為2017-01-01到2019-01-21。并開始進行訓練數(shù)據(jù)的步驟。其中,我們選擇20作為n_estimators的值,即基礎模型(決策樹)的數(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) 代碼展示
我們在訓練數(shù)據(jù)的同時,畫出特征值在訓練時各個因子的重要程度對比圖,我們可以看出srmi、kdj_k、dpo和bias四個技術指標重要性極大。
因子的重要程度對比圖
我們將訓練好的隨機森林模型運用到劃分出來的測試數(shù)據(jù)上進行驗證,并相應地畫出相關凈值曲線圖。
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 代碼展示
我們對股票使用的方式是等權買入,并持有一段固定時間,下圖藍線表示隨機森林模型凈值曲線,綠線表示為滬深300作為基準的凈值曲線。
隨機森林模型凈值曲線
結束語:無論在決策樹模型,還是在此基礎之上的隨機森林模型都可以利用多個技術面因子進行有效選股判斷,但所選因子應該來自于多個維度,以分散集中風險。我們在實驗的過程中循環(huán)劃分訓練和測試數(shù)據(jù),發(fā)現(xiàn)bias,srmi因子經常表現(xiàn)突出,重要性明顯。策略表現(xiàn)也在18年以后有顯著超額收益。