R 循环从回归构造协方差矩阵
我正在尝试构造一个协方差矩阵,我认为这必须使用循环来完成 我有一套针对单个指数(DowJones)的30个回归,该指数创建了一个包含截距(alpha)、斜率(beta_I)和残差标准偏差(epsilon)的表。我特别需要构造矩阵R 循环从回归构造协方差矩阵,r,loops,regression,covariance,finance,R,Loops,Regression,Covariance,Finance,我正在尝试构造一个协方差矩阵,我认为这必须使用循环来完成 我有一套针对单个指数(DowJones)的30个回归,该指数创建了一个包含截距(alpha)、斜率(beta_I)和残差标准偏差(epsilon)的表。我特别需要构造矩阵σij=βI*βj*σ^2m,其中βI、βj等是本表的斜率,σ^2m是称为dji_var的方差变量。因此,first slope*first slope*dji_var填充协方差矩阵的第一个元素 有没有人能帮我轻松完成这个任务?我的协方差矩阵的维数应该是30x30 多谢各
σij=βI*βj*σ^2m
,其中βI、βj等
是本表的斜率,σ^2m
是称为dji_var
的方差变量。因此,first slope*first slope*dji_var
填充协方差矩阵的第一个元素
有没有人能帮我轻松完成这个任务?我的协方差矩阵的维数应该是30x30
多谢各位
这就是我到目前为止所做的:
############# Regressing each company’s returns onto the index return #########
#lm(AAPL~DJI), lm(AXP~DJI), lm(BA~DJI), lm(CAT~DJI), lm(CSCO~DJI), lm(CVX~DJI), lm(DD~DJI), lm(DIS~DJI),
#lm(GE~DJI),lm(GS~DJI),lm(HD~DJI),lm(IBM~DJI),lm(INTC~DJI), lm(JNJ~DJI), lm(JPM~DJI), lm(KO~DJI),
#lm(MCD~DJI), lm(MMM~DJI), lm(MRK~DJI), lm(MSFT~DJI), lm(NKE~DJI), lm(PFE~DJI), lm(PG~DJI), lm(TRV~DJI),
#lm(UNH~DJI),lm(UTX~DJI),lm(V~DJI),lm(VZ~DJI),lm(WMT~DJI), lm(XOM~DJI)
resultdf <- data.frame(matrix(NA,0,4), stringsAsFactors = FALSE)
names(resultdf) <- c("Asset", "Intercept", "Slope", "Std_of_Residuals")
i <-1
for (i in 1:30){
regression_company_dji <- lm(timeseriesreturns[,i] ~ dji[,1])
resultdf <- rbind(resultdf, data.frame(Asset= i,
Intercept = regression_company_dji$coefficients[[1]],
Slope= regression_company_dji$coefficients[[2]],
Std_of_Residuals = sd(resid(regression_company_dji))
))
#i <- i +1 #DO WE REALLY NEED THIS LINE
}
#prints a table of intercepts, slopes (βi), and idiosyncratic standard deviations σRi (standard deviation of the residuals)
head(resultdf)
# Asset Intercept Slope Std_of_Residuals
#1 1 0.02676350 1.1387824 1.2474725
#2 2 -0.07187497 0.8535259 1.1008612
#3 3 0.06966935 1.0196946 0.9490182
#4 4 -0.12898852 1.0635297 1.2044883
#5 5 0.07498498 1.0600683 0.9935900
#6 6 -0.10309059 1.1483061 1.2779884
#ASSET 1 STARTS WITH AAPL, THEN GOES AXP, BA, CAT, ETC.
#WE HAVE A TABLE OF INTERCEPTS, SLOPES AND STANDARD DEVIATIONS OF RESIDUALS FOR EACH REGRESSION BETWEEN COMPANY RETURNS AND INDEX RETURN
############## Variance of DowJones Index return ######################
dji_var <- var(dji[,1])
#0.8873133
######### SINGLE INDEX APPROXIMATION #################################
# In Single-Index Model:
# Intercept = alpha_i
# Slope = beta_i
# Std_of_Residuals = sigma_Ri
# This equation is referred to as the single-index model,
# rit = αi + βirmt + εit (8.1)
# αi and βi are the intercept and slope coefficients that result from:
# regressing the rate of return from asset i in period t, denoted rit, onto
# the simultaneous rate of return on some market index in period t, denoted rmt; and
# εit is the unexplained residual error term for asset i in period t.
#########################################################################################
#the Covariance Matrix between two different securities i and j can be expressed as:
# σij = βi* βj* σ^2m.
sigma_squared_market <- dji_var
# [1] 0.8873133
dput(resultdf)
structure(list(Asset = 1:30, Intercept = c(0.0267635033349584,
-0.0718749662550324, 0.069669346056576, -0.128988516445594, 0.0749849799579864,
-0.103090590571032, -0.0181204083787094, 0.0940216340701365,
0.0601045129621876, -0.00712297315161099, 0.100323562649478,
-0.0517406457596374, 0.012599051698687, -0.0218711039493553,
0.0263255529821284, 0.0197321609378249, 0.08018398886968, 0.0115659025410572,
-0.0207922446090187, 0.0629952677099163, 0.137484116508374, 0.0620066345319251,
-0.0416494718503931, 0.0482722555478251, 0.0886134357472885,
-0.0240313203975499, 0.142979385201501, -0.0193601624887868,
-0.107001092634366, -0.0592959645858059), Slope = c(1.13878236093664,
0.853525869839225, 1.01969460976746, 1.06352969847768, 1.06006825519905,
1.14830613937928, 1.02057992982579, 0.917124514708528, 1.06521921561495,
1.16527602124266, 1.01554236848894, 1.05028610720528, 0.99954945490449,
0.854040163442602, 1.20416480868948, 0.662824098888303, 0.930011492883117,
0.963949283094558, 0.953009111832057, 1.24362084628936, 0.982034757703831,
0.885675351438922, 0.766292851924153, 0.873619973887616, 1.03103698221555,
0.977088962832525, 1.11842324882864, 0.748745167476966, 0.77506736508709,
1.05126852549869), Std_of_Residuals = c(1.24747249150145, 1.10086122769927,
0.949018244224872, 1.20448829818015, 0.99358998832754, 1.2779884149182,
1.13129109038816, 1.03393869712944, 0.999480572360969, 0.690970159142872,
0.783262244296981, 0.868512560468288, 1.28324642163822, 0.656011164082018,
0.717972392581603, 0.6617871220526, 0.901244987788103, 0.60700558064988,
1.02292450298541, 1.34320098732505, 0.961307330185487, 0.815493628199713,
0.650600876764784, 0.655802004867679, 1.1807969036117, 0.835687577257354,
1.02888260605468, 0.721618425329537, 1.08066991592903, 0.955080491660557
)), row.names = c(NA, -30L), class = "data.frame")
将每家公司的收益回归到指数收益#########
#lm(AAPL~DJI)、lm(AXP~DJI)、lm(BA~DJI)、lm(CAT~DJI)、lm(CSCO~DJI)、lm(CVX~DJI)、lm(DD~DJI)、lm(DIS~DJI),
#lm(GE~DJI)、lm(GS~DJI)、lm(HD~DJI)、lm(IBM~DJI)、lm(INTC~DJI)、lm(JNJ~DJI)、lm(JPM~DJI)、lm(KO~DJI),
#lm(MCD~DJI)、lm(MMM~DJI)、lm(MRK~DJI)、lm(MSFT~DJI)、lm(NKE~DJI)、lm(PFE~DJI)、lm(PG~DJI)、lm(TRV~DJI),
#lm(UNH~DJI)、lm(UTX~DJI)、lm(V~DJI)、lm(VZ~DJI)、lm(WMT~DJI)、lm(XOM~DJI)
resultdf我们可以得到向量的外积
resultdf$Slope
,其中
数组X和Y的外积是维数为c(dim(X),dim(Y))的数组A,其中元素A[c(arrayindex.X,arrayindex.Y)]=FUN(X[arrayindex.X],Y[arrayindex.Y],…)
(从帮助(“外部”)
)。在这里,我们特别感兴趣的是FUN
的乘法函数,但您可能会注意到,R命令outer()
也可以处理其他函数,以供将来参考。然后我们只需要将每个元素乘以dji\u var
。完整的解决方案是
covmat Help-us帮助您:请将您的问题粘贴到R命令的输出dput(resultdf)
。然后,我们可以在自己的R会话中轻松处理您的数据。我有一个解决方案,但为了完整性,我想测试它first@duckmayr您好,谢谢您的回复!我添加了您所说的命令和输出。如果您愿意,我还可以包括resultdf
的完整表格!这真是一个令人惊奇的方法。我没想到在一条线上就能做到。我试图写一个for循环来遍历每个斜率,并以此方式构造协方差矩阵。这太棒了。非常感谢你!不用担心@eruiz,很高兴它起了作用!在BaseR中有很多类似的函数,它们非常有用,但也很容易被忽略,在tidyverse
时代,它们没有被教得那么多。我的协方差的对角线需要修改,以包括一个噪声项,它是+(std_of_Residuals)^2
。因此,当beta_i*beta_i是协方差矩阵中的第一个元素时,我还需要将第一行的残差的方差相加。但是既然我已经有了我的std,我怎么能只在对角线上加一个平方项呢?@eruiz请看我答案的更新:你可以只加一个通过diag()创建的对角线矩阵。
谢谢你的澄清,我不确定对角线的加法是限于一个标量值还是一个常量。你太好了