merge 2 loops

This commit is contained in:
Kevin Keogh
2017-04-02 18:50:01 -04:00
parent fe5c68f149
commit d793ecb2fe
2 changed files with 8 additions and 14 deletions

View File

@@ -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)
{

View File

@@ -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;
}