微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 PYTHON、R 或 Stata 中从 DCC Garch 开发 DECO-Garch 模型Equicorrelation

如何解决在 PYTHON、R 或 Stata 中从 DCC Garch 开发 DECO-Garch 模型Equicorrelation

我正在研究有条件多元化收益(CDB - Christoffersen 等人,2014 年),为此我需要开发 DECO GARCH 模型。不幸的是,由于我缺乏代数,我发现很难从 DCC GARCH 模型的条件相关矩阵中计算出等相关矩阵。

总结: 我有 R 矩阵(动态条件相关矩阵) 从这个矩阵我需要计算动态等相关矩阵 DECO(检查方法

有人可以帮我吗?不介意语言,可以是 Python、R 或 Stata。 我将在 python 中发布代码,但欢迎在 R 中提供示例或解释。提前谢谢你,我真的很挣扎。回复https://stats.stackexchange.com/questions/328510/how-to-compute-conditional-correlation-matrix-by-using-standardized-residuals-an

Methodology

import pandas as pd
import numpy as np
import statsmodels.api as sm
import plotly.express as px
import plotly.figure_factory as ff
from arch import arch_model

from ipywidgets import HBox,VBox,Dropdown,Output
from scipy.optimize import fmin,minimize
from scipy.stats import t
from scipy.stats import norm
from math import inf
from IPython.display import display

import bs4 as bs
import requests
import yfinance as yf
import datetime

def vecl(matrix):
    lower_matrix = np.tril(matrix,k=-1)
    array_with_zero=np.matrix(lower_matrix).A1

    array_without_zero = array_with_zero[array_with_zero!=0]

    return array_without_zero

def garch_t_to_u(rets,res):
    mu = res.params['mu']
    nu = res.params['nu']
    est_r = rets - mu
    h = res.conditional_volatility
    std_res = est_r / np.sqrt(h)
    udata = t.cdf(std_res,nu)
    return udata

def loglike_norm_dcc_copula(theta,udata):
    N,T = np.shape(udata)
    llf = np.zeros((T,1))
    trdata = np.array(norm.ppf(udata).T,ndmin=2)
    
    
    Rt,veclRt =  dcceq(theta,trdata)

    for i in range(0,T):
        llf[i] = -0.5* np.log(np.linalg.det(Rt[:,:,i]))
        llf[i] = llf[i] - 0.5 *  np.matmul(np.matmul(trdata[i,:],(np.linalg.inv(Rt[:,i]) - np.eye(N))),trdata[i,:].T)
    llf = np.sum(llf)

    return -llf

def dcceq(theta,trdata):
    T,N = np.shape(trdata)

    a,b = theta
    
    if min(a,b)<0 or max(a,b)>1 or a+b > .999999:
        a = .9999 - b
        
    Qt = np.zeros((N,N,T))

    Qt[:,0] = np.cov(trdata.T)

    Rt =  np.zeros((N,T))
    veclRt =  np.zeros((T,int(N*(N-1)/2)))
    
    Rt[:,0] = np.corrcoef(trdata.T)
    
    for j in range(1,T):
        Qt[:,j] = Qt[:,0] * (1-a-b)
        Qt[:,j] + a * np.matmul(trdata[[j-1]].T,trdata[[j-1]])
        Qt[:,j] + b * Qt[:,j-1]
        Rt[:,j] = np.divide(Qt[:,j],np.matmul(np.sqrt(np.array(np.diag(Qt[:,j]),ndmin=2)).T,np.sqrt(np.array(np.diag(Qt[:,ndmin=2))))
    
    for j in range(0,T):
        veclRt[j,:] = vecl(Rt[:,j].T)
    return Rt,veclRt

model_parameters = {}
udata_list = []

def run_garch_on_return(rets,udata_list,model_parameters):
    for x in rets:
        am = arch_model(rets[x],dist = 't',rescale=False)
        short_name = x
        model_parameters[short_name] = am.fit(disp='off')
        udata = garch_t_to_u(rets[x],model_parameters[short_name])
        udata_list.append(udata)
    return udata_list,model_parameters


#Import returns 

ret = pd.read_excel('URL',index_col=0,engine='openpyxl')

#Scale returns

returns = ret*100

#Obtain Parameters

udata_list,model_parameters = run_garch_on_return(returns,model_parameters)

#set up dcc model
cons = ({'type': 'ineq','fun': lambda x:  -x[0]  -x[1] +1})
bnds = ((0,0.5),(0,0.9997))

#Minimize log likelihood
%time opt_out = minimize(loglike_norm_dcc_copula,np.array([0.01,0.95]),args = (udata_list,),bounds=bnds,constraints=cons)
print(opt_out.success)
print(opt_out.x)

llf  = loglike_norm_dcc_copula(opt_out.x,udata_list)

#obtain Rt
trdata = np.array(norm.ppf(udata_list).T,ndmin=2)
Rt,veclRt = dcceq(opt_out.x,trdata)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。