机器学习【系列】之第六章随机森林模型

机器学习【系列】之第六章随机森林模型

第六章随机森林模型


随机森林模型

  • 机器学习【系列】之第六章随机森林模型
  • 前言
  • 一、随机森林模型的原理和代码实现
    • 1.集成模型简介
    • 2.随机森林模型的基本原理
    • 3.随机森林模型的代码实现
  • 二、案例实战:股票涨跌预测模型
    • 1.股票基本数据获取
    • 2. 股票衍生变量生成
    • 3.多因子模型搭建
      • 1.引入需要用到的库
      • 2.获取数据
      • 3.提取特征变量和目标变量
      • 4.划分训练集和测试集
      • 5.搭建模型
    • 4.模型使用与评估
      • 1.预测下一天股价的涨跌情况
      • 2.模型准确度评估
      • 3.分析特征变量的特征重要性
    • 5.收益回测曲线绘制
  • 总结


前言

本章将介绍集成学习模型,集成学习采用的其实就是这一思想:将多个模型组合在一起,从而产生更强大的模型。本章要讲解一个非常典型的集成学习模型-----随机森林模型,并通过一个金融领域的应用----股票涨跌预测模型来巩固所学知识。


提示:以下是本篇文章正文内容,下面案例可供参考

一、随机森林模型的原理和代码实现

1.集成模型简介

集成学习模型使用一系列弱学习器(也称基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。集成学习模型的常见算法有Bagging算法和Boosting算法。Bagging算法的典型机器学习模型为本章要讲的随机森林模型,而Boosting算法的典型机器学习模型则为下次要讲到的AdaBoost,GBDT、XGBoost和LightGBM模型。

  • (1)Bagging算法

Bagging 算法的原理类似投票,每一个弱学习器都有一票,最终根据所有弱学习的投票,按照“少数服从多数”的原则产生最终的预测结果。具体来说,在分类问题中是用n个弱学习器投票的方式获取最终的预测结果,在回归问题中则是取n个弱学习器的平均值作为最终结果。

  • (2)Boosting算法
    Boosting算法的本质是将弱学习器提升为强学习器,它和Bagging算法的区别在于:Bagging算法对待所有的弱学习器都是一视同仁;而Boosting算法则会对弱学习器“区别对待”,通俗来讲就是注重“培养精英”和“重视错误”。
    培养精英”就是每一轮训练后对预测结果较为准确的弱学习器给予较大的权重,对表现不好的弱学习器则降低权重。这样在最终预测时,“优秀模型”的权重是大的,相当于它可以投出多票,而“一般模型”只能投出一票或不能投票。
    重视错误”就是在每一轮训练后改变训练集的权重或概率分布,通过提高在前一轮被弱学习器预测错误的样例的权值,降低前一轮被弱学习器预测正确的权值,来提高弱学习器对预测错误的数据的重视程度,从而提升模型的整体预测效果。

2.随机森林模型的基本原理

随机森林是(Random Forest)一种经典的Bagging模型,其若学习器为决策树模型。随机森林会在原始数据集中随机抽样,构成n个不同的样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些决策树模型的平均值(针对回归模型)或者投票情况(针对分类模型)来获取最终结果。为了保证模型的泛化能力(或者说通用能力),随机森林模型在建立每棵树时,往往会遵循“数据随机”和“特征随机”这两个基本原则。

  • 数据随机:从所有数据中有放回地随机抽取数据作为其中一个决策树模型的训练数据。例如:有1000个原始数据,有放回地抽取1000次,构成一组新的数据,用于训练一个决策树模型。
  • 特征随机:如果每个样本的特征维度为M,指定一个常数k

3.随机森林模型的代码实现

# 随机森林分类模型,弱学习器是分类决策树模型
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]]))

二、案例实战:股票涨跌预测模型

1.股票基本数据获取

#!/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())

2. 股票衍生变量生成

# 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())

3.多因子模型搭建

有了合适的数据之后,就可以进行模型的搭建了。本案例中的模型是根据多个特征进行搭建的,在量化金融领域称为多因子模型。股票数据是时间序列数据,与之相关的一些数据处理工作和之前所讲的模型稍有不同。下面先进行一些简单的数据处理工作,再进行模型搭建。

1.引入需要用到的库

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  # 引入预测准确度评分函数

2.获取数据


# 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)

3.提取特征变量和目标变量

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)

4.划分训练集和测试集

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:]

5.搭建模型

model = RandomForestClassifier(max_depth=3,n_estimators=10,min_samples_leaf=10,random_state=1)
model.fit(X_train,y_train)

4.模型使用与评估

1.预测下一天股价的涨跌情况

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)

2.模型准确度评估

from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred,y_test)

model.score(X_test,y_test)

3.分析特征变量的特征重要性

features = X.columns
importances = model.feature_importances_
a = pd.DataFrame()
a["特征"] = features
a["特征重要性"] = importances
a = a.sort_values("特征重要性",ascending=False)
print(a)

5.收益回测曲线绘制

这里主要用到了累乘函数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大数据分析与机器学习商业案例实战》

你可能感兴趣的:(机器学习)