量化交易全流程(八)

本节目录

随机森林

支持向量机

朴素贝叶斯

神经网络构建

将机器算法融入量化投资领域,不同于一般的量化交易策略,从一类数据中自动分析获得规律,利用规律对未知数据进行预测的算法。

决策树:决策树具有分层或者树状结构,其分支充当节点。我们可以通过遍历这些节点来做出某个决策,这些节点通过数据特征进行参数选择。但是,决策树存在过度拟合的问题。 过度拟合通常在树中添加越来越多的节点来增加树内的特异性以达到某个结论,从而增加树的深度并使其更复杂。

随机森林:是一种基于统计学习理论的机器算法。它可以对投资者自选的各个因子,以机器训练的方式进行自动分析,从而给投资者提供良好的投资建议。是一种使用集成方法的监督分类机器学习算法。 简而言之,随机森林由众多决策树组成,有助于解决决策树过度拟合的问题。 通过从给定数据集中选择随机特征来随机构造这些决策树。随机森林根据从决策树收到的最大投票数得出决策或预测。 通过众多决策树达到最大次数的结果被随机森林视为最终结果。
随机森林的构建:随机森林的构建包括两个方面,分别是数据的随机选取和决策点的随机选取。
1)数据的随机选取
第一,从初始的数据集中采取有放回的抽样方式,构造子数据集,子数据集的数据量和初始数据集相同。需要注意的是,不同子数据集的元素可以重复,同一个子数据集的元素也可以重复。
第二,利用子数据集来构造子决策树,将子数据集放到每个子决策树中,每个子决策树输出一个结果。
第三,如果有新的数据需要通过随机森林得到分类结果,可以通过对子决策树的判断结果进行投票,得到随机森林的输出结果。
2)决策点的随机选取
与数据集的随机选取相似,随机森林中的子决策树的每一个分裂过程并未用到所有的决策点,而是从所有的决策点中随机选取一定的决策点,再在随机选取的决策点中选取最优的决策点。这样能够使随机森林中的决策树彼此不同,以提升系统的多样性,从而提升分类性能。

工作原理

随机森林基于集成学习技术,简单地表示一个组合或集合,在这种情况下,它是决策树的集合,一起称为随机森林。集合模型的准确性优于单个模型的准确性,因为它汇总了单个模型的结果并提供了最终结果。那么,如何从数据集中选择特征以构建随机森林的决策树呢?

使用称为 bagging 的方法随机选择特征。根据数据集中可用的特征集,通过选择具有替换的随机特征来创建许多训练子集。这意味着可以在不同的训练子集中同时重复一个特征。例如,如果数据集包含20个特征,并且要选择5个特征的子集来构建不同的决策树,则将随机选择这5个特征,并且任何特征都可以是多个子集的一部分。这确保了随机性,使树之间的相关性更小,从而克服了过度拟合的问题。选择特征后,将根据最佳分割构建树。每棵树都给出一个输出,该输出被认为是从该树到给定输出的“投票”。接收最大’投票’的随机森林选择最终输出/结果,或者在连续变量的情况下,所有输出的平均值被视为最终输出。

在上图中,我们可以观察到每个决策树已经投票或者预测了特定的类别。随机森林选择的最终输出或类别将是N类,因为它具有多数投票或者是四个决策树中的两个预测输出。

随机森林的优缺点
随机森林的优点有3项,具体如下:
第一,随机森林可以用于回归和分类任务,并且很容易查看模型输入特征的相对重要性。
第二,随机森林是一种非常方便且易于使用的算法,因为在默认参数情况下即可产生一个很好的预测结果。
第三,机器学习中的一个重大问题是过拟合,但大多数情况下随机森林分类器不会出现过拟合,因为只要森林中有足够多的树,分类器就不会过度拟合模型。
随机森林的缺点在于使用大量的树会使算法变得很慢,并且无法做到实时预测。一般来讲,这些算法训练速度很快,预测却十分缓慢。而且越准确的预测需要越大量的树,这将导致模型很慢。

随机森林应用
下面说明利用随机森林训练某只股票的均线指标、相对强弱指标、动量线指标后,来预测该股票下一个交易日的涨跌,即为投资者提供买进或卖出的投资建议。

首先导入需要的数据包,具体代码如下:

import talib # 导入talib库
from jqdata import *  # 导入聚宽函数库

接下来设置要操作的股票,即利用随机森林训练的股票。同时要设置训练股票的开始时间和结束时间,具体代码如下:


test stock = '600600.XSHG' # 设置测试标的为青岛啤酒
start_date = datetime.date(2018, 12, 1) # 设置开始时间
end_date = datetime.date(2023, 12, 1) # 设置结束时间

接下来,利用get_all_trade_days)函数获取所有交易日;再定义两个变量,将其分别赋值为随机森林训练开始时间和结束时间,具体代码如下:

trading days = list(get_all_trade_days()) # 获取所有交易日
start_date_index = trading_days.index(start_date) # 获取开始时间
end_date_index = trading_days.index(end_date) # 获取结束时间

然后再定义两个列表变量,接着利用for循环语句计算3个指标,即均线指标、相对强弱指标、动量线指标的数据,并添加到列表变量中,具体代码如下:

x_all = [] # 定义两个列表变量
y_all = []
for index in range(start_date_index, end_date_index):
    # 得到计算指标的所有数据
    start_day = trading_days[index-30]
    end_day = trading_days[index]
    # 利用get_price()函数获得股票数据
    stock_data =get_price(test_stock, start_date = start_day, end_date = end day,frequency='daily', fields=['close'])
    # 定义变量并赋值为收盘价
    close_prices = stock_data('close').values
    # 通过数据计算指标
    # -2是保证获取的数据是昨天的,-1就是通过今天的数据计算出来的指标
    ma_data = talib.MA(close_prices)[-2]
    rsi_data = talib.RSI(close_prices)[-2]
    mom_data = talib.MOM(close_prices) [-2]
    features = []
    # 添加均线指标、相对强弱指标和动量线指标
    features.append(ma_data)
    features.append(rsi_data)
    features.append(mom_data)
    # 设置变量label 为布尔变量,并赋值为False
    label = False
    # 如果今天收盘价大于昨天收盘价,则变量 label为True
    if close_prices[-1] > close_prices[-2]:
        label = True
    x_all.append(features)
    y_all.append(label)

最后准备随机森林算法需要用到的数据,并显示提示信息,具代码如下:

x_train = x_all[:-1]
y_train = y_all[:-1]
x_test = x_all[-1]
y_test= y_al1[-1]
print('数据已准备好了!')

接下来导入随机森林分类器,训练样本的特征是根据2018年12月1日至2023年12月1日每一天的之前的交易日的收盘价计算的均线指标、相对强弱指标和动量线指标,训练样本的标类别是2018年12月1日至2023年12月1日每一天的涨跌情况,涨是True,跌是False,测试样本是2023年12月4日的3个指标以及涨跌情况,具体代码如下:

from sklearn.ensemble import RandomForestClassifier # 调用随机森林分类器
clf = RandomForestClassifier()
clf.fit(x_train, y_train) # 训练的代码
prediction = clf.predict(x_test)  # 得到测试结果
if prediction == y_test: # 利用if语句判断是否预测正确
    print("预测正确!")
else:
    print("预测错误!")

得到结果为:

支持向量机:是一种有监督得机器学习模型,通常用来进行模式识别、分类和回归分析,在解决小样本、非线性样本和高维模式识别中表现出许多特有的优势,广泛推广到其他函数拟合等其他机器学习中。

为了解释SVM算法,可以想象有很多数据,其中每个数据是高维空间中的一个点,数据的特征有多少,空间的维数就有多少。相应的,数据的位置就是其对应各特征的坐标值。如果想用一个超平面尽可能完美地分类这些数据点,就可以用SVM算法找出这个超平面。

所谓“支持向量”指的是那些在间隔区边缘的训练样本点,而“机”则是用于分类的那个最佳决策边界(线面/超平面)。

工作原理:SVM算法选择的是能分类两种数据的决策边界。将两类数据分成明显的两类,才是正确的超平面。使得两类分类的点都距离边界最远,此时决策边界才是最佳的(因为选择距离更远的决策边界会更稳健,容错率更高,持续输入样本时发生分类错误的可能性就越小)。当在选择正确分类和边界距离最远之间做选择时,首先选择正确分类,再选择距离最远。

核函数:在原始特征维度上,能直接找到一条超平面将数据完美地分为成两类的情况,引入核函数找到超平面,当无法对已有特征很好地进行分类时,可以利用已有特征构建新特征(函数关系),核函数就是将低维数据映射到高维空间,将线性不可分数据转换成线性可分数据,将高维数据转换成低维数据后超平面可能不是直线了,而是圆形,核函数作用就是解决非线性分离问题,自动执行非常复杂的数据转换,然后根据数据标签找出数据分离过程。

优点:效果好,分类边界清晰;在高维空间非常有效;在空间维数大于样本数情况下很有效;使用的是决策函数中的一个训练点子集,占用内存小,效率高。

缺点:若数据量过大或训练时间长效果会下降;数据集内有大量噪声会导致效果不好;不直接计算概率估计,需要多次进行交叉验证,代价过高。

应用:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值