[R语言]金融数据获取和简单的分析
0.摘要
利用R语言中的quantmod包和fBasics对股票数据的获取和简要的分析,通过获取的数据进行典型图像绘制,使用JB正态性检验来检验是否服从于正态分布。
1.数据获取
0)quantmod包
quantmod包旨在帮助定量交易者开发,测试和部署基于统计的交易模型。具体的详细可以查看官网:http://www.quantmod.com/
1)首先我们需要先载入quantmod包
install.packages('quantmod')
输入上述代码后需要在Rstudio等待,会自动进行安装,完成后载入quantmod和相关的包
library(quantmod)
library(zoo)
library(xts)
library(TTR)
在quantmod中,getSymbols()函数可以直接从yahoo等数据源获取相关的股票交易数据,其中getSymbols默认从yahoo上获取数据,若需要从其他的数据源获取,可以使用以下代码
getSymbols("stock",src="google")
对getSymbols()函数中的具体用法可以利用以下代码在R中查看,
> ?getSymbols
Rstudio中查看相关函数具体描述.png
2)数据载入
熟悉了getsymbols函数后,可以使用该函数命令来访问数据,选择需要查看的股票代码即可获取数据
> getSymbols("APLL")# 查询苹果公司的股票交易数据
[1] "APLL"
此时我们已经从yahoo上获取了苹果公司的股票数据,可以使用head()或者tail()查看头部数据或者尾部交易数据来检验是否有获取到相关交易数据信息,上述两个查看函数默认是加载6条记录,
> head(APLL,3)# 稍微变动可以查看非默认天数
APLL.Open APLL.High APLL.Low APLL.Close
2007-01-03 1.18 1.28 1.18 1.28
2007-01-04 1.34 1.34 1.22 1.32
2007-01-05 1.32 1.34 1.18 1.30
APLL.Volume APLL.Adjusted
2007-01-03 13600 1.28
2007-01-04 1600 1.32
2007-01-05 11300 1.30
> tail(APLL,3)
APLL.Open APLL.High APLL.Low APLL.Close
2018-07-25 0.025 0.025 0.025 0.025
2018-07-26 0.025 0.025 0.025 0.025
2018-07-26 0.000 0.000 0.000 0.025
APLL.Volume APLL.Adjusted
2018-07-25 0 0.025
2018-07-26 3000 0.025
2018-07-26 0 0.025
3)getsymbols结果的重命名
在获取股票日交易数据之前,需要知道上市公司股票或者指数的缩写码,若想知道股票代码的日交易数据,例如获取600635的日交易数据,我们可以通过以下操作来完成
# 获取600635的股票数据
> getSymbols("600635.ss")
[1] "600635.SS"
Warning message:
600635.ss 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.
#代码中的'.ss'表示该公司的股票从属于上交所。
#上证A股指数(代码为 000002.ss)
#上证B股指数(代码为000003.ss)
#上证综合指数(代码为000008.ss)
#沪深300指数(代码为 000300.ss)
#深圳成指(代码为 399001.sz)等,需要获取深交所股票数据时,把'.ss'替换为'.sz'。
此时Rstudio给我们报了一个错误,无法引用‘600635.ss’的结果。
head(600635.ss)
Error: unexpected symbol in "head(600635.ss)"
为了便于引用数据并对其进一步进行分析,可以对getSymbols的结果进行重命名。
重命名有两种方法:一是借助setSymbolLookup函数,二是借助getSymbols函数中的auto.assign参数。
> setSymbolLookup(WK=list(name='000002.sz',src='yahoo'))#查询万科的股票交易数据
> getSymbols("WK")
[1] "WK"
4)获取指数的日数据
> getSymbols("^SSEC")
[1] "SSEC"
> tail(SSEC,3)
SSEC.Open SSEC.High SSEC.Low SSEC.Close
2017-08-23 3283.797 3299.457 3274.440 3287.705
2017-08-24 3287.959 3297.989 3266.359 3271.512
2017-08-25 3271.461 3331.915 3271.461 3331.522
SSEC.Volume SSEC.Adjusted
2017-08-23 179800 3287.705
2017-08-24 163500 3271.512
2017-08-25 205800 3331.522
5)获取股息数据
# 获取微软公司的股息数据(为了节约篇幅,只显示后六条数据)
> getDividends("MSFT")
MSFT.div
2017-02-14 0.39
2017-05-16 0.39
2017-08-15 0.39
2017-11-15 0.42
2018-02-14 0.42
2018-05-16 0.42
2.数据处理、图像绘制
0)这里以新浪的数据进行R图像绘制
library(quantmod)
library(zoo)
library(xts)
library(TTR)
getSymbols("SINA")
head(SINA)#查看头部数据
tail(SINA)#查看尾部数据
dim(SINA)#查看数据的规模
1)股票数据的图形绘制
画K线图需要用到 chartSeries 函数,这里绘制所有的交易数据,也可以绘制部分交易数据的K线图
> getSymbols("SINA",from="2017-01-03",to="2017-07-12") #下载部分数据
[1] "SINA"
> chartSeries(SINA,from="2017-01-03",to="2017-07-12")
绘制完整的K线图
chartSeries(SINA)#股票数据的时序图(K线)
“SINA”股票数据K线图
2)股票收益率的时序图
研究股票收益率是股票投资分析最基本的操作,股票收益率通常简化为股票价格对数变化来表示,股票价格使用调整后的收盘价。
计算股票收益率通常需要用到 log(求对数) diff(求差分) 函数。
SINA.Profit = diff(log(SINA$SINA.Adjusted))
chartSeries(SINA.Profit,theme = "white") #绘制图形
3)股票收益率的密度函数图
画密度函数图之前我们要先下载 fBasics 软件包
>install.packages("fBasics")
>library(fBasics)
>library(timeDate)#载入依赖包
>library(timeSeries)#载入依赖包
由于 SINA.Profit 是通过一阶差分得来的数据, 在第一行有一个空值(NA),需要先删除掉第一行才能继续画图。
>SINA.Pro=na.omit(SINA.Profit)
>de=density(SINA.Pro) #获取密度函数
>range(SINA.Pro) #查看数据的取值范围,相当于 c(min(x),max(x))
[1] -0.1871210 0.2092493
>x=seq(-.17,.22,.001) #生成一个下界是 -0.17,上界是 22,时间间隔是 0.001 的数据,取值范围主要由 range 的结果决定
>plot(de$x,de$y,xlab='x',ylab='density',type='l') #画密度函数图
>ys=dnorm(x,mean(SINA.Pro),stdev(SINA.Pro)) #新建一个与 SINA.Pro 均值和标准差一致的正态分布函数
>lines(x,ys,lty=2) #在密度函数图上增加正态分布曲线(图中虚线)
可以看到新浪股票数据的密度函数有明显的高峰厚尾现象,与正态分布有明显的差别,因此用JB检验来检验SINA股票是否符合正态分布的假设。
3.正态性检验
0)股票收益率的基本统计量
>basicStats(SINA.Pro)
SINA.Adjusted
nobs 2919.000000
NAs 0.000000
Minimum -0.187121
Maximum 0.209249
1. Quartile -0.014739
3. Quartile 0.015643
Mean 0.000340
Median -0.000203
Sum 0.991775
SE Mean 0.000590
LCL Mean -0.000816
UCL Mean 0.001496
Variance 0.001014
Stdev 0.031850
Skewness 0.166731
Kurtosis 4.442786
mean=0.00034,接近于0,也就是说新浪股票收益率具有比较明显的向0集中的趋势。
Variance=0.001014,接近于0,也就是说新浪股票收益率的离散程度较小,不分散。
Skewness=0.166731, 明显不等于0,也就是说新浪股票收益率是非对称分布的。
Kurtosis=4.442786,明显大于3,也就是说新浪股票收益率存在明显的高峰厚尾现象。
1)股票收益率的正态性检验
>normalTest(SINA.Pro,method='jb') # `jb`代表JB正态性检验
Title:
Jarque - Bera Normalality Test
Test Results:
STATISTIC:
X-squared: 2419.7322
P VALUE:
Asymptotic p Value: < 2.2e-16
检验统计量 JB=2419.7322,p<2.2e-16<0.05,也就是说在5%的显著性水平上拒绝新浪股票收益率服从正态分布函数的原假设,即新浪股票收益率不服从正态分布。
4.总结
结合 R 语言的 quantmod 和 fBasics 软件包下载股票数据,实现数据的可视化,包括直观的 K 线图、收益率的时序图,以及密度函数图,最终从图形、统计结果以及 JB 检验三个方面来证明了该股票收益数据程非正态分布。
从数据获取,包的选用和图像绘制,实践中想通过列表来批量获取所有数据失败了,所以做了单股票的分析,面对批量获取数据还需要进一步来实践,检验方法的话借用现成的分析方法,在统计学和金融知识方面还有很大的欠缺。