利用MATLAB实现以下功能,从外部导入10个合约数据:第一列为内在价值(标的资产价格-执行价),第二列为卖价,第三列为最新价(看作市场价),第四列为执行价,10个合约的到期时间T均为21/365。根据卖价使用Metropolis-Hastings算法对波动率进行反演,要求建议分步为高斯分布,并根据已知的标的资产价格、执行价和到期时间,将反演得到的波动率带回B-S公式,得到期权的理论价格,将理论价格与最新价和卖价进行比较,生成相关图像并计算误差
时间: 2023-06-27 07:08:12 浏览: 39
以下是MATLAB实现的代码:
```
% 导入数据
data = importdata('contracts_data.csv');
% 内在价值
IV = data(:,1);
% 卖价
Bid = data(:,2);
% 最新价
MarketPrice = data(:,3);
% 执行价
K = data(:,4);
% 到期时间
T = 21/365;
% 设定初始波动率
sigma0 = 0.2;
% 设定步长和迭代次数
step = 0.01;
iter = 10000;
% 定义高斯分布函数
gaussian = @(x,sigma) exp(-(x.^2)/(2*sigma^2))/sqrt(2*pi*sigma^2);
% 计算理论价格
BSPrice = zeros(size(Bid));
for i=1:length(Bid)
BSPrice(i) = blsprice(IV(i), K(i), 0.03, T, sigma0);
end
% 进行Metropolis-Hastings算法
sigma = zeros(iter,1);
sigma(1) = sigma0;
for i=2:iter
% 生成新的候选波动率
sigma_star = sigma(i-1) + step*randn;
% 计算接受概率
alpha = min(1, gaussian(Bid./BSPrice, sigma_star)/gaussian(Bid./BSPrice, sigma(i-1)));
% 生成随机数
u = rand;
% 判断是否接受新的波动率
if u <= alpha
sigma(i) = sigma_star;
else
sigma(i) = sigma(i-1);
end
end
% 取后半部分的波动率样本
sigma_sample = sigma(iter/2:end);
% 计算理论价格和误差
BSPrice_sample = zeros(size(Bid));
error = zeros(size(Bid));
for i=1:length(Bid)
BSPrice_sample(i) = blsprice(IV(i), K(i), 0.03, T, mean(sigma_sample));
error(i) = abs(BSPrice_sample(i)-MarketPrice(i))/MarketPrice(i);
end
% 生成图像
figure;
subplot(2,1,1);
plot(sigma_sample);
title('Simulated volatility');
xlabel('Iteration');
ylabel('Volatility');
subplot(2,1,2);
hold on;
plot(Bid);
plot(MarketPrice);
plot(BSPrice_sample);
legend('Bid','Market price','Simulated price');
title('Option price comparison');
xlabel('Contract');
ylabel('Price');
```
解释如下:
1. 导入数据,将内在价值、卖价、最新价、执行价和到期时间分别存储在变量IV、Bid、MarketPrice、K和T中。
2. 设定初始波动率sigma0,步长step和迭代次数iter。
3. 定义高斯分布函数gaussian,用于计算接受概率。
4. 计算初始波动率下的理论价格BSPrice。
5. 进行Metropolis-Hastings算法,生成波动率样本sigma。
6. 取后半部分的波动率样本sigma_sample。
7. 计算使用平均波动率下的理论价格BSPrice_sample和误差error。
8. 生成图像,包括波动率变化图和期权价格比较图。