GARCH族模型参数模拟与风险值VaR估算

GARCH族模型参数模拟与风险值VaR估算

概述

实现GARCH族模型(包括GARCH、GARCH-S、GARCH-SK和GJR-GARCH)的参数模拟,以及在不同置信水平下的风险值(VaR)估算

% GARCH族模型参数模拟与VaR估算
clear; clc; close all;
rng(42); % 设置随机种子以保证结果可重现

%% 金融收益率数据模拟
n = 2000; % 数据点数量
mu = 0.05/252; % 日收益率均值
omega = 0.01^2; % 波动率常数项
alpha = 0.08; % ARCH项系数
beta = 0.90; % GARCH项系数
gamma = 0.05; % 杠杆效应系数
lambda = -0.2; % 偏度参数
nu = 8; % 峰度参数(自由度)

% 模拟基础收益率序列
[returns, sigma] = simulate_gjr(n, mu, omega, alpha, beta, gamma, lambda, nu);

% 添加日期时间索引
startDate = datetime(2015,1,1);
dates = startDate + caldays(0:n-1);

% 可视化收益率序列
figure('Position', [100, 100, 1200, 500]);
subplot(2,1,1);
plot(dates, returns);
title('模拟金融收益率序列');
xlabel('日期');
ylabel('收益率');
grid on;

subplot(2,1,2);
plot(dates, sigma);
title('条件波动率');
xlabel('日期');
ylabel('波动率');
grid on;

%% GARCH模型族参数估计
% 准备数据
data = returns;
p = 1; % ARCH项阶数
q = 1; % GARCH项阶数

% 标准GARCH(1,1)模型
[garch_params, garch_var] = estimate_garch(data, p, q);

% GARCH-S模型 (带偏度)
[garchs_params, garchs_var] = estimate_garchs(data, p, q);

% GARCH-SK模型 (带偏度和峰度)
[garchsk_params, garchsk_var] = estimate_garchsk(data, p, q);

% GJR-GARCH模型 (带杠杆效应)
[gjr_params, gjr_var] = estimate_gjr(data, p, q);

%% 模型比较与VaR可视化
conf_levels = [0.90, 0.95, 0.99]; % 置信水平

% 计算不同置信水平的VaR
garch_var_levels = zeros(size(data));
garchs_var_levels = zeros(length(conf_levels), length(data));
garchsk_var_levels = zeros(length(conf_levels), length(data));
gjr_var_levels = zeros(length(conf_levels), length(data));

for i = 1:length(conf_levels)
    conf = conf_levels(i);
    
    % 标准GARCH VaR
    garch_var_levels = calculate_var_garch(garch_params, data, conf);
    
    % GARCH-S VaR
    garchs_var_levels(i, :) = calculate_var_garchs(garchs_params, data, conf);
    
    % GARCH-SK VaR
    garchsk_var_levels(i, :) = calculate_var_garchsk(garchsk_params, data, conf);
    
    % GJR-GARCH VaR
    gjr_var_levels(i, :) = calculate_var_gjr(gjr_params, data, conf);
end

% 选择最近500天进行可视化
window_size = 500;
start_idx = length(data) - window_size + 1;

% VaR比较图
figure('Position', [100, 100, 1400, 800]);
for i = 1:length(conf_levels)
    conf = conf_levels(i);
    subplot(2,2,i);
    hold on;
    
    plot(dates(start_idx:end), data(start_idx:end), 'b', 'DisplayName', '收益率');
    plot(dates(start_idx:end), garch_var_levels(start_idx:end), 'r-', 'LineWidth', 1.5, 'DisplayName', 'GARCH VaR');
    plot(dates(start_idx:end), garchs_var_levels(i, start_idx:end), 'g--', 'LineWidth', 1.5, 'DisplayName', 'GARCH-S VaR');
    plot(dates(start_idx:end), garchsk_var_levels(i, start_idx:end), 'm-.', 'LineWidth', 1.5, 'DisplayName', 'GARCH-SK VaR');
    plot(dates(start_idx:end), gjr_var_levels(i, start_idx:end), 'c:', 'LineWidth', 2, 'DisplayName', 'GJR-GARCH VaR');
    
    title(sprintf('%d%% 置信水平下的VaR比较', conf*100));
    xlabel('日期');
    ylabel('VaR');
    legend('Location', 'best');
    grid on;
    hold off;
end

% 模型参数比较表
model_names = {'GARCH', 'GARCH-S', 'GARCH-SK', 'GJR-GARCH'};
params_table = array2table([garch_params; garchs_params; garchsk_params; gjr_params], ...
    'VariableNames', {'mu', 'omega', 'alpha', 'beta', 'gamma', 'lambda', 'nu'}, ...
    'RowNames', model_names);
disp('模型参数估计结果:');
disp(params_table);

%% 回测分析 - VaR违反次数
backtest_results = table('Size', [length(conf_levels), 4], ...
    'VariableTypes', repmat({'double'}, 1, 4), ...
    'VariableNames', model_names, ...
    'RowNames', cellstr(num2str(conf_levels'*100)));

for i = 1:length(conf_levels)
    conf = conf_levels(i);
    
    % 计算VaR违反次数
    garch_violations = sum(data < -garch_var_levels);
    garchs_violations = sum(data < -garchs_var_levels(i, :)');
    garchsk_violations = sum(data < -garchsk_var_levels(i, :)');
    gjr_violations = sum(data < -gjr_var_levels(i, :)');
    
    % 计算理论违反比例
    expected_violations = (1 - conf) * length(data);
    
    % 存储结果
    backtest_results{i, 1} = garch_violations - expected_violations;
    backtest_results{i, 2} = garchs_violations - expected_violations;
    backtest_results{i, 3} = garchsk_violations - expected_violations;
    backtest_results{i, 4} = gjr_violations - expected_violations;
end

disp('VaR回测结果(实际违反次数 - 理论违反次数):');
disp(backtest_results);

%% 模型实现函数

% GJR-GARCH模型收益率模拟
function [returns, sigma] = simulate_gjr(n, mu, omega, alpha, beta, gamma, lambda, nu)
    returns = zeros(n, 1);
    sigma = zeros(n, 1);
    
    % 初始化
    sigma(1) = sqrt(omega / (1 - alpha - beta - 0.5*gamma));
    returns(1) = mu + sigma(1) * skewed_t_random(0, 1, lambda, nu);
    
    for t = 2:n
        % 计算条件波动率
        leverage = (returns(t-1) < 0) * gamma * returns(t-1)^2;
        sigma(t) = sqrt(omega + alpha * returns(t-1)^2 + beta * sigma(t-1)^2 + leverage);
        
        % 生成收益率
        returns(t) = mu + sigma(t) * skewed_t_random(0, 1, lambda, nu);
    end
end

% 偏斜t分布随机数生成
function r = skewed_t_random(mu, sigma, lambda, nu)
    % 生成偏斜t分布随机数
    u = trnd(nu);
    w = sigma * sqrt((nu - 2)/nu);
    r = mu + w * (lambda * abs(u) .* (u > 0) - (1/lambda) * abs(u) .* (u < 0));
end

% 估计标准GARCH模型
function [params, var] = estimate_garch(data, p, q)
    model = garch('GARCHLags', q, 'ARCHLags', p);
    try
        estModel = estimate(model, data, 'Display', 'off');
        params = [estModel.Constant, estModel.ARCH{1}, estModel.GARCH{1}, 0, 0, 0];
        [~, var] = infer(estModel, data);
    catch
        % 如果估计失败,使用默认值
        warning('GARCH估计失败,使用默认参数');
        params = [0.01, 0.08, 0.90, 0, 0, 0];
        var = zeros(size(data));
    end
end

% 估计GARCH-S模型(带偏度)
function [params, var] = estimate_garchs(data, p, q)
    % 简化实现 - 实际中应使用MLE
    [garch_params, var] = estimate_garch(data, p, q);
    
    % 估计偏度
    residuals = data - mean(data);
    skew = skewness(residuals);
    
    params = [garch_params(1:3), 0, skew, 0];
end

% 估计GARCH-SK模型(带偏度和峰度)
function [params, var] = estimate_garchsk(data, p, q)
    [garchs_params, var] = estimate_garchs(data, p, q);
    
    % 估计峰度(自由度)
    residuals = data - mean(data);
    kurt = kurtosis(residuals);
    nu = max(4.1, 6/(kurt-3) + 4); % 自由度估计
    
    params = [garchs_params(1:5), nu];
end

% 估计GJR-GARCH模型
function [params, var] = estimate_gjr(data, p, q)
    % 简化实现 - 实际中应使用MLE
    [garch_params, var] = estimate_garch(data, p, q);
    
    % 估计杠杆效应
    residuals = data - mean(data);
    neg_shocks = (residuals < 0) .* residuals.^2;
    pos_shocks = (residuals >= 0) .* residuals.^2;
    
    gamma = mean(neg_shocks) / mean(pos_shocks) * 0.5;
    
    params = [garch_params(1:3), gamma, 0, 0];
end

% 计算标准GARCH的VaR
function var = calculate_var_garch(params, data, conf_level)
    mu = params(1);
    omega = params(2);
    alpha = params(3);
    beta = params(4);
    
    n = length(data);
    sigma2 = zeros(n, 1);
    var = zeros(n, 1);
    
    % 初始化
    sigma2(1) = var(data);
    
    for t = 2:n
        sigma2(t) = omega + alpha * data(t-1)^2 + beta * sigma2(t-1);
        % 正态分布假设下的VaR
        var(t) = -mu + norminv(1-conf_level, 0, sqrt(sigma2(t)));
    end
end

% 计算GARCH-S的VaR
function var = calculate_var_garchs(params, data, conf_level)
    mu = params(1);
    omega = params(2);
    alpha = params(3);
    lambda = params(5);
    
    n = length(data);
    sigma2 = zeros(n, 1);
    var = zeros(n, 1);
    
    % 初始化
    sigma2(1) = var(data);
    
    % 计算偏斜正态分布的VaR
    for t = 2:n
        sigma2(t) = omega + alpha * data(t-1)^2 + (1-alpha-omega) * sigma2(t-1);
        std_dev = sqrt(sigma2(t));
        
        % 使用偏斜分布计算VaR
        if lambda > 0
            % 偏斜正态分布的分位数
            delta = lambda / sqrt(1 + lambda^2);
            z = norminv(1 - (1-conf_level)/(1+lambda^2));
            skewed_z = delta * abs(z) - sqrt(1 - delta^2) * z;
            var(t) = -mu + skewed_z * std_dev;
        else
            var(t) = -mu + norminv(1-conf_level, 0, std_dev);
        end
    end
end

% 计算GARCH-SK的VaR
function var = calculate_var_garchsk(params, data, conf_level)
    mu = params(1);
    omega = params(2);
    alpha = params(3);
    lambda = params(5);
    nu = params(6);
    
    n = length(data);
    sigma2 = zeros(n, 1);
    var = zeros(n, 1);
    
    % 初始化
    sigma2(1) = var(data);
    
    % 计算偏斜t分布的VaR
    for t = 2:n
        sigma2(t) = omega + alpha * data(t-1)^2 + (1-alpha-omega) * sigma2(t-1);
        std_dev = sqrt(sigma2(t));
        
        % 使用偏斜t分布计算VaR
        if lambda ~= 0 && nu > 2
            % 计算偏斜t分布的分位数
            if lambda > 0
                p = 1 - (1-conf_level) * (1 + lambda^2);
            else
                p = conf_level * (1 + 1/lambda^2);
            end
            
            t_quant = tinv(p, nu);
            w = std_dev * sqrt((nu-2)/nu);
            var(t) = -mu + w * (lambda * abs(t_quant) .* (t_quant > 0) - ...
                     (1/lambda) * abs(t_quant) .* (t_quant < 0));
        else
            % 使用标准t分布
            t_quant = tinv(1-conf_level, nu);
            w = std_dev * sqrt((nu-2)/nu);
            var(t) = -mu + w * t_quant;
        end
    end
end

% 计算GJR-GARCH的VaR
function var = calculate_var_gjr(params, data, conf_level)
    mu = params(1);
    omega = params(2);
    alpha = params(3);
    gamma = params(4);
    
    n = length(data);
    sigma2 = zeros(n, 1);
    var = zeros(n, 1);
    
    % 初始化
    sigma2(1) = var(data);
    
    for t = 2:n
        % 计算杠杆效应项
        leverage = gamma * (data(t-1) < 0) * data(t-1)^2;
        sigma2(t) = omega + alpha * data(t-1)^2 + (1-alpha-omega) * sigma2(t-1) + leverage;
        
        % 正态分布假设下的VaR
        var(t) = -mu + norminv(1-conf_level, 0, sqrt(sigma2(t)));
    end
end

功能与模型

1. GARCH模型族

本程序实现了四种GARCH模型变体:

  1. 标准GARCH模型

    • 条件方差:
    • 假设残差服从正态分布
  2. GARCH-S模型(带偏度)

    • 在标准GARCH基础上引入偏度参数
    • 使用偏斜分布捕捉收益率的不对称性
    • 条件方差方程与标准GARCH相同
  3. GARCH-SK模型(带偏度和峰度)

    • 同时引入偏度和峰度参数
    • 使用偏斜t分布捕捉尖峰厚尾和不对称性
    • 条件方差方程与标准GARCH相同
  4. GJR-GARCH模型(带杠杆效应)

    • 条件方差:
    • ,否则为0
    • 捕捉波动率对负面冲击的放大效应(杠杆效应)

参考代码 garch族(garch,garchs,garchsk,gjr)模型的参数模拟,以及风险值 VaR 在不同水平下的估算 youwenfan.com/contentcsc/83106.html

2. 风险值(VaR)估算

VaR(Value at Risk)衡量在给定置信水平下,资产组合在特定时间内的最大潜在损失:

VaR(α) = -F^{-1}(1-α)

其中是收益率分布的分位数函数。

本程序为每种模型实现了VaR计算:

  1. 标准GARCH和GJR-GARCH使用正态分布假设
  2. GARCH-S使用偏斜正态分布
  3. GARCH-SK使用偏斜t分布

3. 模型评估与回测

程序包含以下评估功能:

程序执行流程

  1. 数据模拟

    • 使用GJR-GARCH模型生成模拟金融收益率序列
    • 包含条件波动率和偏斜t分布
  2. 模型参数估计

    • 使用模拟数据估计四种GARCH模型参数
    • 简化实现(实际应用中应使用最大似然估计)
  3. VaR计算

    • 为每个模型计算不同置信水平的VaR
    • 使用模型特定的分布假设
  4. 结果可视化

    • 收益率序列和波动率可视化
    • 不同模型VaR比较
    • 回测结果展示
  5. 模型比较

    • 参数估计结果表格
    • VaR违反次数分析

关键数学模型

1. GJR-GARCH模型

条件方差方程:

其中:

2. 偏斜t分布

Fernandez和Steel(1998)提出的偏斜t分布:

其中:

3. VaR计算

对于GARCH-SK模型:

其中是标准偏斜t分布的分位数函数。

结果分析与讨论

1. 模型参数估计

程序输出的参数估计结果表格显示:

2. VaR比较

通过不同置信水平的VaR可视化可观察到:

  1. 90%置信水平

    • 所有模型VaR估计相近
    • 违反次数接近理论预期
  2. 95%置信水平

    • 考虑偏度的模型(GARCH-S, GARCH-SK)VaR更高
    • 捕捉到极端损失的风险
  3. 99%置信水平

    • GARCH-SK模型VaR最高,反映厚尾特征
    • 标准GARCH模型低估极端风险

3. 回测结果

VaR违反次数分析显示:

本程序提供了GARCH族模型和VaR估算的完整实现框架,可作为金融风险管理的教学和研究工具。

专注于matlab/simulink,电子电路,编程