Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/sandbox/symposium2013/download.SP500TR.R
1433 views
1
# Script for downloading and parsing a monthly total return series from
2
# http://www.standardandpoors.com/
3
#
4
# Peter Carl
5
6
# Load needed packages:
7
require(xts)
8
require(gdata)
9
10
### Constants
11
filename = "EDHEC-index-history.csv"
12
objectname = "SP500TR"
13
datadir = "./data"
14
cachedir = "./cache"
15
16
# Download the first sheet in the xls workbook directly from the web site:
17
x = read.xls("http://www.spindices.com/documents/additional-material/monthly.xlsx?force_download=true")
18
19
# That gives us something like the following:
20
# > head(x)
21
# STANDARD...POOR.S.INDEX.SERVICES X X.1 X.2 X.3 X.4
22
# 1 S&P 500 MONTHLY RETURNS
23
# 2
24
# 3 MONTH OF PRICE PRICE 1 MONTH 3 MONTH 6 MONTH
25
# 4 CLOSE CHANGE % CHANGE % CHANGE % CHANGE
26
# 5 10/2009 1036.19 -20.88 -1.98% 4.93% 18.72%
27
# 6 09/2009 1057.08 36.45 3.57% 14.98% 32.49%
28
# X.5 X.6 X.7 X.8 X.9 X.10 X.11 X.12 X.13
29
# 1 NA NA
30
# 2 1 MONTH 12 MONTH NA NA
31
# 3 1 YEAR 2 YEAR 3 YEAR 5 YEARS 10 YEARS TOTAL TOTAL NA NA
32
# 4 % CHANGE % CHANGE % CHANGE % CHANGE % CHANGE RETURN RETURN NA NA
33
# 5 6.96% -33.12% -24.80% -8.32% -23.97% -1.86% 9.80% NA NA
34
# 6 -9.37% -30.76% -20.87% -5.16% -17.59% 3.73% -6.91% NA NA
35
# X.14 X.15
36
# 1 NA NA
37
# 2 NA NA
38
# 3 NA NA
39
# 4 NA NA
40
# 5 NA NA
41
# 6 NA NA
42
43
# So we only really care about column 1 for dates and column 12 (X.10) for
44
# total returns. The first four rows are headers, and can be discarded.
45
rawdates = x[-1:-4,1]
46
rawreturns = x[-1:-4,12]
47
# Data goes back to 12/1988.
48
49
# First we convert the dates to something we can use. Note that frac=1 sets
50
# the day to the last day of the month. That should be close enough for
51
# monthly data.
52
ISOdates = as.Date(as.yearmon(rawdates, "%m/%Y"), frac=1)
53
54
# Now we convert the rawreturns strings into numbers
55
tr = as.numeric(as.character((sub("%", "", rawreturns, fixed=TRUE))))/100
56
57
# Now construct an xts object with the two columns
58
SP500TR.R=na.omit(as.xts(tr, order.by=ISOdates))
59
colnames(SP500TR.R)="SP500TR"
60
61
# Clean up
62
rm(list=c("tr", "ISOdates", "rawdates", "rawreturns"))
63
### Save data into cache
64
save(SP500TR.R, file=paste(cachedir, "/", objectname, ".RData", sep=""))
65