金融计算②

3、欧式看涨双障碍期权在标的资产上升达到上障碍K1时触发回购,收益为K1-K,下降达到下障碍K0时敲出,收益为0,试分别写出此期权定价的概率模型和偏微分方程模型,并分别用蒙卡方法和差分方法(显式或隐式)实现定价。参数如下:Ko=20,K1=40,So=30,K=30,r=0.1,theta=0.3,T=1.0,Nt=1000,蒙卡可能需要的参数Npath=20000,差分法需要的参数Nx=40

(a)期权定价的概率模型期权定价的概率模型主要有两种:风险中性概率模型和实际概率模型。这里是指实际概率模型。
实际概率模型(Real-World Probability Model):
实际概率模型是基于市场实际观察到的概率分布进行期权定价的模型。它考虑市场中存在的风险和不确定性,并使用市场观测数据来估计未来的价格变动。实际概率模型通常使用基于历史数据或市场实际观测数据的模型,如蒙特卡洛模拟、历史模拟等。这些模型可以更好地反映市场实际情况,但定价结果可能会受到数据选择和模型假设的影响。
 

期权定价的概率模型中,我使用蒙特卡洛方法来模拟标的资产价格的路径,并基于这些路径计算期权的价值。

% 参数设置
K0 = 20;  % 下障碍价格
K1 = 40;  % 上障碍价格
So = 30;  % 标的资产初始价格
K = 30;  % 期权行权价格
r = 0.1;  % 无风险利率
theta = 0.3;  % 标的资产的波动率
T = 1.0;  % 期权到期时间(以年为单位)
Nt = 1000;  % 时间网格划分数
Npath = 20000;  % 蒙特卡洛模拟的路径数

% 模拟标的资产价格路径
delta_t = T / Nt;
payoff = zeros(Npath, 1);
for i = 1:Npath
    St = So;
    for j = 1:Nt
        Z = randn;
        St = St * exp((r - 0.5 * theta^2) * delta_t + theta * sqrt(delta_t) * Z);
        if St >= K1
            payoff(i) = K1 - K;
            break;
        elseif St <= K0
            payoff(i) = 0;
            break;
        end
    end
    if payoff(i) == 0
        payoff(i) = max(St - K, 0);
    end
end

% 计算期权定价
option_price = mean(payoff) * exp(-r * T);

disp(['期权定价: ' num2str(option_price)]);

结果:

 

解释:在概率模型中,首先定义标的资产价格路径的离散化时间步长;对于每个路径,从初始价格So开始模拟标的资产价格的随机波动:对于每个时间步长i(从1到Nt),计算标的资产价格St(i),同时对于每个时间步长i,检查St(i)是否达到上障碍K1或下障碍K0,如果是,则相应地调整收益。
接着对于每个路径,计算期权的收益;
   - 如果标的资产价格在触发回购之前达到上障碍K1,则收益为K1 - K。
   - 如果标的资产价格在触发回购之前达到下障碍K0,则收益为0。
   - 否则,收益为max(St(Nt) - K, 0)。
最终对所有路径的收益取平均值,并乘以折现因子exp(-r*T)以得到期权的定价。

(b)在偏微分方程模型中,我可以使用差分方法来离散化偏微分方程,并通过迭代求解差分方程来计算期权的价值。

金融计算②_第1张图片

一开始代码的运行结果是0,并不正常。然后发现问题主要在于处理上下障碍和内存循环的顺序。

% 参数
K0 = 20;
K1 = 40;
So = 30;
K = 30;
r = 0.1;
sigma = 0.3;
T = 1.0;
Nt = 1000;
Nx = 40;

% 离散化参数
dt = T / Nt;
dS = (K1 - K0) / Nx;

% 初始化网格
V = zeros(Nt+1, Nx+1);
S = linspace(K0, K1, Nx+1)';
V(Nt+1, :) = max(K1 - S, 0);

% 显式差分法计算
for j = Nt:-1:1
    for i = 2:Nx
        alpha = 0.5 * sigma^2 * S(i)^2 * dt / (dS^2);
        beta = r * S(i) * dt / (2 * dS);
        gamma = r * dt;
        
        V(j, i) = alpha * V(j+1, i+1) + (1 - 2 * alpha - gamma) * V(j+1, i) + alpha * V(j+1, i-1) - beta * V(j+1, i);
    end
    
    % 处理上障碍
    V(j, Nx+1) = K1 - K;
    
    % 处理下障碍
    V(j, 1) = 0;
end

% 输出结果
option_price = interp1(S, V(1,:), So);
fprintf('期权价格:%.4f\n', option_price);

结果:

 以后再研究是否真的正确。

4、已知欧式看跌期权的B-S方程,引入坐标变换:x=InS,详细推导新坐标下关于v(x,t)的微分方程,给出新方程的显示差分格式,说明在什么情况下此差分格式等价于二叉树方法,编写Matlab程序实现差分格式(需对求解区域进行适当截断,并给出人工边界条件)。参数如下:K=10,SM=40,r=0.1,σ=0.3,T=0.2,Nx=160,时间剖分步长的选取要判断是否保证格式的稳定性。

% 参数设置
K = 10;    % 行权价格
SM = 40;   % 标的资产的最高价格
r = 0.1;   % 无风险利率
sigma = 0.3;   % 标的资产的波动率
T = 0.2;   % 期权到期时间(以年为单位)
Nx = 160;  % 价格网格划分数

% 离散化步长
delta_x = log(SM) / Nx;
delta_t = 0.9 / (sigma^2 * Nx^2);  % 时间步长

% 创建网格
M = Nx + 1;
x = linspace(0, log(SM), M);
t = 0:delta_t:T;
v = zeros(M, length(t));

% 设置初始条件
v(:, end) = max(K - exp(x), 0);

% 使用显式差分方法迭代计算网格中的每个点的值
for j = length(t)-1:-1:1
    for i = 2:M-1
        alpha = 0.5 * delta_t * (sigma^2 * i^2 - (r - 0.5 * sigma^2) * i);
        beta = 1 - delta_t * (sigma^2 * i^2 + r);
        gamma = 0.5 * delta_t * (sigma^2 * i^2 + (r - 0.5 * sigma^2) * i);
        
        v(i, j) = alpha * v(i+1, j+1) + beta * v(i, j+1) + gamma * v(i-1, j+1);
    end
    
    % 处理人工边界条件
    v(1, j) = 2 * v(2, j) - v(3, j);
    v(M, j) = 2 * v(M-1, j) - v(M-2, j);
end

% 计算期权定价
option_price = v(Nx/2+1, 1);

disp(['期权定价: ' num2str(option_price)]);

结果:

 即期权定价为3.5843时等价二叉树方法

5、编制程序分别利用标准蒙卡及重要性采样技术计算两资产期权的风险中性价格,期权到期的收益函数为(S1(T)-S2(T))+ 【这里的+代表取正】.两个源生资产不相关,即相关系数p=0,,其他参数为S1(0)=20,S2(0)=50,theta1=0.3,theta2=0.3,r=0.05,T=0.5

% 参数设置
S1_0 = 20;  % 第一个资产初始价格
S2_0 = 50;  % 第二个资产初始价格
theta1 = 0.3;  % 第一个资产波动率
theta2 = 0.3;  % 第二个资产波动率
r = 0.05;  % 无风险利率
T = 0.5;  % 期权到期时间(以年为单位)
N = 1e6;  % 模拟路径数

% 标准蒙特卡洛方法
Z1 = randn(N, 1);
Z2 = randn(N, 1);
S1_T = S1_0 * exp((r - 0.5 * theta1^2) * T + theta1 * sqrt(T) * Z1);
S2_T = S2_0 * exp((r - 0.5 * theta2^2) * T + theta2 * sqrt(T) * Z2);
payoff_mc = (S1_T - S2_T) + max(S1_T - S2_T, 0);  % 期权到期收益
price_mc = mean(payoff_mc) * exp(-r * T);

% 重要性采样方法
Z = randn(N, 1);
S1_T_hat = S1_0 * exp((r - 0.5 * theta1^2) * T + theta1 * sqrt(T) * Z);
S2_T_hat = S2_0 * exp((r - 0.5 * theta2^2) * T + theta2 * sqrt(T) * Z);
weight = exp(-0.5 * ((S1_T_hat - S1_T).^2 + (S2_T_hat - S2_T).^2) / (theta1^2 + theta2^2)) / sqrt(2 * pi * (theta1^2 + theta2^2));
payoff_is = (S1_T - S2_T) + max(S1_T - S2_T, 0);  % 期权到期收益
price_is = mean(payoff_is .* weight) * exp(-r * T) / mean(weight);

disp(['标准蒙特卡洛风险中性价格: ' num2str(price_mc)]);
disp(['重要性采样风险中性价格: ' num2str(price_is)]);

解释:首先设置给定参数,生成服从标准正态分布的随机数,用于模拟资产的价格变动。
对于标准蒙特卡洛方法,我使用上述随机数生成资产的价格路径,并计算期权到期的收益函数;对于重要性采样方法,同样使用上述随机数生成资产的价格路径,并计算权重,然后将权重应用于期权到期的收益函数。 最后,我计算出标准蒙特卡洛和重要性采样方法下的风险中性价格,并输出到控制台。

结果:

 第一份基本完结

你可能感兴趣的:(金融计算小学期赚钱整理,金融)