R语言使用机器学习算法预测股票市场

quantmod 介绍

quantmod 是一个非常强大的金融分析报, 包含数据抓取,清洗,建模等等功能.

1. 获取数据 getSymbols

  默认是数据源是yahoo

获取上交所股票为 getSymbols("600030.ss"), 深交所为 getSymbols("000002.sz").  ss表示上交所, sz表示深交所

2. 重命名函数 setSymbolLookup

3. 股息函数 getDividends

4. 除息调整函数 adjustOHLC

5. 除权除息函数 getSplits

6. 期权交易函数 getOptionChain

7. 财务报表 getFinancials / getFin

> library(quantmod)
> setSymbolLookup(WANKE=list(name="000002.sz", src="yahoo"))
> getSymbols("WANKE")
[1] "WANKE"
Warning message:
000002.sz contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them.
> head(WANKE)
           000002.SZ.Open 000002.SZ.High 000002.SZ.Low 000002.SZ.Close
2008-03-17         14.221         14.221        14.221           13.65
2008-03-18             NA             NA            NA              NA
2008-03-19             NA             NA            NA              NA
2008-03-20             NA             NA            NA              NA
2008-03-21             NA             NA            NA              NA
2008-03-24             NA             NA            NA              NA
           000002.SZ.Volume 000002.SZ.Adjusted
2008-03-17        123340858           13.10156
2008-03-18               NA                 NA
2008-03-19               NA                 NA
2008-03-20               NA                 NA
2008-03-21               NA                 NA
2008-03-24               NA                 NA
> 

机器学习 Classification

首先, 简化问题, 只预测股票的涨跌情况. 问题就变成一个分类问题, 把历史数据分为涨跌两种情况. 进一不简化, 涨跌情况只与历史数据情况有关.

我们使用Naive Bayes classifier (朴素的贝叶斯分类) 作为学习方法. 朴素的贝叶斯的定义为: 给定类别A条件下,所有的属性Ai相互独立

R语言的实现如下

> library(lubridate)
#日期包
> library(e1071)
#朴素贝叶斯包
> library(quantmod)
> setSymbolLookup(WANKE=list(name="000002.sz", src="yahoo"))
> getSymbols("WANKE")
[1] "WANKE"

> head(WANKE)
           000002.SZ.Open 000002.SZ.High 000002.SZ.Low 000002.SZ.Close
2008-03-17         14.221         14.221        14.221           13.65
2008-03-18             NA             NA            NA              NA
2008-03-19             NA             NA            NA              NA
2008-03-20             NA             NA            NA              NA
2008-03-21             NA             NA            NA              NA
2008-03-24             NA             NA            NA              NA
           000002.SZ.Volume 000002.SZ.Adjusted
2008-03-17        123340858           13.10156
2008-03-18               NA                 NA
2008-03-19               NA                 NA
2008-03-20               NA                 NA
2008-03-21               NA                 NA
2008-03-24               NA                 NA
> tail(WANKE)
           000002.SZ.Open 000002.SZ.High 000002.SZ.Low 000002.SZ.Close
2017-07-31          23.52          23.58         23.10           23.37
2017-08-01          23.35          23.55         23.20           23.42
2017-08-02          23.45          24.12         23.43           23.58
2017-08-03          23.58          23.58         22.79           23.11
2017-08-04          23.00          23.06         22.71           22.84
2017-08-07          22.82          23.05         22.68           22.71
           000002.SZ.Volume 000002.SZ.Adjusted
2017-07-31         30942482              23.37
2017-08-01         20952262              23.42
2017-08-02         35391017              23.58
2017-08-03         45518939              23.11
2017-08-04         29612306              22.84
2017-08-07         23409149              22.71
> 

> startDate <- as.Date("2010-01-01")
> endDate <- as.Date("2017-01-01")
> DayofWeek <- wday(WANKE, label=TRUE)
> PriceChange <- Cl(WANKE) - Op(WANKE)
#收盘减去开盘
> Class <- ifelse(PriceChange > 0, "UP", "DOWN")
#大于0就是涨
> DataSet <- data.frame(DayofWeek, Class)

> MyModel <- naiveBayes(DataSet[,1], DataSet[,2])
> MyModel

Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = DataSet[, 1], y = DataSet[, 2])

A-priori probabilities:
DataSet[, 2]
     DOWN        UP
0.5148148 0.4851852 

Conditional probabilities:
            x
DataSet[, 2]       Sun       Mon      Tues       Wed     Thurs       Fri
        DOWN 0.0000000 0.2374101 0.1510791 0.2158273 0.1870504 0.2086331
        UP   0.0000000 0.1603053 0.2442748 0.1908397 0.2137405 0.1908397
            x
DataSet[, 2]       Sat
        DOWN 0.0000000
        UP   0.0000000

> 
整个dataset的涨跌概率
DataSet[, 2]
     DOWN        UP
0.5148148 0.4851852
基于这个涨跌概率下, 每天的涨跌概率
Conditional probabilities:
            x
DataSet[, 2]       Sun       Mon      Tues       Wed     Thurs       Fri
        DOWN 0.0000000 0.2374101 0.1510791 0.2158273 0.1870504 0.2086331
        UP   0.0000000 0.1603053 0.2442748 0.1908397 0.2137405 0.1908397
            x
DataSet[, 2]       Sat
        DOWN 0.0000000
        UP   0.0000000

模型改进

指数移动平均值 EMA (exponential moving average)

> W <- na.omit(WANKE)
> DayofWeek <- wday(W, label=TRUE)
> PriceChange <- Cl(W) - Op(W)
> Class <- ifelse(PriceChange > 0, "UP", "DOWN")
> EMA5 <- EMA(Op(W), n = 5)
> EMA10 <- EMA(Op(W), n = 10)
> EMACross <- EMA5 -EMA10
> EMACross <- round(EMACross, 2)
> DataSet2 <- data.frame(DayofWeek, EMACross, Class)
> DataSet2<-DataSet2[-c(1:10),]
> head(DataSet2)
           DayofWeek   EMA X000002.SZ.Close
2016-07-14     Thurs  0.11             DOWN
2016-07-15       Fri  0.04             DOWN
2016-07-18       Mon  0.00             DOWN
2016-07-19      Tues -0.10             DOWN
2016-07-20       Wed -0.23             DOWN
2016-07-21     Thurs -0.28             DOWN
> tail(DataSet2)
           DayofWeek   EMA X000002.SZ.Close
2017-07-31       Mon -0.34             DOWN
2017-08-01      Tues -0.31               UP
2017-08-02       Wed -0.26               UP
2017-08-03     Thurs -0.19             DOWN
2017-08-04       Fri -0.24             DOWN
2017-08-07       Mon -0.27             DOWN

> length(DayofWeek)
[1] 270
> TrainingSet<-DataSet2[1:200,]
> TestSet<-DataSet2[201:270,]
> EMACrossModel<-naiveBayes(TrainingSet[,1:2],TrainingSet[,3])
> EMACrossModel

Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = TrainingSet[, 1:2], y = TrainingSet[,
    3])

A-priori probabilities:
TrainingSet[, 3]
DOWN   UP
 0.5  0.5 

Conditional probabilities:
                DayofWeek
TrainingSet[, 3]  Sun  Mon Tues  Wed Thurs  Fri  Sat
            DOWN 0.00 0.22 0.13 0.24  0.18 0.23 0.00
            UP   0.00 0.16 0.27 0.17  0.23 0.17 0.00

                EMA
TrainingSet[, 3]    [,1]      [,2]
            DOWN  0.0333 0.4119553
            UP   -0.0177 0.4191522

> table(predict(EMACrossModel,TestSet),TestSet[,3],dnn=list(‘predicted‘,‘actual‘))
         actual
predicted DOWN UP
     DOWN   16 21
     UP     13 10
> 

参考文献

quantmod

http://www.quantmod.com/,

https://github.com/dengyishuo/Notes/tree/master/quantmod

Naive Bayes classifier

http://blog.csdn.net/sulliy/article/details/6629201

Introduction to Use Machine Learning by R

https://www.inovancetech.com/blogML2.html

时间: 2024-10-03 07:08:35

R语言使用机器学习算法预测股票市场的相关文章

大数据分析学习之使用R语言实战机器学习视频课程

大数据分析学习之使用R语言实战机器学习网盘地址:https://pan.baidu.com/s/1Yi9H6s8Eypg_jJJlQmdFSg 密码:0jz3备用地址(腾讯微云):https://share.weiyun.com/5tk6j1Z 密码:rdia9t 机器学习的核心主要侧重于找出复杂数据的意义.这是一个应用广泛的任务,机器学习的使用是非常广泛的. 本课程主要分为两个阶段,第一个部分:掌握R语言的处理数据的基本语法.第二部分:介绍机器学习原理,并通过大量的案例,为学员介绍R语言通过机

R语言之Apriori算法应用

一. 概念 关联分析用于发现隐藏在大型数据集中的有意义的联系.所发现的联系可以用关联规则(association rule)或频繁项集的形式表示. 项集:在关联分析中,包含0个或多个项的集合被称为项集(itemset).如果一个项集包含k个项,则称它为k-项集.例如:{啤酒,尿布,牛奶,花生} 是一个4-项集.空集是指不包含任何项的项集. 关联规则(association rule):是形如 X → Y 的蕴含表达式,其中X和Y是不相交的项集,即:X∩Y=∅.关联规则的强度可以用它的支持度(su

R语言与分类算法的绩效评估(转)

关于分类算法我们之前也讨论过了KNN.决策树.naivebayes.SVM.ANN.logistic回归.关于这么多的分类算法,我们自然需要考虑谁的表现更加的优秀. 既然要对分类算法进行评价,那么我们自然得有评价依据.到目前为止,我们讨论分类的有效性都是基于分类成功率来说的,但是这个指标科学吗?我们不妨考虑这么一个事实:一个样本集合里有95个正例,5个反例,分类器C1利用似然的思想将所有的实例均分成正例,分类成功率为95%:分类器C2成功分出了80个正例,3个反例,分类成功率仅83%.我们可以说

数据分析与挖掘 - R语言:KNN算法

一个简单的例子!环境:CentOS6.5Hadoop集群.Hive.R.RHive,具体安装及调试方法见博客内文档. KNN算法步骤:需对所有样本点(已知分类+未知分类)进行归一化处理.然后,对未知分类的数据集中的每个样本点依次执行以下操作:1.计算已知类别数据集中的点与当前点(未知分类)的距离.2.按照距离递增排序3.选取与当前距离最小的k个点4.确定前k个点所在类别的出现频率5.返回前k个点出现频率最高的类别作为当前点的预测类别 编写R脚本: #!/usr/bin/Rscript #1.对i

数据分析与挖掘 - R语言:贝叶斯分类算法(案例三)

案例三比较简单,不需要自己写公式算法,使用了R自带的naiveBayes函数. 代码如下: > library(e1071)> classifier<-naiveBayes(iris[,1:4], iris[,5]) #或写成下面形式,都可以. > classifier<- naiveBayes(Species ~ ., data = iris) #其中Species是类别变量 #预测 > predict(classifier, iris[1, -5]) 预测结果为:

R语言的ARIMA模型预测

R通过RODBC连接数据库 stats包中的st函数建立时间序列 funitRoot包中的unitrootTest函数检验单位根 forecast包中的函数进行预测 差分用timeSeries包中diff stats包中的acf和pacf处理自相关和偏自相关stats包中的arima函数模型

R语言 随机森林算法

install.packages("randomForest")#安装R包 library(party)#输入数据 library(randomForest)#引入分析包 output.forest <- randomForest(nativeSpeaker ~ age + shoeSize + score, data = readingSkills)#创建随机森林 print(output.forest)#查看 print(importance(output.forest,ty

R语言:EM算法和高斯混合模型的实现

原文 :http://tecdat.cn/?p=3433 本文我们讨论期望最大化理论,应用和评估基于期望最大化的聚类. 软件包 install.packages("mclust"); require(mclust) ## Loading required package: mclust ## Package 'mclust' version 5.1 ## Type 'citation("mclust")' for citing this R package in p

数据分析与挖掘 - R语言:贝叶斯分类算法(案例二)

接着案例一,我们再使用另一种方法实例一个案例 直接上代码: #!/usr/bin/Rscript library(plyr) library(reshape2) #1.根据训练集创建朴素贝叶斯分类器 #1.1.生成类别的概率 ##计算训练集合D中类别出现的概率,即P{c_i} ##输入:trainData 训练集,类型为数据框 ## strClassName 指明训练集中名称为 strClassName列为分类结果 ##输出:数据框,P{c_i}的集合,类别名称|概率(列名为 prob) cla