本实验是以股票数据作为分析背景,股票数据如何从雅虎财经板块上获取,观察股票每日价格和成交量数据开始,接着计算某一支股票数据中比较重要的日度收益率。然后通过各种股票线图进行技术分析,最后在一支股票的基础上同时分析多支股票的成交量,涨幅时间点,最后得出它们之间的相关性等数据特征。
本课程难度为简单,属于初级级别课程,需要一定金融股票知识和 R 语言的基础背景。
在股票市场中大家十分关注收益率的日度变化值。每天的市场都会开盘和收盘(除开周六、日),计算收益率的方法可以基于开盘情况也可以基于收盘情况,不过通常的做法还是以收盘价格为基准来计算收益率。在收益率中的计算可以分为简单收益率(或者叫百分数收益率)和对数收益率,相对于简单收益率,用得更多的是对数收益率,因为对数收益率具有严谨的“对称性”,同时也具有更容易的统计特性。
简单收益率:
对数收益率:
在实际建模之前,往往需要我们对数据进行预处理和分析:计算均值和方差,数据之间做相关性分析,回归分析等等。
数据具体要做什么变化的方法有很多,而到底选择何种变换也同样取决于我们要研究的数据本身以及目的。
在本实验中,主要就是完成对股票数据的初期分析,为后面的实验建模打下一定的基础。
R 语言是一个开源的软件工具,它提供了很多 package 软件包支持在线下载股票数据,因此我们很容易通过调用相应的包从网络上获取需要的数据,下面为读者介绍两种比较好用的数据获取方法。
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)
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-1 作图函数
函数 |
---|
chartSeries |
chartTheme |
candleChart |
lineChart |
barChart |
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 技术函数
函数 | 定义 |
---|---|
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()))
剩余的函数读者可自行实验讨论,结果报告可提交到实验平台~
我们可以先通过 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)
使用 R 里的 ‘PerformanceAnalytics’ 包来进行计算,先载入安装包
> install.packages("PerformanceAnalytics")
> library(PerformanceAnalytics)
调用 periodReturn 函数计算不同阶段的收益率,type 选择的是对数类型。
> rate=periodReturn(close,period="daily",type="log")
> head(rate)
利用 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))
计算出 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))
找出这些股票暴涨暴跌的时间点(例如开盘价或收盘价比前一天涨跌幅度超过 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), ])
截取一段时间内这四家公司股价数据(注意分红派息除权对股价的影响),用 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)))
利用 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 包进行数据获取,然后通过图形的可视化处理可以将技术分析更加直观,再通过多支股票的横向分析,得出它们之间的相关性。通过本次实验可以为股票分析打下基础,为后面的建模分析做好铺垫。