利用MATLAB实现以下功能,从外部导入10个合约数据:第一列为内在价值,第二列为卖价,第三列为最新价(看作市场价),第四列为执行价K,10个合约的到期时间T均为21/365。首先根据内在价格=S-K得到标的资产价格S,再根据卖价使用Metropolis-Hastings算法对波动率进行反演,要求建议分步为高斯分布,并根据已知的标的资产价格、执行价和到期时间,将反演得到的波动率带回B-S公式,得到期权的理论价格,将理论价格与最新价和卖价进行比较,并输出图像
时间: 2023-08-01 22:07:48 浏览: 34
以下是MATLAB代码实现:
```matlab
% 从外部导入10个合约数据:第一列为内在价值,第二列为卖价,第三列为最新价,第四列为执行价K
data = importdata('options_data.txt');
S = data(:,1) + data(:,4); % 计算标的资产价格S
T = 21/365; % 到期时间T
N = length(data); % 合约数量
% Metropolis-Hastings算法反演波动率
sigma = zeros(N,1); % 存储反演得到的波动率
sigma_init = 0.2; % 初始波动率
proposal_std = 0.01; % 高斯分布建议分步的标准差
for i = 1:N
% 计算建议分步
proposal_sigma = abs(sigma_init + randn() * proposal_std);
% 计算接受率
S0 = S(i);
K = data(i,4);
r = 0; % 无风险利率为0
q = 0; % 红利率为0
option_price_old = blsprice(S0, K, r, T, sigma_init, q);
option_price_new = blsprice(S0, K, r, T, proposal_sigma, q);
accept_prob = min(1, option_price_new / option_price_old);
% 决定是否接受建议分步
if rand() < accept_prob
sigma_init = proposal_sigma;
end
% 存储反演得到的波动率
sigma(i) = sigma_init;
end
% 计算期权的理论价格
option_price_bs = blsprice(S, data(:,4), r, T, sigma, q);
% 输出图像
figure
plot(1:N, data(:,2), 'ro-') % 卖价
hold on
plot(1:N, data(:,3), 'bo-') % 最新价
plot(1:N, option_price_bs, 'g*-') % 理论价格
legend('卖价', '最新价', '理论价格')
xlabel('合约编号')
ylabel('价格')
title('期权价格比较')
```
需要注意的是,上述代码中使用了MATLAB自带的blsprice函数计算期权的理论价格。如果没有该函数,可以自己编写Black-Scholes公式的计算函数。