Class Example:
The main goal of this example is to study the returns of the index LCXP (statistics and distribution).
We have collected price data from 31/12/1991 to 31/08/2015 and it is in the CSV file: LCXP.csv (uploaded in CANVAS). In Figure 1 we show the available info from Bloomberg about the index.
To solve the example you should follow these steps:
- Compute the log-returns from prices.
- Compute the mean, std, skewness and kurtosis. Considering these values, is a normal distribution ?
- Represent the histogram of the distribution of returns.
- Perform a Jarque-Bera normality test.
- Find if the returns are different from zero (on average). Use a “t-test” to answer this question.
Solution:
First thing we need to do is to require some libraries (in case you do not have them installed you should install them). After that, we just use the function “read.csv2” to load data in the variable “tempData”.
library(quantmod) #Package to download financials historical data
library(moments) # Calculate Kurstosis and skewness
library(plyr) #Using ddply with data.frames
library (ggplot2) #Plot library
library(ggfortify) #Plot Monthplot
# Read data from CSV file
tempData<-read.csv2("./LCXP.csv")
The code above just read the .csv file which is stored in the path ./LCXP.csv (the file LCXP.csv is in CANVAS). Just to show how data is stored in R, lets see how the variable “tempData” looks like:
head(tempData)
Next step, is to convert the data into a time series (using “xts”).
#Convert data to XTS
xData=xts(tempData$Precio, order.by = as.Date(tempData$Fecha,"%Y-%m-%d"),frequency=365)
head(xData)
[,1]
1991-12-31 100.00
1992-01-02 100.41
1992-01-03 100.16
1992-01-06 101.40
1992-01-07 101.07
1992-01-08 99.79
Next we calculate the returns (daily log-returns) and the number of observations.
#Calculate data size
xRent=dailyReturn(xData,type='log',leading=FALSE) #Compute daily returns (log) from prices
xRent=xRent['199201/201508']
nObs=length(xRent)
nObs
[1] 6074
Above we can see that we should have 6074 returns in our dataset. Now, we are ready to compute the statistics of the distribution of returns. In this case, as we have seen in class: mean, standard deviation, skewness and kurtosis. Note: We multiply by 100 to have everything in percentage.
#Statistics
mean(xRent*100)
[1] 0.02162776
sd(xRent*100)
[1] 1.190475
skewness(xRent*100)
daily.returns
-0.1570798
kurtosis(xRent*100)
daily.returns
8.725444
More info…
hist(xRent)

In the above distribution we see that is far to be normal (positive kurtosis = leptokurtic) and it is also left-skewed (negative skewness).
Finally, to be sure that our returns do not follow a normal distribution, we implement the Jarque-Bera Normality Test.
#Jarque-Bera test (normality test)
jarque.test(as.numeric(coredata(xRent))) #The result shows the normality for log-return is rejected.
Jarque-Bera Normality Test
data: as.numeric(coredata(xRent))
JB = 8321.2, p-value < 2.2e-16
alternative hypothesis: greater
How to interpret the above results ?
As the p-value < 2.2 e-16 (highly significant), the distribution of return does not follow a normal distribution. Note: The null hypothesis for the test is that the data is normally distributed; the alternate hypothesis is that the data does not come from a normal distribution. As the p-value is highly significant we can reject the null hypothesis (normal distribution) at < 1% significant level.
Finally, we want to know if the average of the returns is different from zero (statistically). Thus, we perform a “t-test” as follows:
#mean zero test
t.test(xRent)
Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Recycling array of length 1 in vector-array arithmetic is deprecated.
Use c() or as.vector() instead.
One Sample t-test
data: xRent
t = 1.4159, df = 6073, p-value = 0.1569
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-8.316771e-05 5.157228e-04
sample estimates:
mean of x
0.0002162776
In this case, we can not reject the null hypothesis (zero mean). If we repeat the test with monthly returns, we get:
xRentM = monthlyReturn(xData,type='log',leading=FALSE) #Compute daily returns (log) from prices
xRentM=xRentM['199201/201508']
#mean zero test
t.test(xRentM)
Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Recycling array of length 1 in vector-array arithmetic is deprecated.
Use c() or as.vector() instead.
One Sample t-test
data: xRentM
t = 1.7272, df = 283, p-value = 0.08523
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.0006459528 0.0098971493
sample estimates:
mean of x
0.004625598
In this case, we can reject the null hypothesis (zero mean) at a < 10% confidence level.
Finally, lets create a nice graph…
#Create a data frame.
wData = xRentM
names(wData)="LCXP"
gData=data.frame(Date=time(wData), wData, check.names=FALSE, row.names=NULL)
#Graphic
ggplot(gData, aes(x=LCXP)) +
geom_histogram(aes(y = ..density..), color="black", fill=NA) + #Histogram
geom_density(color="royalblue",fill="blue",alpha=.1)+ #Density
geom_rug(col="darkred",alpha=.1)+ #Rug
stat_function(fun = dnorm, colour = "red",args = list(mean = mean(wData),sd=sd(wData) )) #Normal Density

NA
NA
—-end———
LS0tCnRpdGxlOiAiTGVzc29uIDE6IERhdGEgYW5kIFJldHVybnMgKENsYXNzIEV4YW1wbGUpIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgo8aDM+IENsYXNzIEV4YW1wbGU6IDwvaDM+CgpUaGUgbWFpbiBnb2FsIG9mIHRoaXMgZXhhbXBsZSBpcyB0byBzdHVkeSB0aGUgcmV0dXJucyBvZiB0aGUgaW5kZXggTENYUCAoc3RhdGlzdGljcyBhbmQgZGlzdHJpYnV0aW9uKS4KCldlIGhhdmUgY29sbGVjdGVkIHByaWNlIGRhdGEgZnJvbSAzMS8xMi8xOTkxIHRvIDMxLzA4LzIwMTUgYW5kIGl0IGlzIGluIHRoZSBDU1YgZmlsZTogTENYUC5jc3YgKHVwbG9hZGVkIGluIENBTlZBUykuIEluIEZpZ3VyZSAxIHdlIHNob3cgdGhlIGF2YWlsYWJsZSBpbmZvIGZyb20gQmxvb21iZXJnIGFib3V0IHRoZSBpbmRleC4KClRvIHNvbHZlIHRoZSBleGFtcGxlIHlvdSBzaG91bGQgZm9sbG93IHRoZXNlIHN0ZXBzOgoKKDEpIENvbXB1dGUgdGhlIGxvZy1yZXR1cm5zIGZyb20gcHJpY2VzLgooMikgQ29tcHV0ZSB0aGUgbWVhbiwgc3RkLCBza2V3bmVzcyBhbmQga3VydG9zaXMuIENvbnNpZGVyaW5nIHRoZXNlIHZhbHVlcywgaXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uID8KKDMpIFJlcHJlc2VudCB0aGUgaGlzdG9ncmFtIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmV0dXJucy4KKDQpIFBlcmZvcm0gYSBKYXJxdWUtQmVyYSBub3JtYWxpdHkgdGVzdC4KKDUpIEZpbmQgaWYgdGhlIHJldHVybnMgYXJlIGRpZmZlcmVudCBmcm9tIHplcm8gKG9uIGF2ZXJhZ2UpLiBVc2UgYSAidC10ZXN0IiB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbi4KCgohW0ZpZ3VyZSAxOiBCbG9vbWJlcmcgTFhDUF0oQmxvb21iZXJnRGF0YS5qcGcpCgo8aDM+IFNvbHV0aW9uOiA8L2gzPgoKCkZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgdG8gcmVxdWlyZSBzb21lIGxpYnJhcmllcyAoaW4gY2FzZSB5b3UgZG8gbm90IGhhdmUgdGhlbSBpbnN0YWxsZWQgeW91IHNob3VsZCBpbnN0YWxsIHRoZW0pLiBBZnRlciB0aGF0LCB3ZSBqdXN0IHVzZSB0aGUgZnVuY3Rpb24gInJlYWQuY3N2MiIgdG8gbG9hZCBkYXRhIGluIHRoZSB2YXJpYWJsZSAidGVtcERhdGEiLgoKCmBgYHtyfQoKbGlicmFyeShxdWFudG1vZCkgI1BhY2thZ2UgdG8gZG93bmxvYWQgZmluYW5jaWFscyBoaXN0b3JpY2FsIGRhdGEgCmxpYnJhcnkobW9tZW50cykgIyBDYWxjdWxhdGUgS3Vyc3Rvc2lzIGFuZCBza2V3bmVzcwpsaWJyYXJ5KHBseXIpICNVc2luZyBkZHBseSB3aXRoIGRhdGEuZnJhbWVzCmxpYnJhcnkgKGdncGxvdDIpICNQbG90IGxpYnJhcnkKbGlicmFyeShnZ2ZvcnRpZnkpICNQbG90IE1vbnRocGxvdAoKCiMgUmVhZCBkYXRhIGZyb20gQ1NWIGZpbGUKdGVtcERhdGE8LXJlYWQuY3N2MigiLi9MQ1hQLmNzdiIpCmBgYAoKVGhlIGNvZGUgYWJvdmUganVzdCByZWFkIHRoZSAuY3N2IGZpbGUgd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBwYXRoIC4vTENYUC5jc3YgKHRoZSBmaWxlIExDWFAuY3N2IGlzIGluIENBTlZBUykuIEp1c3QgdG8gc2hvdyBob3cgZGF0YSBpcyBzdG9yZWQgaW4gUiwgbGV0cyBzZWUgaG93IHRoZSB2YXJpYWJsZSAidGVtcERhdGEiIGxvb2tzIGxpa2U6CgpgYGB7cn0KaGVhZCh0ZW1wRGF0YSkKYGBgCgoKTmV4dCBzdGVwLCBpcyB0byBjb252ZXJ0IHRoZSBkYXRhIGludG8gYSB0aW1lIHNlcmllcyAodXNpbmcgInh0cyIpLgoKCmBgYHtyfQojQ29udmVydCBkYXRhIHRvIFhUUwp4RGF0YT14dHModGVtcERhdGEkUHJlY2lvLCBvcmRlci5ieSA9IGFzLkRhdGUodGVtcERhdGEkRmVjaGEsIiVZLSVtLSVkIiksZnJlcXVlbmN5PTM2NSkKaGVhZCh4RGF0YSkKYGBgCgoKTmV4dCB3ZSBjYWxjdWxhdGUgdGhlIHJldHVybnMgKGRhaWx5IGxvZy1yZXR1cm5zKSBhbmQgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMuIAoKCmBgYHtyfQoKI0NhbGN1bGF0ZSBkYXRhIHNpemUKeFJlbnQ9ZGFpbHlSZXR1cm4oeERhdGEsdHlwZT0nbG9nJyxsZWFkaW5nPUZBTFNFKSAjQ29tcHV0ZSBkYWlseSByZXR1cm5zIChsb2cpIGZyb20gcHJpY2VzCnhSZW50PXhSZW50WycxOTkyMDEvMjAxNTA4J10Kbk9icz1sZW5ndGgoeFJlbnQpCm5PYnMKCmBgYAoKCkFib3ZlIHdlIGNhbiBzZWUgdGhhdCB3ZSBzaG91bGQgaGF2ZSA2MDc0IHJldHVybnMgaW4gb3VyIGRhdGFzZXQuIE5vdywgd2UgYXJlIHJlYWR5IHRvIGNvbXB1dGUgdGhlIHN0YXRpc3RpY3Mgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiByZXR1cm5zLiBJbiB0aGlzIGNhc2UsIGFzIHdlIGhhdmUgc2VlbiBpbiBjbGFzczogbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBza2V3bmVzcyBhbmQga3VydG9zaXMuIE5vdGU6IFdlIG11bHRpcGx5IGJ5IDEwMCB0byBoYXZlIGV2ZXJ5dGhpbmcgaW4gcGVyY2VudGFnZS4gCgoKYGBge3J9CgojU3RhdGlzdGljcwptZWFuKHhSZW50KjEwMCkKc2QoeFJlbnQqMTAwKQpza2V3bmVzcyh4UmVudCoxMDApCmt1cnRvc2lzKHhSZW50KjEwMCkKCmBgYAoKCk1vcmUgaW5mby4uLgoKYGBge3J9CgpoaXN0KHhSZW50KQoKYGBgCgpJbiB0aGUgYWJvdmUgZGlzdHJpYnV0aW9uIHdlIHNlZSB0aGF0IGlzIGZhciB0byBiZSBub3JtYWwgKHBvc2l0aXZlIGt1cnRvc2lzID0gbGVwdG9rdXJ0aWMpIGFuZCBpdCBpcyBhbHNvIGxlZnQtc2tld2VkIChuZWdhdGl2ZSBza2V3bmVzcykuIAoKRmluYWxseSwgdG8gYmUgc3VyZSB0aGF0IG91ciByZXR1cm5zIGRvIG5vdCBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLCB3ZSBpbXBsZW1lbnQgdGhlIEphcnF1ZS1CZXJhIE5vcm1hbGl0eSBUZXN0LgoKCmBgYHtyfQojSmFycXVlLUJlcmEgdGVzdCAobm9ybWFsaXR5IHRlc3QpCmphcnF1ZS50ZXN0KGFzLm51bWVyaWMoY29yZWRhdGEoeFJlbnQpKSkgI1RoZSByZXN1bHQgc2hvd3MgdGhlIG5vcm1hbGl0eSBmb3IgbG9nLXJldHVybiBpcyByZWplY3RlZC4KYGBgCgpIb3cgdG8gaW50ZXJwcmV0IHRoZSBhYm92ZSByZXN1bHRzID8gCgpBcyB0aGUgcC12YWx1ZSA8IDIuMiBlLTE2IChoaWdobHkgc2lnbmlmaWNhbnQpLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJldHVybiBkb2VzIG5vdCBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBOb3RlOiBUaGUgbnVsbCBoeXBvdGhlc2lzIGZvciB0aGUgdGVzdCBpcyB0aGF0IHRoZSBkYXRhIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkOyB0aGUgYWx0ZXJuYXRlIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgZGF0YSBkb2VzIG5vdCBjb21lIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBBcyB0aGUgcC12YWx1ZSBpcyBoaWdobHkgc2lnbmlmaWNhbnQgd2UgY2FuIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIChub3JtYWwgZGlzdHJpYnV0aW9uKSBhdCA8IDElIHNpZ25pZmljYW50IGxldmVsLiAKCgpGaW5hbGx5LCB3ZSB3YW50IHRvIGtub3cgaWYgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHJldHVybnMgaXMgZGlmZmVyZW50IGZyb20gemVybyAoc3RhdGlzdGljYWxseSkuIFRodXMsIHdlIHBlcmZvcm0gYSAidC10ZXN0IiBhcyBmb2xsb3dzOgoKYGBge3J9CgojbWVhbiB6ZXJvIHRlc3QKdC50ZXN0KHhSZW50KSAKCmBgYAoKSW4gdGhpcyBjYXNlLCB3ZSBjYW4gbm90IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzICh6ZXJvIG1lYW4pLiBJZiB3ZSByZXBlYXQgdGhlIHRlc3Qgd2l0aCBtb250aGx5IHJldHVybnMsIHdlIGdldDoKCgpgYGB7cn0KeFJlbnRNID0gbW9udGhseVJldHVybih4RGF0YSx0eXBlPSdsb2cnLGxlYWRpbmc9RkFMU0UpICNDb21wdXRlIGRhaWx5IHJldHVybnMgKGxvZykgZnJvbSBwcmljZXMKeFJlbnRNPXhSZW50TVsnMTk5MjAxLzIwMTUwOCddCgojbWVhbiB6ZXJvIHRlc3QKdC50ZXN0KHhSZW50TSkgCgpgYGAKCkluIHRoaXMgY2FzZSwgd2UgY2FuIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzICh6ZXJvIG1lYW4pIGF0IGEgPCAxMCUgY29uZmlkZW5jZSBsZXZlbC4gCgoKRmluYWxseSwgbGV0cyBjcmVhdGUgYSBuaWNlIGdyYXBoLi4uCgoKYGBge3J9CgojQ3JlYXRlIGEgZGF0YSBmcmFtZS4gCgp3RGF0YSA9IHhSZW50TQpuYW1lcyh3RGF0YSk9IkxDWFAiCmdEYXRhPWRhdGEuZnJhbWUoRGF0ZT10aW1lKHdEYXRhKSwgd0RhdGEsIGNoZWNrLm5hbWVzPUZBTFNFLCByb3cubmFtZXM9TlVMTCkKCiNHcmFwaGljCmdncGxvdChnRGF0YSwgYWVzKHg9TENYUCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG9yPSJibGFjayIsIGZpbGw9TkEpICsgI0hpc3RvZ3JhbQogIGdlb21fZGVuc2l0eShjb2xvcj0icm95YWxibHVlIixmaWxsPSJibHVlIixhbHBoYT0uMSkrICNEZW5zaXR5CiAgZ2VvbV9ydWcoY29sPSJkYXJrcmVkIixhbHBoYT0uMSkrICNSdWcKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBjb2xvdXIgPSAicmVkIixhcmdzID0gbGlzdChtZWFuID0gbWVhbih3RGF0YSksc2Q9c2Qod0RhdGEpICkpICNOb3JtYWwgRGVuc2l0eQoKCmBgYAoKCgotLS0tZW5kLS0tLS0tLS0tCgo=