Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/sandbox/paper_analysis/illustration/USreal.R
1433 views
1
# 1. Set working directory
2
# setwd("C:/Documents and Settings/n06054/Desktop/PhDDefence");
3
setwd("Y:/PhDDefence");
4
# Load libraries
5
library(chron)
6
7
# Asymmetrie and fat tails in weekly returns IBM
8
9
postscript("monthlyreturns.eps")
10
data=read.table("monthlyIBM.txt",skip=1,nrows=-1)
11
IBMdate = chron( as.character(data[,1]),format=c(dates="d/m/y") ); IBMreturns = data[,2];
12
z99 = qnorm(0.99);
13
start=261; end=length(IBMdate);
14
IBMdate = IBMdate[start:end] ; IBMreturns = IBMreturns[start:end]; print(length(IBMdate));
15
band = mean(IBMreturns)+z99*sd(IBMreturns)
16
par(mfrow=c(2,1),mar=c(2,2,3,2),cex=1.3)
17
maxvalue = 1.05*max( abs( min(IBMreturns) ) , IBMreturns );
18
range = c(-maxvalue,maxvalue)
19
plot(IBMdate,IBMreturns,type="h",main="Monthly returns on IBM stock",xlab="",ylab="",ylim=range)
20
abline( h= band , lty=3, col="blue" ,lwd=3 ); abline(h=-band , lty=3 , col="blue",lwd=3)
21
plot(IBMdate, rnorm(length(IBMdate), mean=mean(IBMreturns),sd=sd(IBMreturns)),
22
main="Simulated returns from a normal distribution" ,type="h",ylim=range)
23
abline( h=band, lty=3, col="blue" ,lwd=3 ); abline(h=-band , lty=3 , col="blue" ,lwd=3)
24
dev.off()
25
26
library(PerformanceAnalytics);
27
modifiedVaR( data[,2] )
28
VaR.Beyond( data[,2] , p=0.99 ); VaR.Beyond( data[,2] , modified=T, p=0.99 );
29
30
postscript("monthlyreturnsVaR.eps")
31
data=read.table("monthlyIBM.txt",skip=1,nrows=-1)
32
IBMdate = chron( as.character(data[,1]),format=c(dates="d/m/y") ); IBMreturns = data[,2];
33
z99 = qnorm(0.99);
34
start=261; end=length(IBMdate);
35
IBMdate = IBMdate[start:end] ; IBMreturns = IBMreturns[start:end]; print(length(IBMdate));
36
band = mean(IBMreturns)+z99*sd(IBMreturns)
37
par(mfrow=c(1,1),mar=c(2,2,3,2),cex=1.3)
38
maxvalue = 1.05*max( abs( min(IBMreturns) ) , IBMreturns );
39
range = c(-maxvalue,maxvalue)
40
plot(IBMdate,IBMreturns,type="h",main="Monthly returns on IBM stock \n and expected loss in 1% worst cases",xlab="",ylab="",ylim=range)
41
#abline( h= band , lty=3 ); abline(h=-band , lty=3 )
42
43
GVaR = VaR.traditional( data[,2] , p=0.99 );
44
MVaR = modifiedVaR( data[,2] , p=0.99 ) ;
45
GES = VaR.Beyond( data[,2] , p=0.99 );
46
MES = VaR.Beyond( data[,2] , modified=T, p=0.99 );
47
48
abline( h = - GES , lty=1, col="red",lwd=3 ); text( IBMdate[5] , y = -0.9*GES , labels = "Normal approach" , pos=4, col="red",lwd=3)
49
abline( h = - MES , lty=1, col="darkgreen",lwd=3 );
50
text( IBMdate[5] , y = -0.93*MES , labels = "Modified approach" , pos=4 , col="darkgreen",lwd=3)
51
dev.off()
52
53
# Portfolio risk:
54
55
dataIBM=read.table("monthlyIBM.txt",skip=1,nrows=-1)
56
IBMdate = chron( as.character(dataIBM[,1]),format=c(dates="d/m/y") ); IBMreturns = dataIBM[,2];
57
start=261; end=length(IBMdate);
58
IBMdate = IBMdate[start:end] ; IBMreturns = IBMreturns[start:end]; print(length(IBMdate));
59
60
dataUSTnote=read.table("monthlyUS10yrsnote.txt",skip=1,nrows=-1)
61
USTnotedate = chron( as.character(dataUSTnote[,1]),format=c(dates="d/m/y") ); USTnotereturns = dataUSTnote[,2];
62
start=261; end=length(USTnotedate);
63
USTnotedate = USTnotedate[start:end] ; USTnotereturns = USTnotereturns[start:end]; print(length(USTnotedate));
64
65
maxvalue = 1.05*max( abs( min(IBMreturns,USTnotereturns) ) , IBMreturns,USTnotereturns );range = c(-maxvalue,maxvalue)
66
67
pfreturns = 0.5*(USTnotereturns+IBMreturns);
68
MES = VaR.Beyond( pfreturns , modified=T, p=0.99 );
69
70
71
source("functions-managers_changed.R");
72
73
data = cbind( IBMreturns , USTnotereturns )
74
mu = apply(data,2,'mean'); sigma = cov(data)
75
invSigma = solve(sigma); N=2;
76
M3 = matrix(rep(0,N^3),nrow=N,ncol=N^2)
77
M4 = matrix(rep(0,N^4),nrow=N,ncol=N^3)
78
T = length(IBMreturns)
79
for(t in c(1:T))
80
{
81
centret = as.numeric(matrix(data[t,]-mu,nrow=N,ncol=1))
82
M3 = M3 + ( centret%*%t(centret) )%x%t(centret)
83
M4 = M4 + ( centret%*%t(centret) )%x%t(centret)%x%t(centret)
84
}
85
M3 = M3/T
86
M4 = M4/T
87
88
PortgausES(alpha=0.01,w=rep(1,2)/2,mu=mu,sigma=sigma,)
89
PortMES(alpha=0.01,w=rep(1,2)/2,mu=mu,sigma=sigma,M3=M3,M4=M4)
90
MES = VaR.Beyond( pfreturns , modified=T, p=0.99 );
91
92
93
postscript("riskcontributions.eps")
94
par(mfrow=c(3,1),mar=c(2,2,0,2),cex=1.3)
95
96
plot(IBMdate,pfreturns,type="h",main="",xlab="",ylab="",ylim=range, xaxt="n")
97
text( x=IBMdate[5], y = 0.9*range[2], labels="Monthly returns on portfolio with 50% IBM and 50% 10 yrs US T-Note" ,pos=4)
98
abline( h=-MES, lty=1 ,lwd=3 , col="blue");
99
text( IBMdate[1],y = -1.3*MES, labels="1% Portfolio modES",pos=4, col="blue",cex=0.8 )
100
101
par(mar=c(2,2,0,2),cex=1.3)
102
103
plot(IBMdate,IBMreturns,type="h",main="",xlab="",ylab="",ylim=range, xaxt="n")
104
text( IBMdate[5],y = 0.9*range[2], labels="Monthly returns on IBM stock" ,pos=4 )
105
text( IBMdate[1],y = -1.3*MES, labels="1% Portfolio modES",pos=4, col="blue" ,cex=0.8)
106
107
abline( h=-MES, lty=1 ,lwd=3 , col="blue" );
108
109
par(mar=c(2,2,0,2),cex=1.3 )
110
111
plot(IBMdate,USTnotereturns,type="h",main="",xlab="",ylab="",ylim=range)
112
text( x=IBMdate[5], y = 0.9*range[2], labels="Monthly returns on 10yrs US T-Note" ,pos=4 )
113
abline( h=-MES, lty = 1,lwd=3 , col="blue" );
114
text( IBMdate[1],y = -1.3*MES, labels="1% Portfolio modES",pos=4 , col="blue",cex=0.8)
115
116
dev.off()
117
118
119
######################################################################
120
121
# Intraweek pattern
122
123
###################################################################
124
# Conditional normality and jumps #
125
# Authors: Kris Boudt, Christophe Croux and Sebastien Laurent #
126
###################################################################
127
128
source("seasonalityfunctions15augustbis.R")
129
130
# load data
131
132
EUR = read.table("EUR_USD_5minEST_1987_2004.txt",skip=1)
133
EUR.dow = read.table("EUR_USD_5minDOW_1987_2004.txt",skip=1)
134
#EUR.date=EUR[1,];
135
subset = c(3452:4371) # January 2001 till September 20, 2004
136
#subset = c(3201:4371) # January 2000 till September 20, 2004
137
#subset = c(1956:4371) # January 1995 till September 20, 2004
138
#subset= c(4127:4371) # October 1, 2003 till September 30, 2004
139
EUR = EUR[subset,]
140
EUR.date=EUR[,1];
141
EUR = EUR[,c(2:dim(EUR)[2])];
142
cDays = length(EUR.date)
143
EUR.dow = EUR.dow[subset,2];
144
#EUR.dow = EUR.dow[,2];
145
EUR.dowdummies=matrix(rep(0,cDays*5),ncol=5);
146
for(d in 1:5){ EUR.dowdummies[EUR.dow==d,d]=1 }
147
148
EUR = as.matrix(EUR); vEUR = as.vector(EUR); nobs = length(vEUR)
149
150
rob.stdEUR= standardize(data=EUR , method="LM" ) ; rob.vstdEUR = as.vector(rob.stdEUR)
151
152
SD.seas.scale = seasonality( stddata = rob.stdEUR, approach="scale" , method = "sd", standardize=T );
153
AROWVar.seas.scale = seasonality( stddata = rob.stdEUR, approach="scale" , method = "AROWVar", standardize=T );
154
155
range = c( 0.9*min(AROWVar.seas.scale, SD.seas.scale) , 1.1*max(AROWVar.seas.scale, SD.seas.scale) )
156
cIntraDay = length(SD.seas.scale)
157
158
#range=c( 0.9*min(SD.seas.scale) , 1.1*max(SD.seas.scale) )
159
160
161
times = c(1,103,199,288)
162
names = c("16:00","24:00","8:30","15:55")
163
164
postscript("SDseasonality.eps")
165
166
par(mfrow=c(1,1),mar=c(2,2,3,2),cex=1.3 ,cex.axis=1)
167
par( mar=rep(2,4) )
168
# plot robust seasonality estimates
169
plot(c(1:cIntraDay),SD.seas.scale,type="l",xlab="",ylab="" , xaxt="n", ylim=range,
170
main="Intraday pattern in volatility of 5-min EUR/USD returns" )
171
axis(1, at=times , tick=T, labels= names)
172
dev.off()
173
174
175
AROWVar.seas.scale = seasonality( stddata = rob.stdEUR, approach="scale" , method = "AROWVar", standardize=T );
176
177
cIntraDay = length(AROWVar.seas.scale)
178
#range=c( 0.9*min(AROWVar.seas.scale) , 1.1*max(AROWVar.seas.scale) )
179
180
181
times = c(1,103,199,288)
182
names = c("16:00","24:00","8:30","15:55")
183
184
postscript("dailyscaleseasonality3.eps")
185
186
par(mfrow=c(1,1),mar=c(2,2,3,2),cex=1.3 ,cex.axis=1)
187
par( mar=rep(2,4) )
188
# plot robust seasonality estimates
189
plot(c(1:cIntraDay),AROWVar.seas.scale,type="l",xlab="",ylab="" , xaxt="n", ylim=range,
190
main="Intraday pattern in volatility of 5-min EUR/USD returns" )
191
axis(1, at=times , tick=T, labels= names)
192
dev.off()
193
194
195
# Time-varying volatility of Daily returns IBM
196
197
data=read.table("IBM.txt",skip=1,nrows=-1)
198
IBMdate = chron( as.character(data[,1]),format=c(dates="d/m/y") ); IBMreturns = data[,2];
199
start=5449; end=length(IBMdate);
200
IBMdate = IBMdate[start:end] ; IBMreturns = IBMreturns[start:end]; print(length(IBMdate));
201
z99 = qnorm(0.99)
202
band = mean(IBMreturns)+z99*sd(IBMreturns)
203
data=read.table("monthlyIBM.txt",skip=1,nrows=-1)
204
205
range = c(-maxvalue,maxvalue)
206
postscript("dailyreturns.eps")
207
par(mfrow=c(2,1),mar=c(2,2,3,2),cex=1.3)
208
maxvalue = 1.05*max( abs( min(IBMreturns) ) , IBMreturns );
209
plot(IBMdate,IBMreturns,type="h",main="Daily returns on IBM stock",xlab="",ylab="",ylim=range)
210
abline( h=band, lty=3 ); abline(h=-band , lty=3 )
211
plot(IBMdate, rnorm(length(IBMdate), mean=mean(IBMreturns),sd=sd(IBMreturns)),
212
main="Simulated returns from a normal distribution" ,type="h",ylim=range)
213
abline( h=band, lty=3 ); abline(h=-band , lty=3 )
214
dev.off()
215
216
# Commonality daily returns IBM and MSFT
217
218
219
dataIBM=read.table("IBM.txt",skip=1,nrows=-1)
220
IBMdate = chron( as.character(dataIBM[,1]),format=c(dates="d/m/y") ); IBMreturns = dataIBM[,2];
221
start=5449; end=length(IBMdate);
222
IBMdate = IBMdate[start:end] ; IBMreturns = IBMreturns[start:end]; print(length(IBMdate));
223
224
dataGE=read.table("dailyGE.txt",skip=1,nrows=-1)
225
GEdate = chron( as.character(dataGE[,1]),format=c(dates="d/m/y") ); GEreturns = dataGE[,2];
226
start=5449; end=length(GEdate);
227
GEdate = GEdate[start:end] ; GEreturns = GEreturns[start:end]; print(length(GEdate));
228
229
z99 = qnorm(0.99)
230
band = mean(IBMreturns)+z99*sd(IBMreturns)
231
data=read.table("monthlyIBM.txt",skip=1,nrows=-1)
232
233
maxvalue = 1.05*max( abs( min(IBMreturns,GEreturns) ) , IBMreturns,GEreturns );range = c(-maxvalue,maxvalue)
234
235
postscript("commonality.eps")
236
par(mfrow=c(2,1),mar=c(2,2,3,2),cex=1.3)
237
238
plot(IBMdate,IBMreturns,type="h",main="Daily returns on IBM stock",xlab="",ylab="",ylim=range)
239
abline( h=band, lty=3 ); abline(h=-band , lty=3 )
240
241
band = mean(GEreturns)+z99*sd(GEreturns)
242
plot(GEdate,GEreturns,type="h",main="Daily returns on GE stock",xlab="",ylab="",ylim=range)
243
244
abline( h=band, lty=3 ); abline(h=-band , lty=3 )
245
dev.off()
246
247
248
249
# Price jumps
250
251
data=read.table("intraday.txt",skip=1,nrows=-1)
252
EUR = data[,1]; GBP = data[,2];
253
254
loc = c( 1 , 6*12 , 12*12 , 18*12 , 24*12 )
255
names = c( "00:05 GMT" , "06:00" , "12:00" , "18:00" , "24:00" )
256
257
postscript("intraday.eps")
258
par(mfrow=c(2,1),mar=c(2,2,3,2),cex=1.3)
259
260
plot(c(1:288),EUR,type="l",main="5-min EUR/USD FX rates on June 9, 2003",xlab="",ylab="", xaxt="n")
261
axis( side = 1 , at = loc , labels = names)
262
263
plot(c(1:288),GBP,type="l",main="5-min GBP/USD FX rates on June 9, 2003",xlab="",ylab="",xaxt="n")
264
axis( side = 1 , at = loc , labels = names)
265
266
dev.off()
267
268
# Effect on correlation
269
270
RQCov=read.table(file="dailyRQCov_EURGBP.txt");
271
vRQCov11=RQCov[,2]; vRQCov22=RQCov[,3]; vRQCov12=RQCov[,4]; vRQCor=RQCov[,5];
272
RBPCov=read.table(file="dailyRBPCov_EURGBP.txt");
273
vRBPCov11=RBPCov[,2]; vRBPCov22=RBPCov[,3]; vRBPCov12=RBPCov[,4]; vRBPCor= RBPCov[,5];
274
ROWQCov=read.table(file="dailyMCDROWCov_EURGBP.txt");
275
vROWQCov11=ROWQCov[,2]; vROWQCov22=ROWQCov[,3]; vROWQCov12=ROWQCov[,4]; vROWQCor=ROWQCov[,5];
276
dailymaxoutlyingness = ROWQCov[,6];
277
cDays=length(RQCov); days=read.csv2("days.csv",sep=";",skip=0,header=F);
278
days=paste(as.character(days[[1]]),as.character(days[[2]]),as.character(days[[3]]),sep="/");
279
days = chron(days,format=c(dates="y/m/d"))
280
281
day1 = 4014;
282
283
subset1 = c(3907:4152) # April - June 1998
284
subset1days = days[subset1] ; # cbind(subset1, as.character(subset1days) )
285
286
times = c( 3907 , 4014 , 4152 );
287
names = c("Jan,3", "June,9", "Dec,30") # subset1days[times]
288
subset1days = 1:length (subset1) ; # 63 observation
289
290
size = 1.3
291
292
vRQCor[day1];vRBPCor[day1];vROWQCor[day1];
293
294
postscript("correlation.ps", family="Times", horizontal=FALSE, width=12,height=6)
295
par(mfrow=c(3,1),cex.axis=1.3,cex.lab=1.3)
296
par(mar=c(1.5,2.2,0.7,2)) # c(bottom, left, top, right)
297
298
range=c( min(vRQCor[subset1],vRBPCor[subset1],vROWQCor[subset1]) ,
299
1.1*max(vRQCor[subset1],vRBPCor[subset1],vROWQCor[subset1]) )
300
301
plot( subset1, vRQCor[subset1] , xlab="", type="l",lwd=3 ,ylab="" , ylim= range , xaxt="n" )
302
text(x=subset1[2],y=0.98*range[2],labels="Daily RQCor",adj=c(0,.75),cex=size)
303
abline(h=0.2,lty=3) ; abline(h=0.4,lty=3);abline(h=0.6,lty=3);
304
305
#range=c( min(vRBPCor[subset1]) , 1.1*max(vBPCor[subset1]) )
306
plot( subset1 , vRBPCor[subset1] , xlab="", type="l",lwd=3 ,ylab="" , ylim= range , xaxt="n" )
307
abline(h=0.2,lty=3) ; abline(h=0.4,lty=3);abline(h=0.6,lty=3);
308
text(x=subset1[2] ,y=0.98*range[2],labels="Daily RBPCor",adj=c(0,.75),cex=size)
309
310
par(mar=c(2.2,2.2,0,2)) # c(bottom, left, top, right)
311
312
#range=c( min(vMCDOWCor[subset1]) , 1.1*max(vMCDOWCor[subset1]) )
313
plot( subset1 , vROWQCor[subset1] , xlab="", type="l",lwd=3 ,ylab="" , ylim= range , xaxt="n" )
314
axis(1, at=times , tick=T, labels= names ,cex.axis=size )
315
text(x=subset1[2] ,y=0.98*range[2],labels="Daily ROWQCor",adj=c(0,.75),cex=size)
316
abline(h=0.2,lty=3) ; abline(h=0.4,lty=3);abline(h=0.6,lty=3);
317
318
dev.off()
319
320
postscript("correlation2.eps")
321
par(mfrow=c(2,1),mar=c(2,2,3,2),cex=1.3)
322
323
plot( subset1 ,vRBPCor[subset1] , xlab="", type="l",lwd=3 , main=" 'robust' daily correlation", ylab="" ,
324
ylim= range , xaxt="n" )
325
axis(1, at=times , tick=T, labels= names ,cex.axis=size )
326
plot( subset1 ,vROWQCor[subset1] , xlab="", type="l",lwd=3 , main=" daily correlation using new method ", ylab="" ,
327
ylim= range , xaxt="n" )
328
axis(1, at=times , tick=T, labels= names ,cex.axis=size )
329
dev.off()
330
331