R 语言实现股票数据的预处理及分析

基于 R 语言的股票数据分析

一、实验介绍

1.1 实验内容

本实验是以股票数据作为分析背景,股票数据如何从雅虎财经板块上获取,观察股票每日价格和成交量数据开始,接着计算某一支股票数据中比较重要的日度收益率。然后通过各种股票线图进行技术分析,最后在一支股票的基础上同时分析多支股票的成交量,涨幅时间点,最后得出它们之间的相关性等数据特征。

1.2 实验知识点

  • 股票数据抓取
  • 股票数据线图绘制及技术分析
  • 股票日度收益率计算
  • 多支股票的相关性

1.3 实验环境

  • R version 3.4.1
  • Xfce终端

1.4 适合人群

本课程难度为简单,属于初级级别课程,需要一定金融股票知识和 R 语言的基础背景。

二、实验内容

2.1 相关股票背景介绍

2.1.1 收益率

在股票市场中大家十分关注收益率的日度变化值。每天的市场都会开盘和收盘(除开周六、日),计算收益率的方法可以基于开盘情况也可以基于收盘情况,不过通常的做法还是以收盘价格为基准来计算收益率。在收益率中的计算可以分为简单收益率(或者叫百分数收益率)和对数收益率,相对于简单收益率,用得更多的是对数收益率,因为对数收益率具有严谨的“对称性”,同时也具有更容易的统计特性。

简单收益率:

对数收益率:

2.2 预建模

在实际建模之前,往往需要我们对数据进行预处理和分析:计算均值和方差,数据之间做相关性分析,回归分析等等。

数据具体要做什么变化的方法有很多,而到底选择何种变换也同样取决于我们要研究的数据本身以及目的。

在本实验中,主要就是完成对股票数据的初期分析,为后面的实验建模打下一定的基础。

三、实验步骤

3.1 股票数据获取

R 语言是一个开源的软件工具,它提供了很多 package 软件包支持在线下载股票数据,因此我们很容易通过调用相应的包从网络上获取需要的数据,下面为读者介绍两种比较好用的数据获取方法。

3.1.1 quantmod 包

quantmod 包是做金融技术分析最有用的包之一。

调用 'quantmod' 软件包,可以直接从‘yahoo’、‘google’等网站的财经板块下载我们需要的股票数据。(在调用 之前,需要载入它的依赖包 ‘zoo’、‘xts’、‘TTR’)

> library(quantmod)

> library(zoo)
> library(xts)
> library(TTR)

通过 ‘quantmod’ 包里的 ‘getSymbols’ 函数下载苹果公司从 2017 年初到当前的股票数据。选用的数据来源是 ‘yahoo’ 网,也可以从多个来源下载股票数据,

包括 yahoo, google, MySQL, FRED, csv, RData 和 oanda。

> getSymbols("AAPL",from = "2017-01-01",to = Sys.Date(),src = "yahoo")

查看前几行的数据

> head(AAPL)

3.1.2 tseries 包

tseries 包主要用于时间序列分析与计算金融。

首先下载 tseries 包,然后载入。

> install.packages("tseries")
> library(tseries)

调用 get.hist.quote 函数获取谷歌公司的股票数据。

> goog<-get.hist.quote(instrument = "GOOG", start="2017-01-01", end="2017-07-01",quote = "AdjClose")
> head(goog)

quote = c("Open", "High", "Low", "Close"),AdjClose 是向前复权的价格

provider = c("yahoo","oanda"),默认下载是 yahoo

下载以后的默认对象是 zoo

instrument = "GOOG" 获取股票的代码

3.2 绘制股票图

表 3-1 作图函数

函数
chartSeries
chartTheme
candleChart
lineChart
barChart

3.2.1 以 chartSeries 为例做 K 线图

chartSeries(stock)

chartSeries(stock,theme='white')

chartSeries(stock,theme='white.mono')

中国习惯是涨红跌绿

> chartSeries(AAPL,up.col='red', dn.col='green',theme="white")

增加参数类型

> chartSeries(AAPL,name = "AAPLBARCHART",subset="2017-01-01::2017-07-17"type="bars")
> chartSeries(AAPL,name = "AAPLLINECHART",subset="2017-01-01::2017-07-17"type="line")
> chartSeries(AAPL,name = "AAPLCANDCHART",subset="2017-01-01::2017-07-17"type="candlesticks")

3.2.2 技术分析图

表 3-2 技术函数

函数 定义
addADX() 趋势衡量指标
addBBands() 求出股价的标准差及信赖区间
addMACD() 指数平滑异同移动平均线
addCCI() 测量股价是否超出常态分布范围
addRSI() 测量速度和变化的价格变动
addVo() 测量成交量
addWPR() 表示市场处于超卖还是超买状态
addATR() 测量价格的波动性指标
addSAR() 显示市场价格变化的趋势
addDPO() 排除价格趋势的震荡指标

(1)addBBands() 布林线指标

原理:一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“股价信道”的概念,其认为股价信道的宽窄随着股价波动幅度的大小而变化,二期股价信道又具有变异性,它会随着股价的变化而自动调整。正是由于它的灵活性、直观性和趋势性的特点,BOLL (布林)指标渐渐成为投资者广为应用的市场上热门指标。

> chartSeries(AAPL,up.col='red', dn.col='green',theme="white")
> addBBands(n=14,sd=2,draw='bands')
#只画区间还有 percent 百分比 width 宽度

(2)addADX() 平均趋向指标

特点:ADX无法告诉你趋势的发展方向。但是,如果趋势存在,ADX可以衡量趋势的强度。ADX读数上升,代表趋势转强;如果ADX读数下降,趋势转弱。

缺点:单就ADX本身来说,由于指标落后价格走势,所以算不上很好的指标,不适合单就ADX进行操作。不过如果和其他指标配合运用,ADX可以确认市场是否存在趋势,并衡量趋势的强度。

表 3-2 技术函数

ADX读数 意义
ADX>= 30 趋势就可以是为强劲
20 <= ADX < 30 属于中性读数
ADX< 20 代表市场动能偏。期间内,行情来回游走,没有明显的方向
> chartSeries(AAPL,up.col='red', dn.col='green',theme="white")
> addADX()

(3) addMACD( ) 指数平滑异同移动平均线

这是一个常用的震荡指标,由Gerald Appel发明。用序列的快速移动平均线减去慢速移动平均线,可用来识别市场趋势。

> chartSeries(AAPL,up.col='red', dn.col='green',theme="white")
> addMACD()

可以把上面介绍的技术合到一张图上

> chartSeries(AAPL,up.col='red', dn.col='green',theme="white",TA=c(addBBands(),addMACD(),addADX(),addVo()))

剩余的函数读者可自行实验讨论,结果报告可提交到实验平台~

3.3 计算某支股票日度收益率

3.3.1 简单收益率

我们可以先通过 R 语言来手工计算简单收益率

> close <- AAPL[,4]
> close1 <- lag(close,1)
> head(close1)

> calclose <- merge(close,close1)
> simplerate <- (close-close1)/close1
> names(simplerate)="simplerate"
> calrate=merge(calclose,simplerate)
> head(calrate)

3.3.2 对数收益率

使用 R 里的 ‘PerformanceAnalytics’ 包来进行计算,先载入安装包

> install.packages("PerformanceAnalytics")
> library(PerformanceAnalytics)

调用 periodReturn 函数计算不同阶段的收益率,type 选择的是对数类型。

> rate=periodReturn(close,period="daily",type="log")
> head(rate)

3.4 抓取多支股票

利用 quantmod 包中的 ETL 函数下载 Apple, Microsoft, Oracle, Google 四家公司股票行情数据,并进行简要分析

> library(quantmod)
> new.environment <- new.env()

抓取四家公司的全部股票行情数据

> getSymbols(c("AAPL", "ORCL", "MSFT", "GOOG"), src = "yahoo", env = new.environment)

查看抓取的全量数据情况

> str(get("AAPL", env = new.environment))
> str(get("ORCL", env = new.environment))
> str(get("MSFT", env = new.environment))
> str(get("GOOG", env = new.environment))

3.4.1 求出股票总成交量

计算出 Apple 公司在 2017.1-2017.7 的股票总成交量使用情况

> getSymbols("AAPL", src = "yahoo", from = "2017-01-01", to = "2017-07-01")
> summary(AAPL)

计算 2017 年 1 月到 6 月的股票总成交量

>sum(Vo(AAPL))

3.5 分析股票暴涨暴跌的时间点

找出这些股票暴涨暴跌的时间点(例如开盘价或收盘价比前一天涨跌幅度超过 2% ),通过搜索引擎寻找是什么原因导致这些暴涨暴跌,观察(或用程序分析)数据,看就暴涨暴跌事件是否有可以利用的买卖规律

3.5.1 查看各公司涨跌幅超过 2% 的情况

查看 AAPL 涨跌幅超过 2% 的情况

> AAPL <- Delt(Cl(get("AAPL", env = new.environment)))
> length(AAPL[which(AAPL > 0.02), ])
> plot(AAPL[which(AAPL > 0.02), ])

查看 ORCL 涨跌幅超过 2% 的情况

> ORCL <- Delt(Cl(get("ORCL", env =new.environment)))
> length(ORCL[which(ORCL > 0.02), ])
> plot(ORCL[which(ORCL > 0.02), ])

查看 MSFT 涨跌幅超过 2% 的情况

> MSFT <- Delt(Cl(get("MSFT", env = new.environment)))
> length(MSFT[which(MSFT > 0.02), ])
> plot(MSFT[which(MSFT > 0.02), ])

查看 GOOG 涨跌幅超过 2% 的情况

>GOOG <- Delt(Cl(get("GOOG", env = new.environment)))
>length(GOOG[which(GOOG > 0.02), ])
>plot(GOOG[which(GOOG > 0.02), ])

3.6 相关性判断

3.6.1 调整数据

截取一段时间内这四家公司股价数据(注意分红派息除权对股价的影响),用 R 中的相关性分析判断股价之间的相关性。

> periodicity(get("GOOG", env = new.environment))

> getSymbols(c("AAPL", "ORCL", "MSFT", "GOOG"), src = "yahoo", env = new.environment, from = "2017-01-03", to = "2017-07-01")
# 将四家公司股票的每天调整价格整理在一个数据框中
> m <- cbind(Ad(get("AAPL", env = new.environment)), Ad(get("ORCL", env = new.environment)), Ad(get("MSFT", env = new.environment)), Ad(get("GOOG", env = new.environment)))

3.6.2 分析判断相关性并绘图

利用 corr.test() 函数计算四家公司股票的调整价格的相关系数和概率。

> library(psych)
> corr.test(as.data.frame(m))

绘制相关性图

> install.packages("corrplot")
> library(corrplot)
> corrplot.mixed(cor(m), lower = "ellipse", upper = "circle")

从相关系数中容易看出股票 GOOG 与 MSFT 间的相关系数快达到了 1 ,属于强相关;APPL 与 MSFT、GOOG 、ORCL 股票间的相关系数也超过 0.7,属于明显相关。

四 总结

本次实验在股票数据的预建模处理上,运用到了 quantmod 包进行数据获取,然后通过图形的可视化处理可以将技术分析更加直观,再通过多支股票的横向分析,得出它们之间的相关性。通过本次实验可以为股票分析打下基础,为后面的建模分析做好铺垫。

你可能感兴趣的:(实验楼课程,机器学习,R)