#include <math.h>
#include <stdio.h>
#include <iostream>
template<class ty>
template<>
dtype get_dtype<float>() {
}
template<>
dtype get_dtype<double>() {
}
template<class ty, bool use_barrier>
static ty monte_carlo_barrier(int N, ty K, ty t, ty vol, ty r, ty strike,
int steps, ty B) {
dtype pres = get_dtype<ty>();
ty dt = t / (ty)(steps - 1);
randmat =
exp((r - (vol * vol * 0.5)) * dt + vol *
sqrt(dt) * randmat);
if (use_barrier) { S = S *
allTrue(S < B, 1); }
payoff =
max(0.0, S - K);
ty P = mean<ty>(payoff) *
exp(-r * t);
return P;
}
template<class ty, bool use_barrier>
double monte_carlo_bench(int N) {
int steps = 180;
ty stock_price = 100.0;
ty maturity = 0.5;
ty volatility = .30;
ty rate = .01;
ty strike = 100;
ty barrier = 115.0;
for (int i = 0; i < 10; i++) {
monte_carlo_barrier<ty, use_barrier>(
N, stock_price, maturity, volatility, rate, strike, steps, barrier);
}
}
int main() {
try {
monte_carlo_bench<float, false>(1000);
monte_carlo_bench<float, true>(1000);
for (int n = 10000; n <= 100000; n += 10000) {
printf(
"Time for %7d paths - "
"vanilla method: %4.3f ms, "
"barrier method: %4.3f ms\n",
n, 1000 * monte_carlo_bench<float, false>(n),
1000 * monte_carlo_bench<float, true>(n));
}
return 0;
}