第六章随机森林模型
本章将介绍集成学习模型,集成学习采用的其实就是这一思想:将多个模型组合在一起,从而产生更强大的模型。本章要讲解一个非常典型的集成学习模型-----随机森林模型,并通过一个金融领域的应用----股票涨跌预测模型来巩固所学知识。
提示:以下是本篇文章正文内容,下面案例可供参考
集成学习模型使用一系列弱学习器(也称基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。集成学习模型的常见算法有Bagging算法和Boosting算法。Bagging算法的典型机器学习模型为本章要讲的随机森林模型,而Boosting算法的典型机器学习模型则为下次要讲到的AdaBoost,GBDT、XGBoost和LightGBM模型。
Bagging 算法的原理类似投票,每一个弱学习器都有一票,最终根据所有弱学习的投票,按照“少数服从多数”的原则产生最终的预测结果。具体来说,在分类问题中是用n个弱学习器投票的方式获取最终的预测结果,在回归问题中则是取n个弱学习器的平均值作为最终结果。
随机森林是(Random Forest)一种经典的Bagging模型,其若学习器为决策树模型。随机森林会在原始数据集中随机抽样,构成n个不同的样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些决策树模型的平均值(针对回归模型)或者投票情况(针对分类模型)来获取最终结果。为了保证模型的泛化能力(或者说通用能力),随机森林模型在建立每棵树时,往往会遵循“数据随机”和“特征随机”这两个基本原则。
# 随机森林分类模型,弱学习器是分类决策树模型
from sklearn.ensemble import RandomForestClassifier
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [0, 0, 0, 1, 1]
model = RandomForestClassifier(n_estimators=10, random_state=123)
model.fit(X, y)
print(model.predict([[5, 5]]))
# 随机森林回归模型,弱学习器是回归决策树模型
from sklearn.ensemble import RandomForestRegressor
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [1, 2, 3, 4, 5]
model = RandomForestRegressor(n_estimators=10, random_state=123)
model.fit(X, y)
print(model.predict([[5, 5]]))
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tushare as ts
# 1.获取日线行情数据
df = ts.get_hist_data("000002",start='2018-01-01',end="2019-01-31")
# print(df.head())
# 2.获取分钟级别的数据
df = ts.get_hist_data("000002",ktype='5')
# print(df.head())
# 3.获取实时行情数据
df = ts.get_realtime_quotes("000002")
# print(df.head())
df = df[["code","name","price","bid","ask","volume","amount","time"]]
# print(df)
# 4.获取分笔数据
# 获取历史分笔数据,即每笔成交的数据
df = ts.get_tick_data("000002",date="2018-12-12",src="tt")
# print(df)
# 获取当日每笔数据
df = ts.get_today_ticks("000002");
# print(df)
# 获取指数数据
df = ts.get_index()
# print(df.head())
# 1.获取股票基本数据
df = ts.get_k_data("000002",start='2015-01-01',end="2019-12-31")
df = df.set_index('date')
# print(df.head())
# 2.生成简单衍生变量
df["close-open"] = (df["close"] - df["open"]) / df["open"]
df["high-low"] = (df["high"] - df["low"]) / df["low"]
df["pre_close"] = df["close"].shift(1)
df["price_change"] = df["close"] - df["pre_close"]
df["p_change"] = (df["close"]-df["pre_close"]) / df["pre_close"]*100
# print(df.head())
# 3.生成移动平均指标MA值
df["MA5"]=df["close"].rolling(5).mean()
df["MA10"]=df["close"].rolling(10).mean()
df.dropna(inplace=True) # 删除空值行,也可以写成df = df.dropna()
df["MA5"] = df["close"].sort_index().rolling(5).mean()
# print(df.head())
# 4.股票衍生变量生成库TA_lib的安装
import talib
# 5.用TA—lib库生成相对强弱指标RSI值
df["RSI"] = talib.RSI(df["close"],timeperiod=12)
RSI值能反映短期内股价涨势相对于跌势的强弱,帮助我们更更好地判断股价的涨跌趋势。RSI值越大,涨势相对于跌势越强,反之则涨势相对于跌势越弱。
# 6.用TA-lib库生成动量指标MOM值
df["MoM"] = talib.MOM(df["close"],timeperiod=5)
# MOM反映了一段时间内股价的涨跌速度
# 7.用TA-lib库生成指数移动平均值EMA
df["EMA12"] = talib.EMA(df["close"],timeperiod=12) # 12日指数移动平均值
df["EMA26"] = talib.EMA(df["close"],timeperiod=26) # 26日指数移动平均值
# EMA和移动平均指标MA值有点类型,不过计算公式更复杂。EMA是一种趋势指标。
# 8.用TA-lib库生成异同移动平均线MACD值
df["MACD"],df["MACDsignal"],df["MACDhist"] = talib.MACD(df["close"],fastperiod=6,slowperiod=12,signalperiod=9)
#MACD是股票是市场上常用指标,它是基于EMA值得衍生变量。
# 生成所有衍生变量数据并删除空值后,打印tail()查看表格的最后5行。
print(df.tail())
有了合适的数据之后,就可以进行模型的搭建了。本案例中的模型是根据多个特征进行搭建的,在量化金融领域称为多因子模型。股票数据是时间序列数据,与之相关的一些数据处理工作和之前所讲的模型稍有不同。下面先进行一些简单的数据处理工作,再进行模型搭建。
import tushare as ts # 引入股票基本数据相关库
import numpy as np # 引入科学计算相关库
import pandas as pd # 引入科学计算相关库
import talib # 引入股票衍生变量数据相关库
import matplotlib.pyplot as plt # 引入绘图相关库
from sklearn.ensemble import RandomForestClassifier # 引入分类决策树模型
from sklearn.metrics import accuracy_score # 引入预测准确度评分函数
# 1.股票基本数据获取
df = ts.get_k_data("000002",start='2015-01-01',end='2020-11-14')
df = df.set_index("date")
# 2.简单衍生变量数据构造
df["close-open"] = (df["close"] - df["open"]) / df["open"]
df["high-low"] = (df["high"] - df["low"]) / df["low"]
df["pre_close"] = df["close"].shift(1)
df["price_change"] = df["close"] - df["pre_close"]
df["p_change"] = (df["close"]-df["pre_close"]) / df["pre_close"]*100
# 3.移动平均线相关数据构造
df["MA5"] = df["close"].rolling(5).mean()
df["MA10"] = df["close"].rolling(10).mean()
df.dropna(inplace=True)
# 4.通过TA_lib库构造衍生变量数据
df["RSI"] = talib.RSI(df["close"],timeperiod=12)
df["MoM"] = talib.MOM(df["close"],timeperiod=5)
df["EMA12"] = talib.EMA(df["close"],timeperiod=12) # 12日指数移动平均值
df["EMA26"] = talib.EMA(df["close"],timeperiod=26) # 26日指数移动平均值
df["MACD"],df["MACDsignal"],df["MACDhist"] = talib.MACD(df["close"],fastperiod=6,slowperiod=12,signalperiod=9)
df.dropna(inplace=True)
X = df[["close","volume","close-open","MA5","MA10","high-low","RSI","MoM","EMA12","MACD","MACDsignal","MACDhist"]]
y = np.where(df["price_change"].shift(-1)>0,1,-1)
X_length = X.shape[0]
split = int(X_length * 0.5)
X_train,X_test = X[:split],X[split:]
y_train,y_test = y[:split],y[split:]
model = RandomForestClassifier(max_depth=3,n_estimators=10,min_samples_leaf=10,random_state=1)
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
a = pd.DataFrame()
a["预测值"] = list(y_pred)
a["实际值"] = list(y_test)
# 用predict_proba()函数可以预测属于各个分类的概率
y_pred_proba = model.predict_proba(X_test)
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred,y_test)
model.score(X_test,y_test)
features = X.columns
importances = model.feature_importances_
a = pd.DataFrame()
a["特征"] = features
a["特征重要性"] = importances
a = a.sort_values("特征重要性",ascending=False)
print(a)
这里主要用到了累乘函数cumprod()
X_test["prediction"] = model.predict(X_test)
X_test["p_change"] = (X_test["close"] - X_test["close"].shift(1)) / X_test["close"].shift(1)
X_test["origin"] = (X_test["p_change"]+1).cumprod()
X_test["strategy"] = (X_test["prediction"].shift(1) * X_test["p_change"]+1).cumprod()
X_test[["strategy","origin"]].dropna().plot()
plt.gcf().autofmt_xdate()
plt.show()
参考书籍:《Python大数据分析与机器学习商业案例实战》