我想在matlab中运行以下.m文件:
function [relativeErrors] = plotRelativeErrors()
initialPrice = 115.47;
sigma = 1.34*10^(-2);
tau = 0;
days = 40;
Strike = 114;
Time = days/365;
[callSol, ~] = blsprice(initialPrice, Strike, tau, Time, sigma);
termOne = (tau - (sigma^2)/2)*days;
termTwo = sigma * sqrt(days);
relativeErrors = [];
for i = 1:8
max = 0;
N = 10^i;
for n = 1:50
v = intern_eurValue(Strike, initialPrice, days, N, termOne, termTwo);
difference = abs(v-callSol);
if difference > max
max = difference;
end
end
relativeErrors(end+1) = max;
end
end
function [value] = intern_eurValue(strike, price, days, N, termOne, termTwo)
prices = intern_simulateEndPrice(price, termOne, termTwo, days, N);
theMean = mean(prices);
value = theMean - strike;
if value < 0
value = 0;
end
end
function [prices] = intern_simPrice(initialPrice, termOne, termTwo, days, N)
prices = [];
for i = 1:N
termTwo = termTwo * normrnd(0,1);
exponential = exp(termOne + termTwo);
prices(end+1,1) = initialPrice * exponential;
end
end
问题是,如果不是更多的话,运行它将花费一天时间来完成计算。我不得不称它在运行14小时后退出并且没有中途完成。我已经尝试通过将大多数静态计算委托给intern_simPrice
到plotRelativeErrors
并通过termOne
和termTwo
传递结果来优化运行时,但我几乎没有注意到进展。
我不认为这可以减少计算量,但也许它可以切换到计算速度更快的东西。
答案 0 :(得分:2)
免责声明:以下方法可帮助您达到可用的速度,但不会减少time complexity本身。
如果您的计算速度很慢,首先要做的是使用分析器来找出减慢速度的因素。在您的情况下,intern_simPrice
,特别是对normrnd
的数百万次调用。
让函数在一次调用中计算多个值通常要快得多。 所以,首先应该替换:
for i = 1:N
termTwo = termTwo * normrnd(0,1);
....
end
与
X_norm = normrnd(0,1,1,N); % Generate N random values simultaneously
for i = 1:N
termTwo = termTwo * X_norm(i);
....
end
如果你知道你的阵列有多长,那么提前分配它们也会更聪明。 所以你应该替换:
prices = []
for i = 1:N
prices(end+1) = ...
与
prices = zeros(N,1);
for i = 1:N
prices(i) = ...
有时for
循环可以用矢量化版本替换。
在你的情况下,这将是:
完全替换函数intern_simPrice
并使用:
prices = initialPrice*exp(termOne + termTwo*cumprod(normrnd(0,1,N,1)));