Even the repeated calls to my function that could have been put in a loop:

for (symbol in c("BIDU","GE","GSH","Z","^GSPC","^IXPC") doit(symbol,f)

In problems involving several loops, we should consider the various possibilities
for nesting the loops or function calls. The slow place in a script for this
assignment is in the call to `get.stock.price`. Therefore, once that
call is made, the results should be used repeatedly (that is, do not make
separate calls to `get.stock.price` just because you're going to
compute simple returns one time and simple log returns another time!).
We do have to make separate calls for the daily and monthly returns, however.

If we wanted to perform the same kind of computations for other stocks later, we could save the function in a file and source the file in a later R session.

I wrote this function so that it prints the answers; that is, I did not save the answers. I did it specifically for this assignment, but it is usually a bad design not to save answers. For this particular problem, a better design might have been to write the answers to a csv file, which could then be incorporated directly into a spreadsheet, which is what the assignment required.

This function required some statistics computed in the `fBasics`
package. The function `basicStats` computes all of these things
and returns them in an array structure. Note my references of the
form `stats["Stdev",1]`. How do you know what kind of structure is
returned by an R functions? You can use the R functions `str`
and `names`. Just displaying the structure often indicates how it is
constructed.

The `fBasics` package also contains separate functions for the individual
statistics. For example, the function `kurtosis` computes the
excess kurtosis, which is just one of the statistics computed by
`basicStats`.

doit <- function(symbol,freq){ require(fBasics) P <-get.stock.price(symbol, start.date=c(1,1,2010), stop.date=c(5,15,2015), freq=freq,full.table=FALSE, print.info=FALSE) n <- length(P) for (logreturn in c(0,1)){ if(logreturn){ R <- 100*diff(log(P)) cat("Log returns (percentages) for ",symbol,"\n") }else { R <- 100*diff(P)/P[-n] cat("Simple returns (percentages) for ",symbol,"\n") } stats <- basicStats(R) cat(" Mean ",stats["Mean",1],"\n", "Stdev ",stats["Stdev",1],"\n", "Skewness ",stats["Skewness",1],"\n", "Excess kurtosis ",stats["Kurtosis",1],"\n", "Minimum ",stats["Minimum",1],"\n", "Maximum ",stats["Maximum",1],"\n" ) tc <- stats["Mean",1]/(stats["Stdev",1]/sqrt(n)) pv <- pt(-abs(tc),n-1) + (1-pt(abs(tc),n-1)) # could use normal here cat(" p-value for test that mean=0 ",pv,"\n") tc <- stats["Skewness",1]/sqrt(6/n) pv <- pnorm(-abs(tc)) + (1-pnorm(abs(tc))) # normal is almost the same as t cat(" p-value for test that skewness=0 ",pv,"\n") tc <- stats["Kurtosis",1]/sqrt(24/n) # basicStats computes excess kurtosis pv <- pnorm(-abs(tc)) + (1-pnorm(abs(tc))) cat(" p-value for test that excess kurtosis=0 ",pv,"\n") } } ############################################ library(fBasics) # setwd("c:/Work/Lectures/Courses/HIT_Shenzhen") # set this to your working directory source("financetools_funs.R") # this file must be in your working directory for (f in c("d","m")){ doit("BIDU",f) doit("GE",f) doit("GSH",f) doit("Z",f) doit("^GSPC",f) doit("^IXPC",f) }