我正在尝试在Matlab的父脚本中执行parfor循环。
我想计算期权价格的隐含波动率,然后在预先存在的数据集中创建一个包含结果的新列。
load('/home/arreat/Casino/names.mat')
name = char(names(i))
%Loop over n rows to populate columns in dataset named using variable 'name(i)'
rows = eval(['length(',name,')'])
parfor n=[1:rows]
%Calculate implied volatility using blsimpv(Price, Strike, Rate, Time, Value, Limit,Yield, Tolerance, Class)
BidIV = blsimpv(eval([name,'.UnderlyingPrice(n)']),...
eval([name,'.Strike(n)']),...
RiskFree/100,...
eval([name,'.Lifespan(n)'])/252,...
eval([name,'.Bid(n)'])+.01,...
10,...
0,...
1e-15,...
eval([name,'.Type(n)'])...
)
eval([name,'.BidIV(n,1) = double(BidIV);']);
%Loop and add implied volatility (BidIV) to a column with n number of
%rows.
end
问题出现在parfor循环中的'eval()'计算中。 Mathworks建议我将整个脚本变成一个函数,然后在parfor循环中调用该函数。
我在做这个时,有什么想法?
答案 0 :(得分:1)
不是一直调用eval
,而是可以在循环外调用一次,例如data = eval(name)
,然后在data.Strike
循环中使用parfor
等。
要避免完全调用eval
,请执行以下操作:
%# load mat-file contents into structure allData, where
%# each variable becomes a field
allData = load('/home/arreat/Casino/names.mat');
data = allData.(name);