文章目录

本次试用使用的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的相关性比较高,其他股票之间的相关性不是很明显。

文章目录

欢迎来到Valleylord的博客!

本博的文章尽量原创。