我正在比較Matlab和C++之間Vanilla調用選項的Monte Carlo定價算法的速度。這與Why is MATLAB so fast in matrix multiplication?並不相同,因爲加速不是由於矩陣乘法(只有一個點積快速完成),但似乎是由於其高效的高斯隨機數生成器。爲什麼Matlab比C++快11倍
在Matlab中的代碼已經被矢量化和代碼如下
function [ value ] = OptionMCValue(yearsToExpiry, spot, strike, riskFreeRate, dividendYield, volatility, numPaths )
sd = volatility*sqrt(yearsToExpiry);
sAdjusted = spot * exp((riskFreeRate - dividendYield - 0.5*volatility*volatility) * yearsToExpiry);
g = randn(1,numPaths);
sT = sAdjusted * exp(g * sd);
values = max(sT-strike,0);`
value = mean(values);
value = value * exp(-riskFreeRate * yearsToExpiry);
end
如果我運行這個擁有1000萬點的路徑如下
strike = 100.0;
yearsToExpiry = 2.16563;
spot = 100.0;
volatility = 0.20;
dividendYield = 0.03;
riskFreeRate = 0.05;
oneMillion = 1000000;
numPaths = 10*oneMillion;
tic
value = OptionMCValue(yearsToExpiry, spot, strike, riskFreeRate, dividendYield, volatility, numPaths );
toc
我得到
Elapsed time is 0.359304 seconds.
12.8311
現在我在VS2013中用C++做同樣的事情
我的代碼是在OptionMC類,並且是如下
double OptionMC::value(double yearsToExpiry,
double spot,
double riskFreeRate,
double dividendYield,
double volatility,
unsigned long numPaths)
{
double sd = volatility*sqrt(yearsToExpiry);
double sAdjusted = spot * exp((riskFreeRate - dividendYield - 0.5*volatility*volatility) * yearsToExpiry);
double value = 0.0;
double g, sT;
for (unsigned long i = 0; i < numPaths; i++)
{
g = GaussianRVByBoxMuller();
sT = sAdjusted * exp(g * sd);
value += Max(sT - m_strike, 0.0);
}
value = value * exp(-riskFreeRate * yearsToExpiry);
value /= (double) numPaths;
return value;
}
的BM代碼如下
double GaussianRVByBoxMuller()
{
double result;
double x; double y;;
double w;
do
{
x = 2.0*rand()/static_cast<double>(RAND_MAX)-1;
y = 2.0*rand()/static_cast<double>(RAND_MAX)-1;
w = x*x + y*y;
} while (w >= 1.0);
w = sqrt(-2.0 * log(w)/w);
result = x*w;
return result;
}
我已設置的優化選項以優化在Visual Studio中的速度。
對於10米路徑需要4.124秒。
這比Matlab慢11倍。
任何人都可以解釋區別?
編輯:在進一步測試減速確實似乎是調用GaussianRVByBoxMuller。 Matlab似乎有一個非常有效的實現 - Ziggurat方法。請注意,BM在這裏是次優的,因爲它會產生2個RV,而我只使用1個。解決這個問題會導致2倍加速。
C++版本是否像MATLAB版本一樣向量化? – NathanOliver
在Matlab中使用的優化與C++編譯器對您的代碼不一樣。 –
檢查您是否使用.net框架。不知道這是否會影響。 – xvan