文章目录
本次试用使用的os是ubuntu,r-base是2.15版本
quantmod的ETL函数下载Apple,Microsoft,Oracle,Google四家公司全量股票行情数据 1)求出Apple公司在2013.1-2013.10的股票总成交量使用 这个比较简单,代码如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| > myenv<-new.env() > getSymbols("AAPL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31") > ls(envir=myenv) [1] "AAPL" > head(get("AAPL",env=myenv)) AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted 2013-01-02 553.82 555.00 541.63 549.03 20018500 532.39 2013-01-03 547.88 549.67 541.00 542.10 12605900 525.67 2013-01-04 536.97 538.63 525.83 527.00 21226200 511.03 2013-01-07 522.00 529.30 515.20 523.90 17291300 508.02 2013-01-08 529.21 531.89 521.25 525.31 16382400 509.39 2013-01-09 522.50 525.01 515.99 517.10 14557300 501.43 > sum(Vo(get("AAPL",env=myenv))) [1] 3219250600
|
可以得出期间的成交量是3219250600,当然单位是美元
2)找出这些股票暴涨暴跌的时间点(例如开盘价或收盘价比前一天涨跌幅度超过2%),通过搜索引擎寻找是什么原因导致这些暴涨暴跌,观察(或用程序分析)数据,看就暴涨暴跌事件是否有可以利用的买卖规律 Apple,Microsoft,Oracle,Google的股票简称分别是AAPL,MSFT,ORCL,GOOGL。yahoo上还有一个代码是GOOG的Google公司,很奇怪,只有2014-03-28至2014-04-25的数据,但是从新闻上看,Google是从2004年开始就上市了,所以之前的哪个GOOGL应该是正确的股票代码。 这个略有一些麻烦,本次实验采用的数据,基本都是从yahoo finance上拿下来的数据,Google finance中的数据似乎是有一些问题,直接用getSymbols函数得到的数据不能显示日期。当然,这个应该是Quantmod包的bug(而且不止这一个,后面会说),不清楚这是否与我的r-base的版本有关。 代码和之前比较类似,如下,
1 2 3 4 5 6 7 8
| > getSymbols("MSFT",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31") [1] "MSFT" > getSymbols("ORCL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31") [1] "ORCL" > getSymbols("GOOGL",env=myenv,src="yahoo",from="2013-01-01",to="2014-10-31") [1] "GOOGL" > ls(envir=myenv) [1] "AAPL" "GOOGL" "MSFT" "ORCL"
|
为了可以获得公平的比对,还需要获得股票派息和拆分的数据,代码分别如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| > getDividends("GOOGL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > getDividends("AAPL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > getDividends("MSFT",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > getDividends("ORCL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > head(get("GOOGL.div",env=myenv)) NULL > head(get("AAPL.div",env=myenv)) [,1] 2013-02-07 2.65 2013-05-09 3.05 2013-08-08 3.05 > head(get("MSFT.div",env=myenv)) [,1] 2013-02-19 0.23 2013-05-14 0.23 2013-08-13 0.23 > head(get("ORCL.div",env=myenv)) [,1] 2013-07-10 0.12 2013-10-04 0.12 > > getSplits("GOOGL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > getSplits("AAPL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > getSplits("MSFT",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > getSplits("ORCL",env=myenv,src="yahoo",from="2013-01-01",to="2013-10-31",auto.assign=TRUE) > head(get("GOOGL.spl",env=myenv)) [1] NA > head(get("AAPL.spl",env=myenv)) [1] NA > head(get("MSFT.spl",env=myenv)) [1] NA > head(get("ORCL.spl",env=myenv)) [1] NA >
|
从结果来看,所有股票在此期间都无拆分,GOOGL在此期间无派息,AAPL,MSFT,ORCL分别派息3、3、2次。顺便说一下,getSplits这个函数的help里面有bug,其中提到
If auto.assign is TRUE, the symbol will be written to the
environment specified in ‘env’ with a .div appended to the name.
getSplits的结果存在.div扩展名的变量中,而实际上是存在.spl扩展名的变量中,作者应该是照抄了getDividends的help。 下面以AAPL的股票为例,计算暴涨(up 2%)和暴跌(down 2%)的日期,为了计算正确,需要将前一日收盘价根据派息情况做调整,比如,如果前一日收盘为$100,但是派息$2,那么调整后的收盘价为$98(=100-2),计算调整后收盘价格的代码如下,
1 2
| > all_zero<-(xts(matrix(0,nrow=211, ncol=1)[,1], order.by=index(Cl(get("AAPL",env=myenv))))) > AAPL_mod_cl<-Cl(get("AAPL",env=myenv))-merge(all_zero, get("AAPL.div",env=myenv), fill = 0)[,2]
|
虽然看上去只有2行代码,可是我查了好久的文档才找到,其中函数xts和merge的help可以参考r的xts的帮助文档。调整后的收盘价存在AAPL_mod_cl中,下面计算暴涨(up 2%)和暴跌(down 2%)的日期,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| > AAPL_updown<-Delt(AAPL_mod_cl,Op(get("AAPL",env=myenv)), k=1) > head(AAPL_updown) Delt.1.arithmetic 2013-01-02 NA 2013-01-03 -0.002094603 2013-01-04 -0.009463199 2013-01-07 -0.009487666 2013-01-08 0.010135522 2013-01-09 -0.005349222 > AAPL_updown_dates<-AAPL_updown[AAPL_updown > 0.02 | AAPL_updown < -0.02] > AAPL_updown_dates Delt.1.arithmetic 2013-01-10 0.02214272 2013-01-14 -0.03386508 2013-01-24 -0.10507578 2013-04-24 -0.03099993 2013-07-24 0.04759063 2013-09-04 0.02247329 2013-09-11 -0.05585881 2013-09-23 0.06138080
|
先用Delt函数计算AAPL前一日收盘价(调整后的)和下一日开盘价之间的差异,即AAPL_updown,然后再将AAPL_updown中>2%和<-2%的数据抽取出来即可,如上述结果,AAPL的股票有8天是暴涨暴跌的。还有,Delt的help要仔细看,help里面的例子提到
Delt(Stock.Open,Stock.Close) #Open to Close pct. change
Delt(Stock.Open,Stock.Close,k=0:2) #...for 0,1, and 2 periods
例子是计算一段时间内的总体的开盘价(第1天的开盘价)和总体的收盘价(最后1天的收盘价)之间的差异,对于我们的这个例子,要把收盘价放在第1个参数,第2天的开盘价放第二个参数。 同样的方法可以计算其他3个股票,因为GOOGL没有派息和拆分,所以其调整后收盘价和原收盘价一样,以下是代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| > GOOGL_mod_cl<-Cl(get("GOOGL",env=myenv)) > GOOGL_updown<-Delt(GOOGL_mod_cl,Op(get("GOOGL",env=myenv)), k=1) > GOOGL_updown_dates<-GOOGL_updown[GOOGL_updown > 0.02 | GOOGL_updown < -0.02] > GOOGL_updown_dates Delt.1.arithmetic 2013-01-23 0.04712109 2013-07-19 -0.02643080 2013-10-18 0.09877474 > MSFT_mod_cl<-Cl(get("MSFT",env=myenv))-merge(all_zero, get("MSFT.div",env=myenv), fill = 0)[,2] > MSFT_updown<-Delt(MSFT_mod_cl,Op(get("MSFT",env=myenv)), k=1) > MSFT_updown_dates<-MSFT_updown[MSFT_updown > 0.02 | MSFT_updown < -0.02] > MSFT_updown_dates Delt.1.arithmetic 2013-04-11 -0.03896962 2013-04-19 0.02882945 2013-07-19 -0.08577878 2013-08-23 0.08582896 2013-09-03 -0.04940120 2013-10-25 0.06405694 > ORCL_mod_cl<-Cl(get("ORCL",env=myenv))-merge(all_zero, get("ORCL.div",env=myenv), fill = 0)[,2] > ORCL_updown<-Delt(ORCL_mod_cl,Op(get("ORCL",env=myenv)), k=1) > ORCL_updown_dates<-ORCL_updown[ORCL_updown > 0.02 | ORCL_updown < -0.02] > ORCL_updown_dates Delt.1.arithmetic 2013-03-21 -0.08358960 2013-06-21 -0.07527853 2013-08-27 -0.02133581
|
可见,GOOGL,MSFT,ORCL的暴涨暴跌的天数分别是3,6,2。造成股票大幅波动的原因很多,列举部分:微软 2013-07-09,可以参考这里;Oracle 2013-03-21,可以参考这里;Google 2013-10-18,可以参考这里;苹果 2013-01-24,可以参考这里。基本上,造成股价大幅度变动的时间点都在发布财报的时候,也有不是财报影响的,例如:苹果 2013-09-11,可以参考这里
3)截取一段时间内这四家公司股价数据(注意分红派息除权对股价的影响),用R中的相关性分析判断股价之间的相关性,或者用R基础课程第八周所讲的MIC指标对其进行分析 如果要除去派息和拆分等的影响,那最好采用股票调整价格(Adjusted Stock Price)来做分析,即getSymbols获取的数据中的Adjusted那一列,代码如下,
1 2 3 4 5 6
| > cor(cbind(Ad(get("AAPL",env=myenv)),Ad(get("ORCL",env=myenv)),Ad(get("MSFT",env=myenv)), Ad(get("GOOGL",env=myenv)))) AAPL.Adjusted ORCL.Adjusted MSFT.Adjusted GOOGL.Adjusted AAPL.Adjusted 1.00000000 0.1774047 0.03703686 0.1469590 ORCL.Adjusted 0.17740469 1.0000000 -0.46439928 -0.3614837 MSFT.Adjusted 0.03703686 -0.4643993 1.00000000 0.8411823 GOOGL.Adjusted 0.14695899 -0.3614837 0.84118234 1.0000000
|
上述代码中,用Ad或者股票调整价格,cbind将数据按列组合起来,cor来计算相关性。 从计算结果可以发现,MSFT和GOOGL的相关性比较高,其他股票之间的相关性不是很明显。