Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/sandbox/paper_analysis/insample/coskewkurtosis.R
1433 views
1
2
vech <- function (x)
3
{
4
t(x[!upper.tri(x)])
5
}
6
7
fm2 = function(u){
8
return( mean(u^2))
9
}
10
fm3 = function(u){
11
return( mean(u^3))
12
}
13
fm4 = function(u){
14
return( mean(u^4))
15
}
16
fm6 = function(u){
17
return( mean(u^6))
18
}
19
20
# U = matrix( rnorm(400) , ncol = 4 )
21
coskewCC = function( U ){
22
# Implementation for N >= 3
23
# The coskewness matrix is based on stacking subcomoment matrices columnwise
24
# Advantage: matrix notation:
25
# M3 = E[ UU' %x% U ]: [U[1]%*%UU' | U[2]%*%UU' | ... | U[N]%*%UU' ]
26
# element [j,(i-1)N+k] is E[U[i]*U[j]*U[k]]
27
# U needs to be a TxN matrix holding the centred returns of asset i in column i
28
# N rows, N^3 columns
29
# See Martellini and Ziemann (Review of Financial Studies)
30
31
N = ncol(U); T = nrow(U);
32
vm2 = apply(U , 2 , 'fm2' )
33
vm3 = apply(U , 2 , 'fm3' )
34
vm4 = apply(U , 2 , 'fm4' )
35
36
vr2 = c();
37
for( j in 2:N ){
38
for( i in 1:(j-1) ){
39
vr2 = c( vr2 , sum( U[,i]^2*U[,j] )/sqrt( vm4[i]*vm2[j] ) )
40
}
41
}
42
r2 = sum(vr2)*2/( T*N*(N-1) )
43
44
vr5 = c();
45
for( j in 2:N ){
46
for( i in 1:(j-1) ){
47
vr5 = c( vr5 , sum( U[,i]^2*U[,j]^2 )/sqrt( vm4[i]*vm4[j] ) )
48
}
49
}
50
r5 = sum(vr5)*2/( T*N*(N-1) )
51
52
vr4 = c();
53
for( k in 3:N ){
54
for( j in 2:(k-1) ){
55
for( i in 1:(j-1) ){
56
#vr4 = c( vr4 , sum( U[,i]*U[,j]*U[,k] )/sqrt( vm2[k]*r5*sqrt(vm4[i]*vm4[j]) ) )
57
denom = mean(
58
c(vm2[k]*r5*sqrt( vm4[i]*vm4[j] ) , vm2[i]*r5*sqrt( vm4[j]*vm4[k] ) , vm2[j]*r5*sqrt( vm4[i]*vm4[k] ) ) )
59
vr4 = c( vr4 , sum( U[,i]*U[,j]*U[,k] )/sqrt( denom ) )
60
}
61
}
62
}
63
r4 = sum(vr4)*6/( T*N*(N-1)*(N-2) )
64
65
66
67
M3CC = matrix( rep(0,N^3) , nrow = N )
68
for( i in 1:N ){
69
for( j in 1:N ){
70
for( k in 1:N ){
71
if( (i==j) & (j==k) & (i==k) ){
72
sijk = vm3[i]
73
}else{
74
if( (i==j) | (i==k) | (j==k) ){
75
if( (i==j) ){ sijk = r2*sqrt( vm4[i]*vm2[k] )}
76
if( (i==k) ){ sijk = r2*sqrt( vm4[i]*vm2[j] )}
77
if( (j==k) ){ sijk = r2*sqrt( vm4[j]*vm2[i] )}
78
}else{
79
# sijk = r4*sqrt( vm2[k]*r5*sqrt( vm4[i]*vm4[j] ) )
80
sijk_all = r4*sqrt(
81
mean(
82
c(vm2[k]*r5*sqrt( vm4[i]*vm4[j] ) , vm2[i]*r5*sqrt( vm4[j]*vm4[k] ) , vm2[j]*r5*sqrt( vm4[i]*vm4[k] ) ) ))
83
sijk = sijk_all
84
}
85
}
86
# i denotes the subcomoment matrix
87
M3CC[j,(i-1)*N+k] = sijk;
88
}
89
}
90
}
91
return(M3CC)
92
}
93
94
# cokurtCC(U)
95
cokurtCC = function( U ){
96
# Implementation for N >=4
97
# The coskewness matrix is based on stacking subcomoment matrices columnwise
98
# Advantage: matrix notation
99
# M4 = E[ UU' %x% U %x% U ]:
100
#[ U[1]^2%*%UU'| U[1]U[2]%*%UU' | .... | U[1]U[N]%*%UU'|
101
# U[2]U[1]%*%UU'| U[2]^2%*%UU' | .... | U[2]U[N]%*%UU'|
102
# ...
103
# U[N]U[1]%*%UU'| U[N]U[2]%*%UU' | .... | U[N]^2%*%UU ]
104
# element [k,( (i-1)*(N^2)+(j-1)*N+l )] is E[ U[i]*U[j]*U[k]*U[l] ]
105
# U needs to be a TxN matrix holding the centred returns of asset i in column i
106
# N rows, N^4 columns
107
# See Martellini and Ziemann (Review of Financial Studies)
108
109
N = ncol(U); T = nrow(U);
110
vm2 = apply(U , 2 , 'fm2' )
111
vm3 = apply(U , 2 , 'fm3' )
112
vm4 = apply(U , 2 , 'fm4' )
113
vm6 = apply(U , 2 , 'fm6' )
114
115
vr3 = c();
116
for( j in 2:N ){
117
for( i in 1:(j-1) ){
118
vr3 = c( vr3 , sum( U[,i]^3*U[,j] )/sqrt( vm6[i]*vm2[j] ) )
119
}
120
}
121
r3 = sum(vr3)*2/( T*N*(N-1) )
122
123
124
vr5 = c();
125
for( j in 2:N ){
126
for( i in 1:(j-1) ){
127
vr5 = c( vr5 , sum( U[,i]^2*U[,j]^2 )/sqrt( vm4[i]*vm4[j] ) )
128
}
129
}
130
r5 = sum(vr5)*2/( T*N*(N-1) )
131
132
vr6 = c();
133
for( k in 3:N ){
134
for( j in 2:(k-1) ){
135
for( i in 1:(j-1) ){
136
vr6 = c( vr6 , sum( U[,i]^2*U[,j]*U[,k] )/sqrt( vm4[i]*r5*sqrt(vm4[j]*vm4[k]) ) )
137
}
138
}
139
}
140
r6 = sum(vr6)*6/( T*N*(N-1)*(N-2) )
141
142
vr7 = c();
143
for( l in 4:N ){
144
for( k in 3:(l-1) ){
145
for( j in 2:(k-1) ){
146
for( i in 1:(j-1) ){
147
vr7 = c( vr7 , sum( U[,i]*U[,j]*U[,k]*U[,l] )/sqrt( r5*sqrt(vm4[i]*vm4[j])*r5*sqrt(vm4[k]*vm4[l]) ) )
148
}
149
}
150
}
151
}
152
r7 = sum(vr7)*24/( T*N*(N-1)*(N-2)*(N-3) )
153
154
M4CC = matrix( rep(0,N^4) , nrow = N )
155
for( i in 1:N ){
156
for( j in 1:N ){
157
for( k in 1:N ){
158
for( l in 1:N ){
159
# in the general case: i, j , k and l are all different
160
kijkl = r7*sqrt( r5*sqrt(vm4[i]*vm4[j])*r5*sqrt(vm4[k]*vm4[l]) )
161
# if at least one of them are equal:
162
163
if( (i==j) | (i==k) | (i==l) | (j==k) | (j==l) | (k==l) ){
164
165
if( (i==j) & (i==k) & (i==l) ){
166
# These are the kurtosis estimates of the individual assets: E[u^4]
167
kijkl = vm4[i];
168
}else{
169
if( ((i==j) & (i==k)) | ((i==j) & (i==l)) | ((i==k) & (i==l)) | ((j==k) & (j==l)) ){
170
# kiij E[ U[,i]^3*U[,j] ] = r3*sqrt( vm6[i]*vm2[j] )
171
if( ((i==j) & (i==k)) ){ kijkl = r3*sqrt( vm6[i]*vm2[l] ) }
172
if( ((i==j) & (i==l)) ){ kijkl = r3*sqrt( vm6[i]*vm2[k] ) }
173
if( ((i==k) & (i==l)) ){ kijkl = r3*sqrt( vm6[i]*vm2[j] ) }
174
if( ((j==k) & (j==l)) ){ kijkl = r3*sqrt( vm6[j]*vm2[i] ) }
175
}else{
176
if( ((i==j) & (k==l))| ( (i==k) & (j==l) ) | ( (i==l) & (j==k)) ){
177
# kiijj = E[ U[,i]^2*U[,j]^2 ] = r5*sqrt( vm4[i]*vm4[j] )
178
if ( ((i==j) & (k==l)) ){ kijkl = r5*sqrt( vm4[i]*vm4[k] ) }
179
if ( ((i==k) & (j==l)) ){ kijkl = r5*sqrt( vm4[i]*vm4[j] ) }
180
if ( ((i==l) & (j==k)) ){ kijkl = r5*sqrt( vm4[i]*vm4[j] ) }
181
}else{
182
# kiijk = E[ U[,i]^2*U[,j]*U[,k] ] = r6*sqrt( vm4[i]*r5*sqrt( vm4[j]*vm4[k] ) )
183
if ( (i==j) ){ kijkl = r6*sqrt( vm4[i]*r5*sqrt(vm4[k]*vm4[l]) ) }
184
if ( (i==k) ){ kijkl = r6*sqrt( vm4[i]*r5*sqrt(vm4[j]*vm4[l]) ) }
185
if ( (i==l) ){ kijkl = r6*sqrt( vm4[i]*r5*sqrt(vm4[j]*vm4[k]) ) }
186
if ( (j==k) ){ kijkl = r6*sqrt( vm4[j]*r5*sqrt(vm4[i]*vm4[l]) ) }
187
if ( (j==l) ){ kijkl = r6*sqrt( vm4[j]*r5*sqrt(vm4[i]*vm4[k]) ) }
188
if ( (k==l) ){ kijkl = r6*sqrt( vm4[k]*r5*sqrt(vm4[i]*vm4[j]) ) }
189
}
190
}
191
}
192
}
193
M4CC[k,( (i-1)*(N^2)+(j-1)*N+l )] = kijkl;
194
}#loop l
195
}#loop k
196
}#loop j
197
}#loop i
198
return(M4CC)
199
}
200
201
202