Как рассчитать переменные CAPM в Julia? - PullRequest
1 голос
/ 08 мая 2020

В Python, используя статистику пакета scipy, переменные beta, alpha, r, p, std_err CAPM можно рассчитать следующим образом:

beta, alpha, r_value, pvalue, std_err = stats.linregress(stock_rtn_arr, mkt_rtn_arr)

Пожалуйста, помогите мне вычислить вышеуказанные переменные в Julia.

1 Ответ

2 голосов
/ 08 мая 2020

Я предполагаю, что вы хотите запустить простую модель OLS, которую в Julia можно подогнать с помощью пакета GLM:

julia> using GLM, DataFrame

julia> mkt_rtn_arr = randn(500); stock_rtn_arr = 0.5*mkt_rtn_arr .+ rand();

julia> df = DataFrame(mkt_rtn = mkt_rtn_arr, stock_rtn = stock_rtn_arr);

julia> linear_model = lm(@formula(stock_rtn ~ mkt_rtn), df)
StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

stock_rtn ~ 1 + mkt_rtn

Coefficients:
──────────────────────────────────────────────────────────────────────────────
             Estimate   Std. Error     t value  Pr(>|t|)  Lower 95%  Upper 95%
──────────────────────────────────────────────────────────────────────────────
(Intercept)  0.616791  7.80308e-18  7.90446e16    <1e-99   0.616791   0.616791
mkt_rtn      0.5       7.78767e-18  6.42041e16    <1e-99   0.5        0.5
──────────────────────────────────────────────────────────────────────────────

Затем вы можете извлечь интересующие параметры из linear_model:

julia> β = coef(linear_model)[2]
0.4999999999999999

julia> α = coef(linear_model)[1]
0.6167912017573035

julia> r_value = r2(linear_model)
1.0

julia> pvalues = coeftable(linear_model).cols[4]
2-element Array{Float64,1}:
 0.0
 0.0

julia> stderror(linear_model)
2-element Array{Float64,1}:
 7.803081577574428e-18
 7.787667394841443e-18

Обратите внимание, что я использовал API @formula для запуска регрессии, которая требует помещения ваших данных в DataFrame и, на мой взгляд, является предпочтительным способ оценки линейной модели в GLM, поскольку он обеспечивает большую гибкость при определении модели. В качестве альтернативы вы могли бы вызвать lm(X, y) непосредственно в массиве для вашей переменной X и переменной y:

julia> lm([ones(length(mkt_rtn_arr)) mkt_rtn_arr], stock_rtn_arr)
LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}}:

Coefficients:
─────────────────────────────────────────────────────────────────────
    Estimate   Std. Error     t value  Pr(>|t|)  Lower 95%  Upper 95%
─────────────────────────────────────────────────────────────────────
x1  0.616791  7.80308e-18  7.90446e16    <1e-99   0.616791   0.616791
x2  0.5       7.78767e-18  6.42041e16    <1e-99   0.5        0.5
─────────────────────────────────────────────────────────────────────

Обратите внимание, что здесь я добавил столбец единиц к массиву рыночной доходности в оцените модель с помощью точки пересечения, которую макрос @formula сделает автоматически (аналогично тому, как это делается в R).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...