以下数据是通过左键单击文件夹窗格上的文件以打开导入窗口导入的,并作为单元格数组导入。每一列都将是我的一个变量(K=第一列等(。
StrikePrice UnderlyingPrice mT Rf DividendRate Volatility
47 45 4 0.02 0.5 0.2
50 55 20 0.03 0.1 0.35
我正在使用Mark Hoyle(2016(首次编写的一个函数,该函数为American Calls 定价
function LSMAmCallContDiv(S0,K,D,r,sigma,T,NSteps,NSims)
为这个函数填写我的数据的第一行;
function LSMAmCallContDiv(45, 47, 0.5, 0.02, 0.2, 4, 500, 100)
我是否可以在不必手动更改单元格数组中第二行的值的情况下执行此函数?(事实上,我正在处理很多争吵(。这是我用以下代码在RStudio中定价时实现的,但我完全是MatLab的初学者。
jpmitmput30results = apply(jpmitmput30full, 1, function(x) AmerPutLSM(Spot = x['UnderlyingPrice'], sigma = x['Volatility'],
n=500, m=100, Strike = x['StrikePrice'],
r = x['Rf'], dr = x['DividendRate'],
mT = x['mT']))
如果你有一个单元格数组,我想它看起来是这样的:
data = {47 45 4 0.02 0.5 0.2
50 55 20 0.03 0.1 0.35};
要获得一个值,可以将其索引为data{row,column}
,例如data{1,3}
返回4。
现在,您只需要一个循环,以正确的顺序重复调用具有正确值的函数:
for ii=1:size(data,1)
LSMAmCallContDiv(data{ii,2},data{ii,1},data{ii,5},data{ii,4},data{ii,6},data{ii,3},500,100)
end
由于函数没有输出参数,我们无法在数组中收集其结果。您必须从终端窗口复制粘贴它们。如果您决定修改函数以返回值,则可以收集它们。首先将函数的第一行修改为:
function [Price,StdErr] = LSMAmCallContDiv(S0,K,D,r,sigma,T,NSteps,NSims)
然后用你自己的代码:
Price = zeros(size(data,1),1);
StdErr = zeros(size(data,1),1);
for ii=1:size(data,1)
[Price(ii),StdErr(ii)] = LSMAmCallContDiv(data{ii,2},data{ii,1},data{ii,5},data{ii,4},data{ii,6},data{ii,3},500,100)
end
我不确定这个函数的具体情况,但大多数函数都可以接受矢量化输入,这是一个非常有用的功能。也就是说,当其他语言中的函数采用单值输入时,matlab会自动将所有内容视为数组,因此您可以将向量传递给函数,它会调用输入中每一行的函数。
例如,
frame = [47, 45, 4, 0.02, 0.5, 0.2; 50, 55, 20, 0.03, 0.1, 0.35];
out = LSMAmCallContDiv(frame(:,2), frame(:,1), frame(:,5), frame(:,4), frame(:,6), frame(:,3), 500, 100);
应该为您提供一个列向量,其中包含您想要的所有输出。需要明确的是,(:,2)
中的:
表示每一行,2
表示第二列。因此,frame(:,2)
指的是整个第二列。
现在,这个函数可能不是这样的,它可能无法接受矢量化输入,(我找不到任何关于它的文档,(在这种情况下,您可能必须采取更具编程性的方法。
i = 1;
while i <= height(frame)
out(i) = LSMAmCallContDiv(frame(i,2), frame(i,1), frame(i,5), frame(i,4), frame(i,6), frame(i,3), 500, 100);
i = i+1;
end
这是一种在任何其他语言中都可能看到的更标准的方法(尽管在matlab中效率较低(,但它肯定是一种很好的方法