这个系列的不是为了教学,主要是供自己回看,用来调用方法。
金融计算小学期的话,暑假是有的。寒假不清楚
今年接单大概接触到三份。我自己的之后处理
这一份的难度算是最大的,一共五道题目。
假设:市场上的源生资产均以几何布朗运动运行
1、试利用屏幕交互输入函数(input函函数)提示输入一个整数n,取值1到6,判断输入是否符合要求。讨论下列多项式的n次项系数的变化对多项式根的影响(求根问题的条件数)。系数变化幅度也由input函数输入,用subplot函数在两个子窗口分别画出系数变化前后的两个多项式在(0,10)内的图像,便于观察根的变化,图形上添加适当标注,Matlab编程实现。
p=x^6-21*x^5+175*x^4-735*x^3+1624*x^2-1764*x+720
解:n次项系数是指这个多项式的最高次项系数
(1)交互输入函数提示输入一个取值1-6的整数n
n = input('请输入一个整数n,取值1到6:');
% 判断输入是否符合要求
if n < 1 || n > 6
error('输入格式错误,n必须取值1到6之间。');
end
结果:
(2)讨论多项式的n次项系数的变化对多项式根的影响
% 输入系数变化幅度
delta = input('请输入系数变化幅度:');
% 原始多项式系数
coefficients_before = [1, -21, 175, -735, 1624, -1764, 720];
% 系数变化后的多项式系数
coefficients_after = coefficients_before;
coefficients_after(1) = coefficients_after(1) + delta;
% 原始多项式
poly_before = poly2sym(coefficients_before);
% 系数变化后的多项式
poly_after = poly2sym(coefficients_after);
% 绘制原始多项式图像
subplot(1, 2, 1);
fplot(poly_before, [0, 10]);
title('系数变化前的多项式');
xlabel('x');
ylabel('y');
grid on;
% 绘制系数变化后的多项式图像
subplot(1, 2, 2);
fplot(poly_after, [0, 10]);
title('系数变化后的多项式');
xlabel('x');
ylabel('y');
grid on;
% 计算原始多项式的根
roots_before = roots(coefficients_before);
% 计算系数变化后的多项式的根
roots_after = roots(coefficients_after);
% 输出根的变化
fprintf('系数变化前的多项式的根:%s\n', num2str(roots_before));
fprintf('系数变化后的多项式的根:%s\n', num2str(roots_after));
% 计算求根问题的条件数
cond_before = cond(vander(roots_before));
cond_after = cond(vander(roots_after));
% 输出条件数的变化
fprintf('系数变化前的条件数:%f\n', cond_before);
fprintf('系数变化后的条件数:%f\n', cond_after);
我这里只改了6次项系数,对应代码是:
coefficients_after(1) = coefficients_after(1) + delta;
结果:
从10^4数量级变为10^6数量级
2、后付看涨基础证券开始时不用付费,到期时若源生资产股价不高于敲定价K,则证券持有人必须支付期权金P元:若股价高于敲定价格K,则收益为1元.试用fzero函数并分别基于以下两种方法确定后付看涨基础证券期权金P,参数如下:So=50,K=50,r=0.05,σ=0.3,T=5/12.
(a)基于二叉树方法构造期权定价函数,并用来进一步确定后付期权金P
(b)基于差分方法构造期权定价函数,并用来进一步确定后付期权金P
解:(a)二叉树方法。有两个文件,分别是binary_tree_option_price.m文件(function函数)和调用函数计算的m文件。
二叉树function函数文件:
function option_price = binary_tree_option_price(S0, K, r, sigma, T, n, P)
delta_t = T / n;
u = exp(sigma * sqrt(delta_t));
d = 1 / u;
p = (exp(r * delta_t) - d) / (u - d);
% 构建二叉树
stock_prices = zeros(n + 1, n + 1);
option_prices = zeros(n + 1, n + 1);
stock_prices(1, 1) = S0;
for i = 2:n+1
stock_prices(i, 1) = stock_prices(i-1, 1) * u;
for j = 2:i
stock_prices(i, j) = stock_prices(i-1, j-1) * d;
end
end
% 计算期权价格
for j = 1:n+1
option_prices(n+1, j) = max(stock_prices(n+1, j) - K, 0);
end
for i = n:-1:1
for j = 1:i
option_prices(i, j) = exp(-r * delta_t) * (p * option_prices(i+1, j) + (1 - p) * option_prices(i+1, j+1));
end
end
% 计算后付期权金P
option_price = option_prices(1, 1) - P;
end
解释:函数首先计算了二叉树模型中的参数u、d和p,然后构建了二叉树,并使用递归的方式计算了每个节点的期权价格。最后,函数计算了后付期权金P。
计算的m文件:
% 参数设置
S0 = 50; % 标的资产初始价格
K = 50; % 期权行权价格
r = 0.05; % 无风险利率
sigma = 0.3; % 标的资产的波动率
T = 5/12; % 期权到期时间(以年为单位)
n = 100; % 二叉树步数
P = 1; % 后付期权金P
% 使用fzero函数确定后付期权金P
option_price = fzero(@(P) binary_tree_option_price(S0, K, r, sigma, T, n, P), [0, 100]);
disp(['后付期权金P: ' num2str(option_price)]);
我使用fzero函数来确定使”binary_tree_option_price”函数返回值为零的P值,即后付期权金P。fzero函数的第一个参数是一个匿名函数,其输入是P值,输出是”binary_tree_option_price”函数的返回值。第二个参数是一个包含两个元素的向量,用于指定fzero函数搜索P的范围。最后,我使用disp函数输出了后付期权金P的值。
这里的最后一句disp()需要研究一下。需要单独做一期
结果:
所以P=4.3448
(b)查分方法。同二叉树
finite_difference_option_price.m文件:
function option_price = finite_difference_option_price(S0, K, r, sigma, T, M, N, P)
delta_t = T / N;
delta_x = sigma * sqrt(3 * delta_t);
% 初始化网格和边界条件
V = zeros(M+1, N+1);
S = zeros(M+1, 1);
for i = 1:M+1
S(i) = K * exp((i-M/2) * delta_x);
V(i, N+1) = max(S(i) - K, 0);
end
% 计算期权价格
for j = N:-1:1
for i = 2:M
V(i, j) = (1 - r * delta_t) * V(i, j+1) + (r * delta_t / 2) * (V(i+1, j+1) + V(i-1, j+1));
end
end
% 计算后付期权金P
option_price = V(M/2+1, 1) - P;
end
计算的m文件:
% 参数设置
S0 = 50; % 标的资产初始价格
K = 50; % 期权行权价格
r = 0.05; % 无风险利率
sigma = 0.3; % 标的资产的波动率
T = 5/12; % 期权到期时间(以年为单位)
M = 100; % 价格网格划分数
N = 100; % 时间网格划分数
P = 1; % 后付期权金P
% 使用fzero函数确定后付期权金P
option_price = fzero(@(P) finite_difference_option_price(S0, K, r, sigma, T, M, N, P), [0, 100]);
disp(['后付期权金P: ' num2str(option_price)]);
结果:
没学完,放②中