【问题标题】:Calculate the beta between stocks in my portfolio in matrix form以矩阵形式计算我的投资组合中股票之间的贝塔
【发布时间】:2020-11-23 07:13:41
【问题描述】:

可以提取我投资组合中三只股票的数据,计算记录的回报并生成相关矩阵。想以矩阵的形式查看每只股票之间的 beta,但不确定如何实现。

#Created logged returns from prices:
x <-Return.calculate(x, method="log")
names(x)<- c("Apple","Facebook", "Google")
cor(x)

数据结构和相关矩阵:

【问题讨论】:

    标签: r regression beta portfolio


    【解决方案1】:

    与相关性一样,计算 beta 值的方法也不同;特别是,如果您的目标是实际预测它们。但是 OLS-beta 可以写成相关乘以股票(regressand)和指数(regressor)的波动率之比。

    这是一个可重现的小例子:

    P <- structure(c(3257.85, 3234.84, 3246.3, 3237.17, 3253.05, 3274.7, 
                     3265.35, 3288.1, 3283.09, 3289.3, 3316.81, 3329.59,
                     1898.01, 1874.97, 1902.88, 1906.86, 1891.97, 1901.05,
                     1883.16, 1891.3, 1869.44, 1862.02, 1877.94, 1864.72,
                     160.62, 158.62, 159.03, 157.58, 160.09, 162.09, 161.34,
                     163.28, 162.13, 163.18, 166.17, 167.1),
                   .Dim = c(12L, 3L),
                   .Dimnames = list(c("2020-01-02", "2020-01-03", "2020-01-06",
                                      "2020-01-07", "2020-01-08", "2020-01-09",
                                      "2020-01-10", "2020-01-13", "2020-01-14",
                                      "2020-01-15", "2020-01-16", "2020-01-17"),
                                    c("SPX", "AMZN", "MSFT")))
    
    ##                SPX    AMZN   MSFT
    ## 2020-01-02 3257.85 1898.01 160.62
    ## 2020-01-03 3234.84 1874.97 158.62
    ## 2020-01-06 3246.30 1902.88 159.03
    ## 2020-01-07 3237.17 1906.86 157.58
    ## 2020-01-08 3253.05 1891.97 160.09
    ## 2020-01-09 3274.70 1901.05 162.09
    ## 2020-01-10 3265.35 1883.16 161.34
    ## 2020-01-13 3288.10 1891.30 163.28
    ## 2020-01-14 3283.09 1869.44 162.13
    ## 2020-01-15 3289.30 1862.02 163.18
    ## 2020-01-16 3316.81 1877.94 166.17
    ## 2020-01-17 3329.59 1864.72 167.10
    
    library("PMwR")  ## for function 'returns'
    R <- returns(P)
    

    相关性:

    cor(R)
    ##            SPX      AMZN      MSFT
    ## SPX  1.0000000 0.6143659 0.9518773
    ## AMZN 0.6143659 1.0000000 0.4572081
    ## MSFT 0.9518773 0.4572081 1.0000000
    

    对于测试版,您需要波动率,存储在下方s 中。生成的矩阵包含所需的 beta。列表示回归量,行表示回归量。所以,例如, 在SPX 上回归时,MSFT 的 beta 值为 2.057。注意这个矩阵不是对称的。

    s <- apply(R, 2, sd)
    (1/s) %*% t(s) * cor(R)
    ##            SPX      AMZN      MSFT
    ## [1,] 1.0000000 1.1226870 2.0574562
    ## [2,] 0.3361983 1.0000000 0.5407941
    ## [3,] 0.4403838 0.3865413 1.0000000
    

    一些检查:

    ## beta of AMZN on SPX
    lm(R[, "AMZN"] ~ R[, "SPX"])
    ## Call:
    ## lm(formula = R[, "AMZN"] ~ R[, "SPX"])
    ## 
    ## Coefficients:
    ## (Intercept)   R[, "SPX"]  
    ##   -0.003808     1.122687  
    
    ## beta of MSFT on SPX
    lm(R[, "MSFT"] ~ R[, "SPX"])
    ## Call:
    ## lm(formula = R[, "MSFT"] ~ R[, "SPX"])
    ## 
    ## Coefficients:
    ## (Intercept)   R[, "SPX"]  
    ##  -0.0004474    2.0574562  
    

    更方便的是将这样的回归合二为一:

    lm.fit(cbind(constant = 1, beta = R[, 1]), R[, -1])$coefficients
    ##                  AMZN          MSFT
    ## constant -0.003808244 -0.0004474033
    ## beta      1.122686957  2.0574561738
    
    lm.fit(cbind(constant = 1, beta = R[, 1]), R[, -1])$coefficients[2, ]
    ##     AMZN     MSFT 
    ## 1.122687 2.057456 
    

    将最后一个结果与最初计算的矩阵的第一行进行比较。

    【讨论】:

    • 完美,不完全理解 (1/s) %*% t(s) * cor(R) 但会离开并学习它。非常感谢。
    猜你喜欢
    • 2018-03-25
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多