merge 2 loops
This commit is contained in:
@@ -3,10 +3,7 @@
|
||||
#include "black_scholes.h"
|
||||
#include <cblas.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
double normalcdf(double value)
|
||||
{
|
||||
|
||||
19
src/gbm_mc.c
19
src/gbm_mc.c
@@ -10,6 +10,7 @@
|
||||
|
||||
double gbm_simulation(double spot, double rfr, double vol, double tte, double rand)
|
||||
{
|
||||
/* S_T = S_0e^{[r-\frac{\sigma^2}{2}]t + \sigma\sqrt{t}\xi_i} */
|
||||
double drift, stoch;
|
||||
drift = (rfr - pow(vol, 2) / 2) * tte;
|
||||
stoch = vol * pow(tte, 0.5) * rand;
|
||||
@@ -17,39 +18,35 @@ double gbm_simulation(double spot, double rfr, double vol, double tte, double ra
|
||||
|
||||
}
|
||||
|
||||
double gbm(double spot, double rfr, double vol, double strike, struct tm expiry, struct tm value, int type, int sims)
|
||||
double gbm(double spot, double rfr, double vol, double strike, struct tm expiry,
|
||||
struct tm value, int type, int sims)
|
||||
{
|
||||
const gsl_rng_type *T;
|
||||
double tte, expiry_date, value_date, level, price, rand;
|
||||
double *results;
|
||||
gsl_rng *r;
|
||||
double tte, expiry_date, value_date, level, price;
|
||||
double *rands, *results;
|
||||
int i;
|
||||
|
||||
rands = (double *)malloc(sizeof(double) * sims);
|
||||
results = (double *)malloc(sizeof(double) * sims);
|
||||
|
||||
expiry_date = mktime(&expiry);
|
||||
value_date = mktime(&value);
|
||||
tte = difftime(expiry_date, value_date) / (60 * 60 * 24 * 365);
|
||||
|
||||
/* get array of normal random numbers */
|
||||
/* GSL RNG setup */
|
||||
gsl_rng_env_setup();
|
||||
T = gsl_rng_default;
|
||||
r = gsl_rng_alloc(T);
|
||||
|
||||
for (i=0; i<sims; i++) {
|
||||
rands[i] = gsl_ran_gaussian(r, 1);
|
||||
}
|
||||
|
||||
for (i=0; i<sims; i++) {
|
||||
level = gbm_simulation(spot, rfr, vol, tte, rands[i]);
|
||||
rand = gsl_ran_gaussian(r, 1);
|
||||
level = gbm_simulation(spot, rfr, vol, tte, rand);
|
||||
results[i] = max((level - strike) * type, 0);
|
||||
}
|
||||
|
||||
price = gsl_stats_mean(results, 1, sims) * 1 / pow((1 + rfr), tte);
|
||||
|
||||
gsl_rng_free(r);
|
||||
free(rands);
|
||||
free(results);
|
||||
return price;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user