期權

Duan (1995) 使用 MATLAB 的 GARCH 期權定價模型

  • September 20, 2019

這是複制段在他的論文“GARCH 期權定價模型”中提出的期權定價模型的 MATLAB 程式碼。但是,文件中估計的參數與論文中提供的參數不匹配。我試圖修復它,但我仍然得到錯誤的參數值。

這是最大概似估計的 .m 文件:

function y = findGARCH_LLy(params,S,rf)

% Finds log-likelihood for the GARCH option pricing model.
alpha0 = params(1);
alpha1 = params(2);
beta1  = params(3);
lambda = params(4);

N = length(S);

% Define the returns.
r = log(S(2:N)./S(1:N-1));
r = [0; r];

% Initialize the GARCH log-likelihood at t=1.
h(1) = var(r);
e(1) = 0;
LL(1) = -0.5*log(2*pi)-0.5*log(h(1))-0.5*e(1)^2/h(1);

% Find the rest of the GARCH log-likelihood.
for t=2:N
   h(t) = alpha0 + alpha1*(e(t-1) - lambda*sqrt(h(t-1)))^2 + beta1*h(t-1);
   e(t) = log(S(t)/S(t-1)) - rf + 0.5*h(t);
   LL(t) = 0.5*log(2*pi)-0.5*log(h(t))-0.5*e(t)^2/h(t);
end

% Return the negative log-likelihood.
y = -sum(LL);

這是主要的 .m 文件:

clc; clear;

% Input the price levels and dates.
[P, Dates] = xlsread('SP 100 Prices.xls','Sheet1');
Prices = P(:,2);

% Risk free rate
rf = 0;

% Starting values for optimization.
% Use estimates from Duan's paper as starting values.
start  = [0.000015 0.19 0.72 0.007];
A = [0 1 1 0];
b = 1;
lb = [0 0 0 0];
ub = [+Inf +Inf +Inf +Inf];
params = fmincon(@(b) findGARCH_LLy(b,Prices,rf), start, A, b, [], [], lb, ub)
alpha0 = params(1);
alpha1 = params(2);
beta1  = params(3);
lambda = params(4);

% Find the standard deviation (sigma) implied by the parameters.
% Assume 365 days per year.
variance = alpha0 / (1 - alpha1*(1+lambda^2) - beta1);
sigma = sqrt(variance)*sqrt(365);

為了資訊的完整性,論文中的估計參數值為 $ \alpha_0=1.524\times 10^{-5} $ , $ \alpha_1=0.1883 $ , $ \beta_1=0.7162 $ 和 $ \lambda=7.452\times 10^{-3} $ , 和標準差 $ \sigma=24.13% $ . 此外,該模型適用於 1986 年 1 月 2 日至 1989 年 12 月 15 日的標準普爾 100 每日指數。

有人可以幫我找出我的錯誤所在嗎?非常感謝您的幫助。

你的函式返回(減去)對數概似對我來說似乎很奇怪,我會去

function y = findGARCH_LLy(params,S,rf)

% Finds log-likelihood for the GARCH option pricing model.
alpha0 = params(1);
alpha1 = params(2);
beta1  = params(3);
lambda = params(4);

N = length(S);

% Define the returns (pad first return with zero)
r = [0, diff(log(S))];

% Infer the other conditional instantaneous variances [see EQ1]
h(1) = var(r);  % Initialize the conditional variance recursion
for i=2:N
  h(i) = alpha0 + alpha1*(r(i-1) - rf + .5*h(i-1) - lambda*sqrt(h(i-1)))^2 + beta1*h(i-1)];
end

% Return the negative log-likelihood (up to constant terms) [see EQ2]
LL = log(h) + 1./h .* (r - rf + .5*h).^2;
y = -sum(LL);

話雖如此,如果一切正常但您的輸入價格錯誤,您將永遠無法獲得正確的參數,因此請從檢查此開始。

REM:我沒有嘗試執行它,所以我可能留下了一些錯別字,但你應該明白這一點。


編輯

我確實犯了一些錯別字(現在希望已更正),但我假設您正在使用物理測量下的以下動態 $$ \begin{align} \ln{\left(\frac{S_{t+1}}{S_t}\right)} = R_{t+1} &= r_F - \frac{1}{2}h_{t+1} + \sqrt{h_{t+1}}z_{t+1} \ h_{t+1} &= \alpha_0 + \alpha_1 (\sqrt{h_t} z_t - \sqrt{h_t} \lambda)^2 + \beta_1 h_t \end{align} $$

和 $ \mathbf{z}=(z_1,\dots,z_N) $ iid 高斯變數。

所以第一步是從數據序列中恢復隱藏的條件變異數。這是通過將上面的第一個等式插入到第二個等式中來完成的,從而產生以下遞歸: $$ h_{t+1} = \alpha_0 + \alpha_1 \left(R_t - r_f + \frac{1}{2}h_{t} - \sqrt{h_t} \lambda \right)^2 + \beta_1 h_t \tag{EQ1} $$ 從…開始 $ h_1 = \text{var}(\mathbf{r}) $ 和 $ \mathbf{r}=(r_1,\dots,r_N) $ 您的範例日誌返回。

從那裡開始,你就有了,有條件地 $ h_t $ $$ R_t \sim \mathcal{N}(r_F - \frac{1}{2}h_{t}, h_t) $$ 假設你有一個 iid 樣本 $ N $ 返回你然後形成對數概似為

$$ \begin{align} p_{R_1,R_2,…,R_N}(r_1,r_2,…,r_N; \Theta) &= \prod_{i=1}^N p_{R_i|\phi_{i-1}}(r_i; \Theta) \ &= \prod_{i=1}^N \frac{1}{\sqrt{2\pi h_i}} \exp \left( -\frac{1}{2h_i}(r_i - (r_F-\frac{1}{2}h_i))^2\right) \ &:= \mathcal{L}(\Theta) \end{align} $$

因此最後是負對數概似 $$ \begin{align} l(\Theta) &:= -\ln(\mathcal{L}(\Theta)) \nonumber\ &\propto \sum_{i=1}^N \ln(h_i) + \frac{1}{h_i} (r_i - r_F +\frac{1}{2}h_i))^2 \tag{EQ2} \end{align} $$

在哪裡, $ \mathbf{r}=(r_1,\dots,r_N) $ 是觀察到的對數回報和瞬時變異數 $ \mathbf{h}=(h_1,\dots,h_N) $ 如上所述獲得。

現在,請參見上述程式碼中的等式 (EQ1) 和 (EQ2)。

引用自:https://quant.stackexchange.com/questions/48709