【独家】周志华教授gcForest(多粒度级联森林)算法预测股指期货涨跌(3)
2017-04-27 编辑:
fromsklearn importpreprocessingema = ta.EMA(close, timeperiod= 30).tolist()macd = ta.MACD(close, fastperiod= 12, slowperiod= 26, signalperiod = 9)[ 0].tolist()momentum = ta.MOM(close, timeperiod= 10).tolist()rsi = ta.RSI(close, timeperiod= 14).tolist()linreg = ta.LINEARREG(close, timeperiod= 14).tolist()var = ta.VAR(close, timeperiod= 5, nbdev= 1).tolist() #获取当前的收盘价的希尔伯特变换
cycle = ta.HT_DCPERIOD(close).tolist() #获取平均真实波动范围指标ATR,时间段为14
atr = ta.ATR(high, low, close, timeperiod= 14).tolist() #把每根k线的指标放入数组X中,并转置
X = np.array([open,close,high,low,volume,ema, macd, linreg, momentum, rsi, var, cycle, atr]).T #输出可知数组X包含了ema, macd, linreg等13个指标数值
X[ 2] array([ 3215. , 3267.2, 3281.2, 3208. , 114531. , nan, nan, nan, nan, nan, nan, nan, nan])y=[]c=close[ 0]
#用i遍历整个数据集
fori inrange( 1, len(X)):
#如果高点突破参考线的1.0015倍,即上涨if(close[i]>close[i- 1]):
#把参考点加到列表basicLine里,并且新参考点变为原来的1.0015倍,y.append( 1) elif(close[i]<close[i- 1]): y.append( 0) elif(close[i]==close[i- 1]): y.append( 2)
#添加最后一个数据的标签为1
y.append( 1)
#把y转化为ndarray数组
y=np.array(y)
#输出验证标签集是否准确
print(len(y))
fori inrange( 1, 10): print(close[i],y[i],i) 16633214.6 1 13267.2 0 23236.2 0 33221.2 0 43219.6 0 53138.8 0 63129.0 0 73083.8 1 83107.0 0 9#把数据集分解成随机的训练和测试子集, 参数test_size表示测试集所占比例
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size= 0.33)
#输出可知测试特征集为维度是50*4的数组ndarray
X_te.shape
(549, 13)
首先调用和训练算法. 参数shape_1X在这里是指某一样本的维度。
我把维度也作为图像特征输入到机器里. 显然,它与iris数据集并不是很相关,但仍然需要定义 .
0.1.3版本可输入整数作为 shape_1X参数。
gcForest参数说明
shape_1X:
单个样本元素的形状[n_lines,n_cols]。 调用mg_scanning时需要!对于序列数据,可以给出单个int。
n_mgsRFtree:
多粒度扫描期间随机森林中的树木数量。
window:int(default = None)
多粒度扫描期间使用的窗口大小列表。如果“无”,则不进行切片。
stride:int(default = 1)
切片数据时使用的步骤。
cascade_test_size:float或int(default = 0.2)
级联训练集分裂的分数或绝对数。
n_cascadeRF:int(default = 2)
级联层中随机森林的数量,对于每个伪随机森林,创建完整的随机森林,因此一层中随机森林的总数将为2 * n_cascadeRF。
n_cascadeRFtree:int(default = 101)
级联层中单个随机森林中的树数。
min_samples_mgs:float或int(default = 0.1)
节点中执行拆分的最小样本数 在多粒度扫描随机森林训练期间。 如果int number_of_samples = int。 如果float,min_samples表示要考虑的初始n_samples的分数。
min_samples_cascade:float或int(default = 0.1)
节点中执行拆分的最小样本数 在级联随机森林训练期间。 如果int number_of_samples = int。 如果float,min_samples表示要考虑的初始n_samples的分数。
cascade_layer:int(default = np.inf)
允许的最大级联级数。 有用的限制级联的结构。
tolerance:float(default= 0.0)
联生长的精度差,整个级联的性能将在验证集上进行估计, 如果没有显着的性能增益,训练过程将终止
n_jobs:int(default = 1)
任意随机森林适合并预测的并行运行的工作数量。 如果为-1,则将作业数设置为核心数。
#shape_1X样本维度,window为多粒度扫描(Multi-Grained Scanning)算法中滑动窗口大小,
#用于扫描原始数据,tolerance为级联生长的精度差,整个级联的性能将在验证集上进行估计,
#如果没有显着的性能增益,训练过程将终止#gcf = gcForest(shape_1X=4, window=2, tolerance=0.0)
#gcf = gcForest(shape_1X=[13,13], window=2, tolerance=0.0)
gcf = gcForest(shape_1X= 13, n_mgsRFtree= 100, window= 6, stride= 2, cascade_test_size= 0.2, n_cascadeRF= 4, n_cascadeRFtree= 101, cascade_layer=np.inf, min_samples_mgs= 0.1, min_samples_cascade= 0.1, tolerance= 0.0, n_jobs= 1)gcf.fit(X_tr, y_tr)
Slicing Sequence...Training MGS Random Forests...Adding/Training Layer, n_layer=1Layer validation accuracy = 0.5577889447236181Adding/Training Layer, n_layer=2Layer validation accuracy = 0.521608040201005
#shape_1X样本维度,window为多粒度扫描(Multi-Grained Scanning)算法中滑动窗口大小,
#用于扫描原始数据,tolerance为级联生长的精度差,整个级联的性能将在验证集上进行估计,
#如果没有显着的性能增益,训练过程将终止#gcf = gcForest(shape_1X=4, window=2, tolerance=0.0)
#gcf = gcForest(shape_1X=[13,13], window=2, tolerance=0.0)
gcf = gcForest(shape_1X=[ 1, 13], window=[ 1, 6],)gcf.fit(X_tr, y_tr)