通过TA-Lib库生成指数移动平均值EMA
分析数据特征的重要性
计算完所有衍生变量并删除空值后,通过打印df.tail查看表格的后五行如下所示:
接下来,我们要将原始数据集进行分割,我们要注意到一点,训练集与测试集的划分要按照时间序列划分,而不是像之前利用train_test_split函数进行划分。原因在于股票价格的变化趋势具有时间性,如果我们随机划分,则会破坏时间性特征,因为我们是根据当天数据来预测下一天的股价涨跌情况,而不是任意一天的股票数据来预测下一天的股价涨跌情况。
我们也可以通过TA-Lib库来验证上面的结果,代码如下:
data = pd.DataFrame()
data["close"] = [1, 1, 1, 1, 1, 7, 2]
data["EMA6"] = talib.EMA(data["close"], timeperiod=6)
这一节我们将讲解量化金融中的一个案例:基于随机森林模型的股票涨跌预测模型的搭建,量化金融有两种主要方向:通过大数据分析进行智能择时与智能择股,这两种方向的本质都是预测股票涨跌的情况。在实战应用中,股票涨跌预测非常难,因为影响股票涨跌的因素不仅有众多技术指标,还有公司的基本面指标,以及宏观经济数据等各种各样的数据,本节也只是简单演示一下量化金融模型的基本思路,实际应用的股票涨跌预测模型则复杂的多。
获取结果如下所示,其实它便可以调取超过三年的数据,不过只显示股价的基本信息:开盘价、收盘价、最高价、最低价、成交量信息,而且它的顺序是从开始日期往下排序的。
一般我们N的取值为12我们这里设置参数为timeperiod=1即N取1
引入之后需要用到的库
通常情况下,RSI值位于20-80之间,超过80则为超买状态,低于20则为超卖状态,等于50则认为买卖双方力量均等。
这里我们取第一个EMA值为开头6个数的均值,因此前5天都没有EMA值,对于6号而言,其为第一个EMA值,为前6天的均值:12/6=2;对于7号而言,其为第二个EMA值,其计算公式如下:
EMAtoday = 2/7 * 2 + (1 - 2/7) * EMAyesterday = 2/7 * 2 + 5/7 * 2 = 14/7 = 2
MACD的具体计算步骤如下:
股票衍生变量生成库:TA-Lib库的安装
在下所示的弹出框中输入如下内容,然后Enter回车键安装即可。
pip install TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl
如何查看自己Python的版本,可以通过Win+R键调出运行框,然后输入cmd,在弹出界面中输入python,然后按一下Enter回车键即可查看相关版本,如下所示:
有了基本数据后,下面我们来计算相关衍生变量。
和决策树模型一样,随机森林模型既可以做分类分析,也可以做回归分析,分别对应的模型为随机森林分类模型及随机森林回归模型。随机森林分类模型的基模型是分类决策树模型,随机森林回归模型的基模型则是回归决策树模型。
计算EAM12和EMA26
预测的y_pred如下所示,-1和1为预测的结果,-1为预测下一天股价下跌,1为预测下一天股价上涨。
其中df["price_change"].shift则是利用shift函数将price_change这一列往上移动一行,这样就获得了每一行对应的下一天股价涨跌情况。因此这里的判断条件就是下一天股价是否大于0,如果下一天股价涨了的我们则y赋值为数字下一天股价跌了的,则y赋值为数字-这个下一天的股价涨跌情况就是我们根据当天股票基本数据以及衍生变量预测的内容。
根据3节参数调优相关知识点,通过如下代码导入GridSearchCV库。
from sklearn.model_selection import GridSearchCV
此外,我们还可以通过模型自带的score函数记性打分,代码如下:
model.score(X_test, y_test)
4收益回测曲线绘制
DIF值就是EMA12-EMA2反映的是两条移动平均线的差值,DIF值对应的连线也称之为快速线。
具体来说,在分类问题中,是利用n个基础模型投票方式获取最终结果;而在回归问题中,则是取n个基础模型的平均值作为输出。
其原理如下所示:从原始训练数据中,随机有放回地抽取10000次数据构成一个新的数据集,每次使用一个训练样本训练一个基础模型。这样进行有放回的随机抽取n次后,训练结束时我们就能获得n个由不同的数据集训练的基础模型,也称之为n个弱学习器,根据这n个弱学习器的结果,我们可以获得一个更加准确合理的结果。
price_change代表的则是今日收盘价-昨日收盘价,也就是当天的股价变化;
设置分类器中调参的范围,
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) # 构建分类器
以Windows操作系统为例,如果你的系统是Windows的64位系统,直接使用pipinstalltalib语句会报错,原因在于pythonpip源中TA-Lib是32位的,不能安装在64位系统平台上。
其中close-open表示/开盘价;
将其打印输出,结果如下所示:
这里有几个细节需要注意一下,首先我们强调过很多次是根据当天的信息预测下一天的股价,如果预测为+我们则在下一天买入,如果预测为-我们则在下一天卖出,因此这里我们需要通过shift来将预测结果这一列往下移一行,这样才和下一天的股价变化率相匹配,然后再通过comprod累乘函数来计算收益情况。
第6行通过fit函数训练模型;最后1行通过predict函数进行预测,预测结果如下:
[0]
运行结果如下所示,可以看到里面的信息为每笔成交信息。
通过打印grid_search.best_params_获得最终参数调优显示结果为:
{"max_depth": 3, "min_samples_leaf": 10, "n_estimators": 10}
生成股票基本数据
获得实时行情数据
获取结果如下:
如果想获取当日分笔信息,可以用如下代码:
df = ts.get_today_ticks("000002")
特征随机:如果每个样本的特征维度为M,指定一个常数k 随机森林是一种经典的Bagging模型,其弱学习器为决策树模型。如下所示,随机森林模型会在原始数据集中随机抽样,构成n个不同的样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些决策树模型的平均值或者投票情况来获取最终结果。 第3行中X是特征变量,其共有2个特征;y是目标变量,共有两个分类:0和1; 通过predict_proba则可以预测属于各个分类的概率,代码如下: 其中Numpy库中的where函数的使用方法如下所示: 此时数据前5行如下所示,其中缺失的数据应该是节假日数据: 3量化金融-股票涨跌预测模型搭建 通过impor/images/defaultpic.gifushareasts的方式来引用tushare库,并把它简写为ts方便以后使用。然后通过get_hist_data函数来获取万科从2018-01-01到2019-01-31的股票日线级别的数据,这里获得的是一个DataFrame的二维表格结构,打印输出结果如下所示,它是按时间由近到远排序: 如果想同时获得多个股票代码的实时数据,可以用如下代码: 1股票基本数据获取 想要搭建机器学习模型,首先得有合适的数据,我们这里首先来演示股票基本数据的获取与股票衍生变量生成。 获得指数信息 其计算公式为:MOM=C-Cn,C表示当前的收盘价,Cn表示n天前的收盘价。举个例子: 其中第1行引入随机森林回归模型相关库:RandomForestRegressor; 补充知识点:MACD的计算方法 我们这里将2节股票基本数据和股票衍生变量数据的相关代码汇总,方便之后的股票涨跌预测模型的搭建: 设置"n_estimators"的参数选择为{20}三个选项,"max_depth"的取值范范围{5},"min_samples_leaf"取值范围{20,30}。 这里通过pandas库列选取的方式选择一些特征变量构造成特征变量X,这里重点强调一下目标变量y是如何构造的。 Boosting算法的本质是将弱学习器提升为强学习器,它和Bagging的区别在于,Bagging对待所有的基础模型一视同仁。而Boosting则做到了对于基础模型的“区别对待”,通俗来讲,Boosting算法注重“培养精英”和“重视错误”。 简单衍生变量的计算 2模型使用与评估 因为get_hist_data函数不仅获得了股票的基本价格信息,还获取了价格变化、均线价格等衍生变量,所以它最多也只能调取当天往前3年的数据,如果想调取超过3年的日线级别数据,得用ts.get_k_data函数,它只获取股价的基本数据,代码如下: 计算每天的股票价格变化率,用当天收盘价与前一天收盘价的差价比上前一天的收盘价。例如,5号收盘价0元,6号收盘价2元,则6号的变化率为/0=0. 首先计算原始股票价格的收益率情况,这里主要用到了cumprod函数,cumprod函数是累乘函数,例如初始价格是2天内的价格变化率为10%,那么通过comproud函数可以求得两天后的价格为1**=2此时也表明两天的收益率为21%。 运行结果如下: 通过设置ktype参数可以获得分钟级别的数据,代码如下: 之前我们已经评估了模型的预测准确度,不过在实际应用中,我们更关心它的收益回测曲线,也就是看根据我们搭建的模型,最终获得结果是否比不利用模型获得的结果更好。 在训练过程中,“培养精英”,即每一轮对于预测结果较为准确的基础模型,会给予它一个较大的权重,表现不好的基础模型则会降低它的权重。这样在最终预测时,“优秀模型”的权重是大的,相当于它可以投出多票,而“一般模型”只能在投票时投出一票或不能投票。 p_change则是表示当天股价变动的百分比,或者称之为当天股价的涨跌幅; 集成学习模型是机器学习非常重要的一部分。集成学习是使用一系列的弱学习器进行学习,并将各个弱学习器的结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。集成学习模型有两种常见的算法:Bagging算法和Boosting算法。Bagging算法的典型机器学习模型为本章所讲的随机森林模型,而Boosting算法的典型机器学习模型则为下两章会讲到的AdaBoost、GBDT、XGBoost和LightGBM模型。 1多因子模型搭建 其原理如下所示: 此时的df如下所示: 如果要查看整体的预测准确度,可以采用如下代码: 通过X_test[["strategy","origin"]].tail我们可以查看最后5行的收益情况,也即我们开始设定的结束日期2019-12-31时的收益情况,如下所示: 特征变量和目标变量提取 其中第1行引入随机森林分类模型相关库:RandomForestClassifier; 因为直接写df.set_index不会修改原表格内容,所以需要重新将其赋值给df变量,如果不想重新赋值,可以在set_index函数中设置inplace参数为True,代码如下: 第5行引入模型,并设置弱分类器的数量为也就是共有10个决策树模型作为基模型;random_state设置为12使得每次运行结果一致; 通过如下代码我们可以先构造一些简单的衍生变量: 这里我们首先通过如下代码引入代码需要用到的相关库: 2量化金融-股票数据获取 通过TA-Lib库生成相对强弱指标RSI值 相比于单独的决策树模型来说,随机森林模型由于集成了多个决策树,其模型的预测会更加准确,且模型不容易造成过拟合的现象,模型的泛化能力增强。 可以看到如果什么都不做到话,1块钱能涨到079元,收益率为9%,而如果采用我们上面搭建的模型进行股票买卖的话,1块钱则能涨到312元,收益率为32%。 MOM也叫动量指标,是英文单词momentum的缩写,动量可以视为一段期间内,股价的涨跌速度。 根据上表样例数据,我们取N=我们可以求得6日平均上涨价格为:/6=6日平均下跌价格为:/6=0.所以RSI计算结果为:1/*100=2/3*100=6同理可以计算,如果连续6日股票价格都是每天上涨,此时N日平均下跌价格为0,将其代入公式,则6日RSI值为100,此时表明股票买方处于一个非常强势的地位,但也警醒投资者此时可能也是一个超买的状态,需要预防股价下跌的风险。 了解了MACD的基本知识点后,这里再来补充说明下通过TA-Lib库获得相关内容:"MACD"、"MACDsignal"和"MACDhist",因为TA-Lib库是国外人发明的,所以其中一些含义和国内的一些名字略有不同,不过基本思路是一致的:其中"MACD"对应的是国内的DIF值,"MACDsignal"对应的是国内的DEA值,"MACDhist"对应的则是国内MACD值的一半,也即DIF值-DEA值。 注意,如果不写开始及结束日期,直接写ts.get_hist_data会默认调取从当天往前3年的数据。此外,上面代码也可以简写成: 其运行结果就是当时的股价信息,如果收盘后运行的话获得的就是当日收盘价相关信息。如果觉得列数过多,可以通过DataFrame选取列的方法选取相应的列,代码如下: 通过TA-Lib库生成指数平滑异同移动平均线MACD值 通过如下代码可以获得股价的5日移动平均值和10日移动平均值: 2随机森林模型的基本原理 MACD值就是2×,也称之为MACD柱。故MACD指标是由两线一柱组合起来形成,快速线为DIF,慢速线为DEA,柱状为MACD。 模型训练完成后,我们就可以来使用模型并对模型的预测效果进行评估了。 将其打印输出,结果如下所示: 其中EMAtoday为当天的EMA值,Pricetoday为今天的收盘价,EMAyesterday为昨天的EMA值,α为平滑指数,一般取作2/,N表示天数,当N为6时,α相应为2/这称之为EMA即6日指数移动平均值。公式不断递归,直至第一个EMA值出现。 推荐通过PIP安装法来安装Tushare库,以Windows系统为例,具体方法是:通过Win+R组合键调出运行框,输入cmd后回车,然后在弹出框中输入pipinstalltushare后按一下Enter回车键的方法来进行安装。如果在3节讲到的JupyterNotebook编辑器中安装的话,只需要在代码框中输入!pipinstalltushare然后运行该行代码框即可。 然后计算根据策略预测后的收益率情况,代码如下: 通过如下代码可以更好的展示特征及其特征重要性: 数据随机:随机地从所有数据当中有放回地抽取数据作为其中一棵决策树的数据进行训练。举例来说,有1000个原始数据,有放回的抽取1000次,构成一组新的数据,作为某一个决策树的数据来进行模型的训练。 计算MACD值 股票数据是个时间序列数据,所以它的相关的一些数据处理和之前讲的模型稍有不同,这里我们先来进行一些简单的数据处理,然后再进行模型搭建。 这里再补充一些小的知识点:当DIF和DEA均大于0并向上移动时,一般表示为行情处于多头行情中,可以买入开仓或多头持仓;当DIF和DEA均小于0并向下移动时,一般表示为行情处于空头行情中,可以卖出开仓或观望;当DIF和DEA均大于0但都向下移动时,一般表示为行情处于下跌阶段,可以卖出开仓或观望;当DIF和DEA均小于0时但向上移动时,一般表示为行情即将上涨,股票将上涨,可以买入开仓或多头持仓。 下面要讲的衍生变量指标都是通过股票衍生变量生成库:TA-Lib库生成的,所以这里我们先讲解一下如何安装Ta-Lib库: 由上表可知,动量指标MOM值,当日收盘价close,以及high-low,MACD相关指标等特征变量对于预测下一天股价涨跌结果的影响较大。 RSI的计算公式其实很简单,如下所示: 通过如下代码可以获得历史分笔数据,分笔数据也即每笔成交的信息: 随机森林在bagging的基础上,再次对特征做了一次随机选择,比如对于自助采样后的每一个子数据集,我们并不会像决策数那样用到所有的特征,随机森林会从所有的特征中随机选择一个包含k个特征的子集。当有一条新数据进来,在随机森林的m棵树会各自给出一个答案,如果是分类任务,我们就选择投票法,如果是回归任务则一般选择平均值作为输出。不像决策树,越靠近根节点的特征重要性越高,在随机森林中,在每个特征都是有可能成为“主角”的,也不容易出现过拟合的问题。 通过set_index函数可以将日期列设置为行索引: 第6行通过fit函数训练模型;最后1行通过predict函数进行预测,预测结果如下: 通过如下代码将收益情况删除空值后可视化,并设置X轴刻度自动倾斜: “重视错误”,即在每一轮训练后改变训练数据的权值或概率分布,通过提高那些在前一轮被基础模型预测错误样例的权值,减小前一轮预测正确样例的权值,来使得分类器对误分的数据有较高的重视程度,从而提升模型的整体效果。 pre_close代表的是昨日收盘价,是通过shift函数将"close"这一列所有数往下移动一行并形成新的一列,正数1表示往下移动一行,如果是-1则表示往上移动一行; 模型搭建 随机森林分类模型简单代码演示如下所示: 此时的data如下表所示,其结果和我们通过手动算出来的结果是一致的。 我们将前90%的数据作为训练集,后10%的数据作为测试集,代码如下: 获得日线行情数据 首先强调最核心的一点:应该是今天的股价信息预测下一天的股价涨跌情况,所以y应该是下一天的股价变化情况。有的读者可能就会有疑问了,为什么是今天的信息预测下一天的股价涨跌情况呢?这个是因为特征变量中的很多数据都是只有当今天结束交易后才有数据,所以没有办法预测当天的股价涨跌情况,而且等收盘的时候股价涨跌情况也已经知道了,就没有必要预测了,所以我们是通过今天的股价信息来预测下一天的股价涨跌情况,相对应的代码如下所示: 这里假设原始价格为00元,然后第一天上涨2元,变为12元;然后第二天下跌1元,变为11元;第三天上涨2元;第四天下跌1元;第五天上涨2元;第六天下跌1元。此时的data如下所示,我们可以看到6日RSI为6和手动计算的一样。 获得分笔数据 其中上方蓝色的线为根据模型得到的收益曲线,下方黄色的线会股票本身的收益曲线,可以看到利用模型得到的效果还是不错的。 模型准确度评估 通过a.head可以查看生成的DataFrame前五行,如下所示: 由于当我们在计算像MA5这样的数据时,数据前四天对应的平均值是无法计算出来的,所以会产生空值NaN,我们通常会通过dropna函数删除空值,以免在后续计算中出现空值造成的问题。代码如下: DEA值是DIF值的9日加权移动均线值,计算方法类似EMA区别就是原来计算EMA9用的是close收盘价,而这里用的是DIF值,DEA值对应的连线也称之为慢速线。 上面演示了随机森林模型的简单代码实现,下面我们以量化金融中的一个基于多因子的股票涨跌预测模型来讲解随机森林模型在实战中的应用。 通过predict函数可以直接预测结果,代码如下: 划分好训练集和测试集之后,我们开始构建模型,代码如下: 其中open为开盘价、high为最高价、close为收盘价、low为最低价、volume为成交量、price_change为价格变化、p_change为价格涨跌幅、ma5为5日均线价格、v_ma5为5日均线成交量。这里也可以通过df.head只打印前5行。 根据当前数据,我们可以求5号的MA值为:/5=而6号的MA值则为:/5=之后以此类推,将一段时期内的股票价格平均值连成曲线,即为移动平均线。同理,MA10就是从计算当天起前10天的股票价格平均值。 将新构建的分类器和预选参数送入GridSearchCV,其中cv=6表示交叉验证6次。模型评价准则scoring参数这里选择默认参数:"accuracy",即按准确度评分,如果设置成"roc_auc"表示以ROC曲线的AUC评分作为模型评价准则。 这里将ktype参数设置为5可以调用5分钟级别的数据,这里可以把5换成130、60调取15分钟、30分钟、60分钟级别数据。因为tushare是个免费的库,所以对于分钟级别的数据提供有限,一旦要求获取分钟级别的数据的话,再写起始日期和结束日期就没有效果了,它只会把它有的数据提供给你,效果如下: 我们可以用下面代码来验证一下上面的计算过程: high-low表示/最低价; 上面学习了如何获得股票的基本数据,这一节我们来讲解如何通过股票的基本数据来获取一些衍生数据,例如股票技术分析常用的均线指标MA5与MA相对强弱指标RSI、动量指标MOM、指数移动平均值EMA、异同移动平均线MACD等。 训练集和测试集数据划分 获得分钟级别的数据 举例来说,对于如下的股价信息,我们来计算一下EMA 获取的y_pred_proba是一个二维数组,其中第一列为分类为-1的概率,第二列为分类为1的概率,如下所示: 首先我们来进行特征变量和目标变量的提取,代码如下: 通过如下代码可以生成指数移动平均值EMA: 计算DIF值和其9日加权移动均线值DEA 通过如下代码可以生成相对强弱指标RSI值: 获得的结果如下,和通过accuracy_score函数获得的结果是一致的。 Bagging的想法是采用类似于“民主投票”的方式,即每一个基础模型都有一票,最终结果通过所有基础模型投票,少数服从多数的原则产生预测结果。 下所示便是从新浪财经上截取的一张万科的股价和MACD技术指标的截,在最下面的框中两条折线就是DIF和DEA线,其中的柱状就是MACD柱,看到2020年1月3日的MACD值就是2×。 对于EMA指标而言,近期的股价比之前更久远的重要,不像MA指标那样一视同仁,这里EMA6指的便是6日指数移动平均值。此外,在计算下面要讲到的MACD指标时,EMA计算中的N一般选取12和26天,因此α相应为2/13和2/2其中EMA12称之为快的指数移动平均线,EMA26称之为慢的指数移动平均线。 第5行引入模型,并设置弱分类器的数量为也就是共有10个决策树模型作为基模型;random_state设置为12使得每次运行结果一致; 通过如下代码可以生成指数平滑异同移动平均线MACD值: 利用1节pandas库创建DataFrame相关知识点,将预测的y_pred和测试集实际的y_test汇总到一起,其中y_pred是一个numpy.ndarray一维数组结构,y_test为Series一维序列结构,所以这里都用list函数将其转换为列表,代码如下: 预测下一天的涨跌情况 通过如下代码可以获得上证指数等指数信息: 已知了预测结果,以及每天的股价变化率,我们就能来计算累计的收益率了,并根据收益率来绘制收益回测曲线,或者叫作净值曲线了。 股票数据处理与衍生变量生成 3参数调优 通过如下代码可以生成动量指标MOM值: 补充知识点:EMA的计算公式 补充知识点:get_k_data函数 随机森林回归模型简单代码演示如下所示: 为了保证模型的泛化能力,随机森林在建立每棵树的时候,往往会遵循两个基本原则:数据随机和特征随机。 3随机森林模型的代码实现 其中,MA是移动平均线的意思,"平均"是指最近n天收盘的算术平均线;"移动"是指我们在计算中,始终采用最近n天的价格数据。以求取的MA5为例,构造数据如下: 通过如下代码传入训练数据,并查看调参的最优结果: 我们这里计算MOM设置参数timeperiod=即假设我们要计算6号的MOM值,我们需要用6号的收盘价减去1号的收盘价即,6号MOM值为:2-2=7号的MOM值计算同理:4-4=将连续几天的MOM值连起来就构成一条反映股价涨跌变动的线。 获取特征的名称以及他们的特征重要性并按照“重要性”字段降序排列,得到结果如下所示: 首先使用tushare试着调用万科的历史数据,万科的股票代码为00000具体代码如下: 通过如下代码可以实时取得股票当前报价和成交信息: 其中EMA12和EMA26和上一知识点演示的EMA6计算步骤一致,不同的是计算公式中的α相应为2/13和2/2 这与之前设置的参数是一致的。 有了合适的数据后,我们就可以进行模型的搭建了,因为我们是根据多个特征进行的模型搭建,所以在量化金融领域,把根据多个特征搭建的模型也称之为多因子模型。 第3行中X是特征变量,其共有2个特征;y是目标变量,它是一个连续值; 2股票衍生变量生成 下载完成后,在自己选择的文件夹中,如下所示,在搜索框中输入cmd后按一下Enter回车键搜索: 通过get_k_data函数获取的数据没有像get_hist_data函数那样将日期默认设为行索引,这里的日期还是作为一个普通的列,如果想把这里的date列转为行索引,可以使用设置索引的set_index函数,代码如下: 通过如下代码我们可以分析各个特征变量的特征重要性: RSI中文名叫相对强弱指标,能够反映短期内涨势相对于跌势的强弱,也就是说RSI值越大,则涨势相对跌势越强,RSI值越小,则涨势相对于跌势越弱,帮助大家更好的去判断涨跌趋势。 可以看到前五组数据的预测准确度达到了100%,再次提醒下,这里y_test是对当天来说下一天的的股价涨跌情况,而预测的y_pred也是下一天的股价涨跌情况。 百度百科:MACD指标_百度百科 调用sklearn.ensemble中的RandomForestClassifier函数,并设置相关模型参数,我们来看一下其中几个参数的含义:max_depth:每个决策树的最大深度,这里设置树的最大深度为也即共3层;n_estimators:设置基模型:决策树模型的个数,这里设置为数字也就是说该随机森林中共有10个决策树;min_samples_leaf:在叶节点处所需的最小样本数,这里设置为数字也就是如果叶子节点的样本数小于10则停止分裂;random_state:随机状态参数,使得每次运行的结果都是一样的,数字1没有特殊含义,可以换成其他数字。 当MACD大于0时,也即快线DIF值大于慢线DEA值,即快线在慢线之上,表明上涨的走势正在进行中。其实这个思路和股票的移动平均线MA值有点类似:当股票的均值线MA5>MA10时,也表明上涨走势,不过MACD经过一系列加权,则更加严谨。反之当MACD小于0时,则表示下跌走势。 安装完TA_Lib库后,在Python中引入TA_Lib库的代码如下: 首先计算通过预测后一只股票的价格变化与原数据的价格变化,采用如下代码获取预测值,这里再次强调,这里是根据当天股价预测第二天的股价涨跌情况。 这里首先通过上一节的get_k_data函数获取从2015-01-01到2019-12-31的股票基本数据: 移动平均线指标MA值 引入模型并设置好相关参数后,通过fit函数即可训练模型。 这里多说一句,因为这里是使用get_k_data函数获取股票基本数据,日期是默认从小到大排列,如果是通过1节的get_hist_data函数获取股票基本数据,get_hist_data函数是默认根据日期由近及远的方式来排列,所以在通过rolling和mean函数求移动平均值的时候,要先通过sort_index函数将日期由开始日期到结束日期进行正序排列,代码如下: 感兴趣的读者可以验证一下,这里的"MACD"对应的就是国内的DIF值,也即"EMA12"列减去"EMA26"的值,"MACDhist"对应的就是国内MACD值的一半,也即DIF值-DEA值,也即"MACD"列减去"MACDsignal"列的值。 通过TA-Lib库生成动量指标MOM值 文章为作者独立观点,不代表股票交易接口观点y_pred_proba = model.predict_proba(X_test)
df = ts.get_realtime_quotes(["000002","000980","000981"])
日期 1号 2号 3号 4号 5号 6号 7号 股票价格 1.2 1.4 1.6 1.8 2.0 2.2 2.4 # 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) # 删除空值
grid_search = GridSearchCV(new_model, parameters, cv=6, scoring="accuracy")
df = ts.get_k_data("000002", start="2000-01-01", end="2019-01-31")
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()
0.580952380952381
df = ts.get_hist_data("000002", ktype="5")
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
df.set_index("date", inplace=True)
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
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") # 忽略警告信息,警告非报错,不影响代码执行
df = ts.get_hist_data("000002","2018-01-01", "2019-01-31")
df = df[["code","name","price","bid","ask","volume","amount","time"]]
df["MA5"] = df["close"].rolling(5).mean()
df["MA10"] = df["close"].rolling(10).mean()
X_test["strategy"] = (X_test["prediction"].shift(1) * X_test["p_change"] + 1).cumprod()
features = X.columns
importances = model.feature_importances_
a = pd.DataFrame()
a["特征"] = features
a["特征重要性"] = importances
a = a.sort_values("特征重要性", ascending=False)
N日平均上涨价格/(N日平均上涨价格+N日平均下跌价格) * 100
日期 上涨(元) 下跌(元) 1号 2 2号 1 3号 2 4号 1 5号 2 6号 1 df = ts.get_tick_data("000002", date="2018-12-12", src="/images/defaultpic.gif")
df = df.set_index("date")
[2.8]
X_test[["strategy", "origin"]].dropna().plot()
plt.gcf().autofmt_xdate()
plt.show()
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]]))
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:]
y = np.where(df["price_change"].shift(-1)> 0, 1, -1)
预测值 实际值 0 -1 -1 1 -1 -1 2 -1 -1 3 -1 -1 4 1 1 df.dropna(inplace=True) # 删除空值行,也可以写成df = df.dropna()
y_pred = model.predict(X_test)
model = RandomForestClassifier(max_depth=3, n_estimators=10, min_samples_leaf=10, random_state=1)
model.fit(X_train, y_train)
data = pd.DataFrame()
data["close"] = [10, 12, 11, 13, 12, 14, 13]
data["RSI"] = talib.RSI(data["close"], timeperiod=6)
日期 1号 2号 3号 4号 5号 6号 7号 股票价格 1 1 1 1 1 7 2 分类为-1的概率 分类为1的概率 0.52 0.48 0.52 0.48 0.53 0.47 0.51 0.49 0.47 0.53 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)
df["EMA12"] = talib.EMA(df["close"], timeperiod=12) # 12日指数移动平均线
df["EMA26"] = talib.EMA(df["close"], timeperiod=26) # 26日指数移动平均线
df["RSI"] = talib.RSI(df["close"], timeperiod=12)
0.580952380952381
df["MACD"], df["MACDsignal"], df["MACDhist"] = talib.MACD(df["close"], fastperiod=12, slowperiod=26, signalperiod=9)
a = pd.DataFrame() # 创建一个空DataFrame
a["预测值"] = list(y_pred)
a["实际值"] = list(y_test)
df = ts.get_index()
df["MOM"] = talib.MOM(df["close"], timeperiod=5)
EMAtoday = α * Pricetoday + ( 1 - α ) * EMAyesterday
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号 2号 3号 4号 5号 6号 股票收盘价 1.2 1.4 1.6 1.8 2.0 2.2 grid_search.fit(X_train, y_train)
grid_search.best_params_
import tushare as ts
df = ts.get_hist_data("000002", start="2018-01-01", end="2019-01-31")
df = ts.get_realtime_quotes("000002")
参数 意义 取值 n_estimators 弱分类器决策树的个数 取值为int型数据,默认取10 criterion 评判标准 字符串型,节点分裂条件的判别标准,取值为"entropy"信息熵和"gini"基尼系数,默认选择"gini";对于回归模型则默认为"mse",表示均方误差。 max_depth 基础模型的最大深度 整数或者None,如果为None,那么会扩展节点,直到所有叶子是纯净的,或者所有叶子包含少于min_samples_split的样本 min_samples_split 分割内部节点所需要的最小样本数量 如果为整数,那么该值为最小样本数量;如果为浮点型,这是一个百分比 min_samples_leaf 叶子节点上的最小样本数量 如果为整数,那么该值为最小样本数量;如果为浮点型,这是一个百分比 min_weight_fraction_leaf 叶子节点最小的样本权重和 默认取0,即不考虑权重问题,如果小于该数值,该叶子节点会和兄弟节点一起被剪枝(即剔除该叶子节点和其兄弟节点,并停止分裂)。如果较多样本有缺失值或者样本的分布类别偏差很大,则需考虑样本权重问题。 max_features 寻找最佳切割时要考虑的特征数量 int型,float型,string型或者None,如果为int型,代表要考虑的特征数量;如果为float型,即百分比;如果为"auto",代表sqrt(n_features);如果为"sqrt",和"auto"一样;如果为"log2",代表log2(n_features);如果为None,代表n_features;默认取"auto" max_leaf_nodes 最大叶子节点数 整数或者None,默认为None,如果为None,不限制叶子结点的数量 min_impurity_decrease 分裂节点阈值 如果节点的分裂导致不纯度的下降大于或等于该参数,则分裂该节点,浮点型,默认为0. min_impurity_split 停止树生长的阈值 如果节点的不纯度高于阈值,就进行分裂,否则就是叶子节点;取值为float型,默认为1e-7 bootstrap 是否有放回地采样 取值为True代表有放回地采样,取值为False代表建立每棵决策树时采取所有的数据;默认取True oob_score 是否使用带外样本来估计泛化精度 取值为True则代表选用带外样本(即bootstrap采样后剩下的样本)作为验证集,对训练结果进行验证,默认取False n_jobs 并行性 None值或int整数,指定并行性,默认值为None或者数字1,如果设置成-1,则表示将任务派发到所有CPU上 random_state 设定随机状态 取值范围为:{int整数, RandomState实例, None}。如果为整数,则指定了随机数生成器的种子,设置为任意整数后,例如“123”,则每次运行的结果都是一致的;如果为RandomState实例,则指定了随机数生成器;如果为None,则使用默认的随机数生成器。默认为None verbose 控制决策树建立过程的冗余度 整数型,默认为0,如果为0则不输出日志,如果为1,则每隔一段时间输出日志,大于1输出日志会更频繁。 warm_start 热启动 取值为True代表重新使用之前的结构去拟合样本并且加入更多的决策树,取值为False代表重新拟合随机森林模型,默认取False class_weight 指定类别权重 取值范围为:{字典, 字符串"balanced", None},取为字典时 : 字典给出每个分类的权重;取为"balanced" : 每个分类的权重与该分类在样本集中出现的频率成反比,代表样本量少的类别所对应的样本权重更高;取为None : 每个分类权重都为1。默认为None。该参数主要是为防止训练集某些类别的样本过多,导致训练结果过于偏向这些类别 df = df.set_index("date")
model.feature_importances_
import talib
X_test["prediction"] = model.predict(X_test)
df = ts.get_k_data("000002",start="2015-01-01",end="2019-12-31")
df["MA5"] = df["close"].sort_index().rolling(5).mean()