【数据挖掘与商务智能决策】第九章 随机森林模型

news2024/10/6 12:34:49

9.1.3 随机森林模型的代码实现

和决策树模型一样,随机森林模型既可以做分类分析,也可以做回归分析。

分别对应的模型为随机森林分类模型(RandomForestClassifier)及随机森林回归模型(RandomForestRegressor)。随机森林分类模型的基模型是分类决策树模型(详见5.1.2节),随机森林回归模型的基模型则是回归决策树模型(详见5.1.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]]))
[0]
# 随机森林回归模型简单代码演示如下所示:
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]]))
[2.8]

9.2 量化金融 - 股票数据获取

9.2.1 股票基本数据获取

这里介绍一个免费的财经数据Python接口包:Tushare库,通过它我们能够免费地调用历史行情数据来进行分析。其官方地址为:http://tushare.org/
如果是想查看股价行情数据,可以访问相应网址:http://tushare.org/trading.html

1.Tushare库的基本介绍

推荐通过PIP安装法来安装Tushare库,以Windows系统为例,具体方法是:通过Win + R组合键调出运行框,输入cmd后回车,然后在弹出框中输入pip install tushare后按一下Enter回车键的方法来进行安装。如果在1.2.3节讲到的Jupyter Notebook编辑器中安装的话,只需要在代码框中输入!pip instll tushare(注意是英文格式下的!)然后运行该行代码框即可。

(1) 获得日线行情数据

import tushare as ts
df = ts.get_hist_data('000002', start='2018-01-01', end='2019-01-31')
df.head()
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
openhighcloselowvolumeprice_changep_changema5ma10ma20v_ma5v_ma10v_ma20turnover
date

注意,如果不写开始及结束日期,直接写ts.get_hist_data(‘000002’)会默认调取从当天往前3年的数据。此外,上面代码也可以简写成:

df = ts.get_hist_data('000002','2018-01-01', '2019-01-31')
df.head()
openhighcloselowvolumeprice_changep_changema5ma10ma20v_ma5v_ma10v_ma20
date
2019-01-3127.3928.1527.7527.00411857.590.541.9926.80026.15325.641426579.02351523.31320269.20
2019-01-3026.7027.8227.2126.63592303.190.331.2326.33225.87525.457391193.72334927.14310794.00
2019-01-2925.9126.8826.8825.87368071.620.823.1525.95225.69625.292302102.48302443.43293529.36
2019-01-2826.2026.6226.0625.86308906.56-0.04-0.1525.65625.52425.139304355.52302512.15291266.32
2019-01-2525.5126.3526.1025.49451756.160.692.7125.57425.42025.008293674.18289949.63293446.08

补充知识点:get_k_data()函数

因为get_hist_data()函数不仅获得了股票的基本价格信息,还获取了价格变化、均线价格等衍生变量,所以它最多也只能调取当天往前3年的数据,如果想调取超过3年的日线级别数据,得用ts.get_k_data()函数,它只获取股价的基本数据,代码如下:

df = ts.get_k_data('000002', start='2000-01-01', end='2019-01-31')
df.head()
dateopenclosehighlowvolumecode
02000-01-040.5840.6140.6200.57245747.08000002
12000-01-050.6170.5990.6230.59646136.73000002
22000-01-060.5960.6270.6320.58771920.31000002
32000-01-070.6310.6550.6560.624136349.36000002
42000-01-100.6730.7210.7210.665142424.86000002

通过get_k_data()函数获取的数据没有像get_hist_data()函数那样将日期默认设为行索引,这里的日期还是作为一个普通的列(date列),如果想把这里的date列转为行索引,可以使用设置索引的set_index()函数,代码如下:

df = df.set_index('date')  # 或者写成:df.set_index('date', inplace=True)
df.head()
openclosehighlowvolumecode
date
2000-01-040.5840.6140.6200.57245747.08000002
2000-01-050.6170.5990.6230.59646136.73000002
2000-01-060.5960.6270.6320.58771920.31000002
2000-01-070.6310.6550.6560.624136349.36000002
2000-01-100.6730.7210.7210.665142424.86000002

(2) 获得分钟级别的数据

通过设置ktype参数可以获得分钟级别的数据,代码如下:

df = ts.get_hist_data('000002', ktype='5')
df.head()
openhighcloselowvolumeprice_changep_changema5ma10ma20v_ma5v_ma10v_ma20turnover
date
2020-01-03 15:00:0032.0632.0732.0632.053920.320.000.0032.12232.11332.035015322.717669.513041.00.00
2020-01-03 14:55:0032.1132.1132.0732.038377.52-0.04-0.1232.13632.10332.029019359.317817.513428.90.01
2020-01-03 14:50:0032.2032.2132.1232.1113402.00-0.08-0.2532.15432.09332.017523136.317962.013959.70.01
2020-01-03 14:45:0032.1632.2132.2032.1224470.900.040.1232.16032.07832.005024442.317137.913903.30.03
2020-01-03 14:40:0032.1332.1832.1632.1326443.000.030.0932.13232.05631.988023976.315128.113491.10.03

(3) 获得实时行情数据

通过如下代码可以实时取得股票当前报价和成交信息:

df = ts.get_realtime_quotes('000002') 
df
nameopenpre_closepricehighlowbidaskvolumeamount...a2_pa3_va3_pa4_va4_pa5_va5_pdatetimecode
0万 科A32.71032.56032.05032.81031.78032.04032.050805536292584309903.290...32.060300532.07011932.08034432.0902020-01-0315:00:03000002

1 rows × 33 columns

其运行结果就是当时的股价信息,如果收盘后运行的话获得的就是当日收盘价相关信息。如果觉得列数过多,可以通过DataFrame选取列的方法选取相应的列,代码如下:

df = df[['code','name','price','bid','ask','volume','amount','time']]
df
codenamepricebidaskvolumeamounttime
0000002万 科A32.05032.04032.050805536292584309903.29015:00:03

如果想同时获得多个股票代码的实时数据,可以用如下代码:

df = ts.get_realtime_quotes(['000002','000980','000981'])
df
nameopenpre_closepricehighlowbidaskvolumeamount...a2_pa3_va3_pa4_va4_pa5_va5_pdatetimecode
0万 科A32.71032.56032.05032.81031.78032.04032.050805536292584309903.290...32.060300532.07011932.08034432.0902020-01-0315:00:03000002
1众泰汽车3.0103.0003.0203.0402.9703.0103.0203249507497566972.190...3.03048493.04038403.05028113.0602020-01-0315:00:03000980
2ST银亿1.8701.8901.8101.9201.8001.8101.8204051867074744476.400...1.83029391.84041631.85014491.8602020-01-0315:00:03000981

3 rows × 33 columns

(4) 获得分笔数据

通过如下代码可以获得历史分笔数据,分笔数据也即每笔成交的信息:

df = ts.get_tick_data('000002', date='2018-12-12', src='tt')
df.head()
D:\Anaconda\Anaconda\lib\site-packages\tushare\stock\trading.py:182: FutureWarning: read_table is deprecated, use read_csv instead, passing sep='\t'.
  skiprows=[0])
timepricechangevolumeamounttype
009:25:0426.310.34607715988903卖盘
109:30:0026.330.02197518651买盘
209:30:0426.330.00462312173863卖盘
309:30:0626.340.013911030134买盘
409:30:0926.350.0132898664911买盘

(5) 获得指数信息

通过如下代码可以获得上证指数等指数信息:

df = ts.get_index()
df.head()  # 目前的tushare获得的指数的列名有点错乱-2020-01-04备注
codenamechangeopenprecloseclosehighlowvolumeamount
100上证指数3089.02200.333085.19763083.78583093.81923074.51780.02.899917e+110.0
200A股指数3236.70770.333232.68923231.18853241.74363221.49060.02.899041e+110.0
300B股指数261.05100.00261.1236261.7619261.7619260.24290.08.764934e+070.0
800综合指数3006.02950.392999.17443006.53183018.16992998.42660.06.499701e+100.0
90上证3804885.02670.234881.72354879.54714890.88384858.43250.05.888844e+100.0

9.2.2 股票衍生变量生成

1.生成股票基本数据

这里首先通过上一节的get_k_data()函数获取从2015-01-01到2019-12-31的股票基本数据:

df = ts.get_k_data('000002',start='2015-01-01',end='2019-12-31')
df.head()
dateopenclosehighlowvolumecode
02015-01-0512.43612.88513.21412.2896560835.0000002
12015-01-0612.61712.41012.95412.1423346346.0000002
22015-01-0712.32412.29812.53112.0992642051.0000002
32015-01-0812.37511.74512.41911.6322639394.0000002
42015-01-0911.70111.62412.28911.4853294584.0000002
# 通过set_index()函数可以将日期列设置为行索引:
df = df.set_index('date')
df.head()
openclosehighlowvolumecode
date
2015-01-0512.43612.88513.21412.2896560835.0000002
2015-01-0612.61712.41012.95412.1423346346.0000002
2015-01-0712.32412.29812.53112.0992642051.0000002
2015-01-0812.37511.74512.41911.6322639394.0000002
2015-01-0911.70111.62412.28911.4853294584.0000002

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

df.head()
openclosehighlowvolumecodeclose-openhigh-lowpre_closeprice_changep_change
date
2015-01-0512.43612.88513.21412.2896560835.00000020.0361050.075271NaNNaNNaN
2015-01-0612.61712.41012.95412.1423346346.0000002-0.0164060.06687512.885-0.475-3.686457
2015-01-0712.32412.29812.53112.0992642051.0000002-0.0021100.03570512.410-0.112-0.902498
2015-01-0812.37511.74512.41911.6322639394.0000002-0.0509090.06765812.298-0.553-4.496666
2015-01-0911.70111.62412.28911.4853294584.0000002-0.0065810.07000411.745-0.121-1.030226

3.移动平均线指标MA值

通过如下代码可以获得股价的5日移动平均值和10日移动平均值:

df['MA5'] = df['close'].rolling(5).mean()
df['MA10'] = df['close'].rolling(10).mean()

df.head(15)  # head(15)表示展示前15行,因为要展示10行以上,才能看到MA10有值
openclosehighlowvolumecodeclose-openhigh-lowpre_closeprice_changep_changeMA5MA10
date
2015-01-0512.43612.88513.21412.2896560835.00000020.0361050.075271NaNNaNNaNNaNNaN
2015-01-0612.61712.41012.95412.1423346346.0000002-0.0164060.06687512.885-0.475-3.686457NaNNaN
2015-01-0712.32412.29812.53112.0992642051.0000002-0.0021100.03570512.410-0.112-0.902498NaNNaN
2015-01-0812.37511.74512.41911.6322639394.0000002-0.0509090.06765812.298-0.553-4.496666NaNNaN
2015-01-0911.70111.62412.28911.4853294584.0000002-0.0065810.07000411.745-0.121-1.03022612.1924NaN
2015-01-1211.51111.33811.51111.0192436341.0000002-0.0150290.04465011.624-0.286-2.46042711.8830NaN
2015-01-1311.27811.29511.56311.2091664610.00000020.0015070.03158211.338-0.043-0.37925611.6600NaN
2015-01-1411.29511.32111.49411.1221646818.00000020.0023020.03344711.2950.0260.23019011.4646NaN
2015-01-1511.34711.90011.95211.2352429686.00000020.0487350.06381811.3210.5795.11438911.4956NaN
2015-01-1611.90011.68411.90011.5722129475.0000002-0.0181510.02834411.900-0.216-1.81512611.507611.8500
2015-01-1910.80310.51711.14810.5173603625.0000002-0.0264740.05999811.684-1.167-9.98801811.343411.6132
2015-01-2010.54310.67310.88910.4222914688.00000020.0123300.04480910.5170.1561.48331311.219011.4395
2015-01-2110.65611.27811.40710.4573555294.00000020.0583710.09084810.6730.6055.66850911.210411.3375
2015-01-2211.25211.73611.79611.1663224727.00000020.0430150.05642111.2780.4584.06100411.177611.3366
2015-01-2311.72712.03012.17711.4943310408.00000020.0258380.05942211.7360.2942.50511211.246811.3772
# 删除空值
df.dropna(inplace=True)  # 删除空值行,也可以写成df = df.dropna()
df.head()
openclosehighlowvolumecodeclose-openhigh-lowpre_closeprice_changep_changeMA5MA10
date
2015-01-1611.90011.68411.90011.5722129475.0000002-0.0181510.02834411.900-0.216-1.81512611.507611.8500
2015-01-1910.80310.51711.14810.5173603625.0000002-0.0264740.05999811.684-1.167-9.98801811.343411.6132
2015-01-2010.54310.67310.88910.4222914688.00000020.0123300.04480910.5170.1561.48331311.219011.4395
2015-01-2110.65611.27811.40710.4573555294.00000020.0583710.09084810.6730.6055.66850911.210411.3375
2015-01-2211.25211.73611.79611.1663224727.00000020.0430150.05642111.2780.4584.06100411.177611.3366

4.股票衍生变量生成库:TA-Lib库的安装

下面要讲的衍生变量指标都是通过股票衍生变量生成库:TA-Lib库生成的,所以这里我们先讲解一下如何安装Ta-Lib库:

以Windows操作系统为例,如果你的系统是Windows的64位系统,直接使用pip install talib语句会报错,原因在于python pip源中TA-Lib是32位的,不能安装在64位系统平台上。

正确的方法是下载64位的安装包后本地安装,下载推荐使用加州大学的python扩展库,地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

进入网址后Ctrl + F键搜索“ta_lib”,如下图所示,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FpvDHWnj-1681175692727)( https://uploader.shimo.im/f/rd7iXLJw6RMZPkbV.png!thumbnail)]

选择对应的文件TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl(cp后的37表示的是Python3.7版本)下载到自己选择的文件夹,读者在下载时也要根据自己Python的版本进行下载。

如何查看自己Python的版本,可以通过Win + R键调出运行框,然后输入cmd,在弹出界面中输入python,然后按一下Enter回车键即可查看相关版本,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KXw9yAF-1681175692728)( https://uploader.shimo.im/f/90luFuZqHt46OZko.png)]

下载完成后,在自己选择的文件夹中(例如笔者保存在的文件夹“E:\机器学习与大数据分析\随机森林”),如下图所示,在搜索框中输入cmd后按一下Enter回车键搜索:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wp2cI7Zm-1681175692728)( https://uploader.shimo.im/f/EnabNoMQKT0tYdaz.png!thumbnail)]

在弹出框中输入如下内容,然后Enter回车键安装即可。

pip install TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl

5.通过TA-Lib库生成相对强弱指标RSI值

import talib
df['RSI'] = talib.RSI(df['close'], timeperiod=12)

6.通过TA-Lib库生成动量指标MOM值

df['MOM'] = talib.MOM(df['close'], timeperiod=5)

7.通过TA-Lib库生成指数移动平均值EMA

df['EMA12'] = talib.EMA(df['close'], timeperiod=12)  # 12日指数移动平均线
df['EMA26'] = talib.EMA(df['close'], timeperiod=26)  # 26日指数移动平均线

8.通过TA-Lib库生成异同移动平均线MACD值

df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9) 
df.dropna(inplace=True)  # 删除空行
df.tail()  # 和head()相对,通过tail()函数可以查看后五行
openclosehighlowvolumecodeclose-openhigh-lowpre_closeprice_changep_changeMA5MA10RSIMOMEMA12EMA26MACDMACDsignalMACDhist
date
2019-12-2530.4030.2930.6330.18685037.0000002-0.0036180.01491130.38-0.09-0.29624830.87830.07563.075563-0.0229.90855628.9732110.9353450.7729580.162387
2019-12-2630.5031.1231.3030.50888790.00000020.0203280.02623030.290.832.74017830.89630.38768.8901640.0930.09493229.1322330.9626990.8109060.151793
2019-12-2731.2331.0031.3230.81703096.0000002-0.0073650.01655331.12-0.12-0.38560430.76030.67267.220611-0.6830.23417329.2705860.9635870.8414420.122145
2019-12-3031.3531.5731.7931.02915751.00000020.0070180.02482331.000.571.83871030.87230.88470.8778140.5630.43968529.4409130.9987720.8729080.125864
2019-12-3131.3532.1832.4531.32663497.00000020.0264750.03607931.570.611.93221431.23231.05774.2339511.8030.70742629.6438081.0636180.9110500.152567

补充内容:Talib库的一些验证

RSI指标的验证

import pandas as pd
import talib

data = pd.DataFrame()
data['close'] = [10, 12, 11, 13, 12, 14, 13]
data['RSI'] = talib.RSI(data['close'], timeperiod=6)

data
closeRSI
010NaN
112NaN
211NaN
313NaN
412NaN
514NaN
61366.666667

9.3 量化金融 - 股票涨跌预测模型搭建

9.3.1 多因子模型搭建

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  # 引入准确度评分函数
import warnings
warnings.filterwarnings("ignore") # 忽略警告信息,警告非报错,不影响代码执行

2.股票数据处理与衍生变量生成

我们这里将8.2节股票基本数据和股票衍生变量数据的相关代码汇总,方便之后的股票涨跌预测模型的搭建:

# 1.股票基本数据获取
df = ts.get_k_data('000002',start='2015-01-01',end='2019-12-31')
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=12, slowperiod=26, signalperiod=9)  # MACD值
df.dropna(inplace=True)  # 删除空值
本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
# 查看此时的df后五行
df.tail()
openclosehighlowvolumecodeclose-openhigh-lowpre_closeprice_changep_changeMA5MA10RSIMOMEMA12EMA26MACDMACDsignalMACDhist
date
2019-12-2527.16527.05527.39526.945685037.0000002-0.0040490.01670127.145-0.09-0.33155327.64326.84063.081344-0.0226.67355525.7371030.9364520.7745850.161867
2019-12-2627.26527.88528.06527.265888790.00000020.0227400.02934227.0550.833.06782527.66127.15268.8952910.0926.85993225.8962070.9637250.8124130.151311
2019-12-2727.99527.76528.08527.575703096.0000002-0.0082160.01849527.885-0.12-0.43033927.52527.43767.225542-0.6826.99917326.0346360.9645370.8428380.121699
2019-12-3028.11528.33528.55527.785915751.00000020.0078250.02771327.7650.572.05294427.63727.64970.8823350.5627.20468526.2050330.9996510.8742010.125451
2019-12-3128.11528.94529.21528.085663497.00000020.0295220.04023528.3350.612.15281527.99727.82274.2380641.8027.47242626.4079941.0644320.9122470.152185

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)

首先强调最核心的一点:应该是今天的股价信息预测下一天的股价涨跌情况,所以y应该是下一天的股价变化情况。

其中Numpy库中的where()函数的使用方法如下所示:
np.where(判断条件,满足条件的赋值,不满足条件的赋值)

其中df[‘price_change’].shift(-1)则是利用shift()函数将price_change(股价变化)这一列往上移动一行,这样就获得了每一行对应的下一天股价涨跌情况。

因此这里的判断条件就是下一天股价是否大于0,如果下一天股价涨了的我们则y赋值为数字1,下一天股价跌了的,则y赋值为数字-1。这个下一天的股价涨跌情况就是我们根据当天股票基本数据以及衍生变量预测的内容。

3.训练集和测试集数据划分

接下来,我们要将原始数据集进行分割,我们要注意到一点,训练集与测试集的划分要按照时间序列划分,而不是像之前利用train_test_split()函数进行划分。原因在于股票价格的变化趋势具有时间性,如果我们随机划分,则会破坏时间性特征,因为我们是根据当天数据来预测下一天的股价涨跌情况,而不是任意一天的股票数据来预测下一天的股价涨跌情况。
因此,我们将前90%的数据作为训练集,后10%的数据作为测试集,代码如下:

X_length = X.shape[0]  # shape属性获取X的行数和列数,shape[0]即表示行数 
split = int(X_length * 0.9)

X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]

4.模型搭建

model = RandomForestClassifier(max_depth=3, n_estimators=10, min_samples_leaf=10, random_state=1)
model.fit(X_train, y_train)
RandomForestClassifier(max_depth=3, min_samples_leaf=10, n_estimators=10,
                   random_state=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class="sk-container" hidden><div class="sk-item"><div class="sk-estimator sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-1" type="checkbox" checked><label for="sk-estimator-id-1" class="sk-toggleable__label sk-toggleable__label-arrow">RandomForestClassifier</label><div class="sk-toggleable__content"><pre>RandomForestClassifier(max_depth=3, min_samples_leaf=10, n_estimators=10,
                   random_state=1)</pre></div></div></div></div></div>

9.3.2 模型使用与评估

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

y_pred = model.predict(X_test)
print(y_pred)
[-1  1 -1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1  1  1  1  1  1  1
  1  1  1  1  1  1 -1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
  1  1  1  1  1  1 -1 -1 -1  1  1  1  1  1  1  1  1  1  1  1  1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1]
a = pd.DataFrame()  # 创建一个空DataFrame 
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)
a.head()
预测值实际值
0-1-1
11-1
2-1-1
31-1
411
# 查看预测概率
y_pred_proba = model.predict_proba(X_test)
y_pred_proba[0:5]
array([[0.53462409, 0.46537591],
       [0.49852513, 0.50147487],
       [0.53687766, 0.46312234],
       [0.49733765, 0.50266235],
       [0.49733765, 0.50266235]])

2.模型准确度评估

from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)
0.5428571428571428
# 此外,我们还可以通过模型自带的score()函数记性打分,代码如下:
model.score(X_test, y_test)
0.5428571428571428

3.分析数据特征的重要性

model.feature_importances_
array([0.15132672, 0.09957677, 0.05021545, 0.06514831, 0.079073  ,
       0.11447561, 0.04576496, 0.17559964, 0.04713332, 0.07061667,
       0.08866083, 0.01240873])
# 通过如下代码可以更好的展示特征及其特征重要性:
features = X.columns  
importances = model.feature_importances_
a = pd.DataFrame()
a['特征'] = features
a['特征重要性'] = importances
a = a.sort_values('特征重要性', ascending=False)
a
特征特征重要性
7MOM0.175600
0close0.151327
5high-low0.114476
1volume0.099577
10MACDsignal0.088661
4MA100.079073
9MACD0.070617
3MA50.065148
2close-open0.050215
8EMA120.047133
6RSI0.045765
11MACDhist0.012409

9.3.3 参数调优

from sklearn.model_selection import GridSearchCV  # 网格搜索合适的超参数
# 指定分类器中参数的范围
parameters = {'n_estimators':[5, 10, 20], 'max_depth':[2, 3, 4, 5], 'min_samples_leaf':[5, 10, 20, 30]}
new_model = RandomForestClassifier(random_state=1)  # 构建分类器
grid_search = GridSearchCV(new_model, parameters, cv=6, scoring='accuracy')  # cv=6表示交叉验证6次,scoring='roc_auc'表示以ROC曲线的AUC评分作为模型评价准则, 默认为'accuracy', 即按准确度评分
grid_search.fit(X_train, y_train)  # 传入数据
grid_search.best_params_  # 输出参数的最优值
{'max_depth': 2, 'min_samples_leaf': 20, 'n_estimators': 10}

9.3.4 收益回测曲线绘制

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']].tail()
strategyorigin
date
2019-12-251.2484841.059319
2019-12-261.2101831.091817
2019-12-271.2153911.087118
2019-12-301.1904391.109436
2019-12-311.1648111.133320
# 通过如下代码将收益情况删除空值后可视化,并设置X轴刻度自动倾斜:
X_test[['strategy', 'origin']].dropna().plot()
plt.gcf().autofmt_xdate()
plt.show()


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue.js 2.0 组件

什么是组件&#xff1f; 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。在较高层面上&#xff0c;组件是自定义元素&#xff0c; Vue.js 的编译器为它添加特殊功能。在有些情况下&#xff0c;组件也…

《花雕学AI》19:比较ChatGPT与新Bing在文章润色方面的应用优势与测试案例

引言&#xff1a; 文章润色是指对已经写好的文章进行修改、优化或完善的过程&#xff0c;以提高文章的质量和效果。文章润色涉及到多方面的内容&#xff0c;如语言表达、逻辑结构、文献引用、格式规范等。文章润色对于提升写作水平、提高论文发表率、增加学术影响力等都有重要意…

JavaScript【趣味】做一个网页版2048

文章目录&#x1f31f;前言&#x1f31f;先看效果&#xff08;粉丝特权哈哈&#xff09;&#x1f31f;代码实现&#x1f31f;页面布局 【index.html】&#x1f31f;样式文件【2048.css】&#x1f31f;index.html 里用到的JS文件&#x1f31f;jquery.min.js&#x1f31f;util.js…

300元左右的蓝牙耳机哪个好?300左右音质最好的蓝牙耳机

无线耳机是人们日常生活中必不可少的设备&#xff0c;无论是听音乐化石看电影都能获得身临其境的感觉&#xff0c;由于科技真在发展中&#xff0c;不断地的发生变化&#xff0c;百元价位就可以感受到不错的音色&#xff0c;下面小编整理了几款300左右音质表现不错的蓝牙耳机。 …

Linux 、Android将在汽车舞台上开战

导读在 CES 2017 上&#xff0c;AGL 宣布&#xff0c;Mercedes-Benz 的母公司 Daimler 正式加入。这是第十家汽车制造商加入 AGL&#xff0c;也是第一家德国公司加入 AGL。AGL&#xff08;Automotive Grade Linux&#xff09;&#xff0c;是 Linux 基金会的一个相互协作的开源组…

mallox勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

目录 前言&#xff1a; 一、mallox勒索病毒及xollam勒索病毒的特点 二、mallox勒索病毒及xollam勒索病毒的影响 三、mallox勒索病毒及xollam勒索病毒数据恢复服务 四、mallox勒索病毒及xollam勒索病毒加密数据库恢复案例 五、以下是预防mallox勒索病毒及xollam勒索病毒安全…

解读CANDT测试项-采样点测试

原标题&#xff1a;解读CANDT测试项-采样点测试 一、为什么要进行采样点测试&#xff1f; 本文引用地址&#xff1a;http://www.eepw.com.cn/article/202004/411611.htm 为了保证有效的通信&#xff0c;对于一个只有两个节点的CAN网络&#xff0c;其两边距离不超过最大的传输…

day12 共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)

内存映射的基本使用 概念&#xff1a; 功能共享内存可以通过mmap&#xff08;&#xff09;映射普通文件。 是一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必在调用read 、write。 mmap&#xff08;&#xf…

ChatGPT 与 MindShow 一分钟搞定一个PPT

前言 PPT制作是商务、教育和各种场合演讲的重要组成部分。然而&#xff0c;很多人会花费大量时间和精力在内容生成和视觉设计方面。为了解决这个问题&#xff0c;我们可以利用两个强大的工具——ChatGPT和MindShow&#xff0c;来提高制作PPT的效率。 一、ChatGPT 与 MindShow…

JUC-01 线程的创建和状态转换

本次我们主要讲三个问题 线程是什么&#xff1f;线程有哪些状态&#xff1f;各状态间的转换了解吗&#xff1f;创建线程的3种方法你都了解吗&#xff1f; 1. 线程是什么&#xff1f;&#xff08;了解即可&#xff09; 进程&#xff1a; 进程是一个具有一定独立功能的程序在一…

四次挥手刨根问底19问详解,全网最全

1.请描述一下TCP连接的四次挥手过程&#xff1f; 回答&#xff1a;TCP连接的四次挥手过程包括以下步骤&#xff1a; 步骤1&#xff1a;客户端向服务器端发送一个FIN报文段&#xff0c;请求关闭连接。 步骤2&#xff1a;服务器端收到FIN报文段后&#xff0c;向客户端发送一个…

python列表,元组和字典

1、python列表 1.1.列表的定义 list是一种有序的集合、基于 链表实现,name[ ] ,全局定义:list2list([ ])。 1.2下标索引 python不仅有负索引也有正索引。正索引从0开始,负索引从-1开始。这两个可以混用,但指向还是那个位置 a[0]a[-9]//length为10的数组a1.3列表的切片 列表可…

navicat如何使用orcale(详细步骤)

目录前言操作1.连接数据库2.建库问题总结前言 看过我昨天文章的兄弟姐妹都知道最近接手另一个国企项目&#xff0c;数据库用的是orcale。实话实说&#xff0c;也有快三年没用过orcale数据库了。 这期间问题不断&#xff0c;因为orcale日渐消沉&#xff0c;网上资料也是真真假…

UE4 回放系统升级到UE5之后的代码报错问题解决

关键词&#xff1a; UE4 回放系统 升级 UE5 报错 DemoNetDriver GetDemoCurrentTime GetDemoTotalTime 背景 照着网上教的UE4的回放系统&#xff0c;也叫重播系统&#xff0c;英文Replay。做完了&#xff0c;测试运行正常&#xff0c;可升级到UE5却报了一堆 WorldSetting 和 …

(20230417)最大数合并区间重新排列单词间的空格 按奇偶排序数组 II 数组形式的整数加法

最大数&#xff08;回顾等级&#xff1a;值得&#xff0c;已达最优解&#xff09; 来源&#xff1a;自己LeetCode刷题 usa long cmp(const void* e1, const void* e2) {int* p1(int*)e1;int* p2(int*)e2;long n110;long n210;while(*p1>n1){n1*10;}while(*p2>n2){n2*1…

利用AOP实现统一功能处理

目录 一、实现用户登录校验 实现自定义拦截器 将自定义的拦截器添加到框架的配置中&#xff0c;并且设置拦截的规则 二、实现统一异常处理 三、实现统一数据格式封装 一、实现用户登录校验 在之前的项目中&#xff0c;在需要验证用户登录的部分&#xff0c;每次都需要利…

RK3568平台开发系列讲解(环境篇)使用USB线缆升级固件

🚀返回专栏总目录 文章目录 一、进入升级模式1.1、硬件方式进入Loader模式1.2、软件方式进入Loader模式二、安装烧写工具2.1、Windows操作系统2.2、Linux操作系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍了如何将主机上的固件,通过USB数据线烧录到…

Typora(Mckbook版)的使用方法

1、标题&#xff08;⌘ 数字&#xff09; 一级标题&#xff1a;&#xff08;⌘ 1&#xff09; 二级标题&#xff1a;&#xff08;⌘ 2&#xff09; 三级标题&#xff1a;&#xff08;⌘ 3&#xff09; 四级标题&#xff1a;&#xff08;⌘ 4&#xff09; ... 六级标…

0303github搜索案例-react应用

文章目录1 前言2 静态组件2.1 静态页面和样式2.2 静态组件3 axios请求github接口4 优化案例结语1 前言 学习了脚手架配置axios&#xff0c;我们通过访问github的接口来做个练习。实例效果如下所示&#xff1a; 搜索框输入github用户名关键字&#xff0c;点击搜索&#xff0c;列…

AD633JRZ-ASEMI代理ADI亚德诺AD633JRZ车规级芯片

编辑-Z AD633JRZ芯片参数&#xff1a; 型号&#xff1a;AD633JRZ 总误差&#xff1a;1% 标度电压错误&#xff1a;0.25% 电源干扰&#xff1a;0.01% 输出偏移电压&#xff1a;5mV 小信号带宽&#xff1a;1MHz 斜率&#xff1a;20V/s 沉降时间达到1%&#xff1a;2s 宽…