金融计算系列①

这个系列的不是为了教学,主要是供自己回看,用来调用方法。

金融计算小学期的话,暑假是有的。寒假不清楚

今年接单大概接触到三份。我自己的之后处理

这一份的难度算是最大的,一共五道题目。

假设:市场上的源生资产均以几何布朗运动运行

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;

结果:

金融计算系列①_第1张图片

 金融计算系列①_第2张图片

 从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)]);

结果:

 没学完,放②中

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