tarf_monte_carlo 2.2 → 2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/tarf_monte_carlo/tarf_monte_carlo.c +68 -1
- data/lib/tarf_monte_carlo/version.rb +3 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b440e7a3a2b9484d1c8edf20e7d74b3a0623a14a902afafea54b6be162ea7939
|
4
|
+
data.tar.gz: dd67f54665c6211ce93f96ada1342dc929e2f44ab601f4de6284af01e5d2de1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6461fc8999a13d1d4a44894a482c8436545b48d464d711d5d626bdf11831b406af1eabe3877782e9a16ce5537cef8d248f641bca327ebe5110041c1c6954e96a
|
7
|
+
data.tar.gz: aaec3c1f7fa06c60ab74b9dfcba834d64581b945cf50b5c9add81a5c4ee9f2e098751d69f239243ee8583ed05a7413720de6202ac9f7e99e904e762689fe75f6
|
@@ -28,6 +28,7 @@
|
|
28
28
|
#define ABSOLUTE 1 // knockout by absolute
|
29
29
|
#define POINTS 2 // knockout by points
|
30
30
|
#define LEGS 3 // knockout by legs
|
31
|
+
#define DATAPOINTS 200 // data for plotting
|
31
32
|
|
32
33
|
// Defining a space for information and references
|
33
34
|
// about the module to be stored internally
|
@@ -64,6 +65,7 @@ VALUE method_box_muller( VALUE self ) {
|
|
64
65
|
// main method for running monte carlo simulation from sidekiq worker/outside method
|
65
66
|
VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
66
67
|
VALUE MCInputs = rb_ary_shift(args);
|
68
|
+
rb_p("MC Inputs: ")
|
67
69
|
rb_p(MCInputs);
|
68
70
|
|
69
71
|
// seed value for rand() function
|
@@ -110,6 +112,22 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
110
112
|
DFs_array[leg] = NUM2DBL( rb_ary_entry(DFs, leg) );
|
111
113
|
}
|
112
114
|
|
115
|
+
//
|
116
|
+
// first create a 1-D array of pointers, and then, for each array entry, create another 1-D array.
|
117
|
+
//
|
118
|
+
int metric;
|
119
|
+
double **metrics;
|
120
|
+
metrics = ( double** ) malloc( DATAPOINTS * sizeof(double*) );
|
121
|
+
for( metric = 0; metric < DATAPOINTS; metric++ ) {
|
122
|
+
metrics[metric] = ( double* ) malloc( NL * sizeof(double) );
|
123
|
+
}
|
124
|
+
for(metric = 0; metric < DATAPOINTS; metric++) {
|
125
|
+
for(leg = 0; leg < ML; leg++) {
|
126
|
+
metrics[metric][leg] = 0.0;
|
127
|
+
}
|
128
|
+
}
|
129
|
+
int point_pos = 0;
|
130
|
+
|
113
131
|
// run simulations loop
|
114
132
|
for( sim_count = 0; sim_count < SCount; sim_count += 2 ) {
|
115
133
|
// initial spot rate for each iteration would be current spot rate
|
@@ -134,7 +152,6 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
134
152
|
eps = NUM2DBL( method_box_muller( self ) );
|
135
153
|
eps_dash = eps * -1;
|
136
154
|
|
137
|
-
//NOTE: NEED NOT RUN THIS ON EVERY SIMULATION
|
138
155
|
// main formula of MC simulation
|
139
156
|
drift = ( ( *( bs_array + leg ) ) - 0.5 * pow( ( *( vs_array + leg ) ), 2 ) ) * ( *( Ts_array + leg ) );
|
140
157
|
vSqrdt = ( *( vs_array + leg ) ) * sqrt( *( Ts_array + leg ) );
|
@@ -158,6 +175,14 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
158
175
|
sim[leg] = profit_loss;
|
159
176
|
sim_dash[leg] = profit_loss_dash;
|
160
177
|
|
178
|
+
//
|
179
|
+
// Store spot and spot dash
|
180
|
+
//
|
181
|
+
if( (sim_count + 1) % 50 == 0 ) {
|
182
|
+
metrics[ point_pos ][ leg ] = Spot;
|
183
|
+
metrics[ point_pos + 2 ][ leg ] = Spot_dash;
|
184
|
+
}
|
185
|
+
|
161
186
|
// if excuted UNCHAINED method
|
162
187
|
// always use the current spot rate
|
163
188
|
if ( MCType == UNCHAINED ) {
|
@@ -272,6 +297,14 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
272
297
|
// take sum of positive and negative payoffs and calculate pvs
|
273
298
|
double sim_pos_sum = 0.0, sim_neg_sum = 0.0, sim_dash_pos_sum = 0.0, sim_dash_neg_sum = 0.0;
|
274
299
|
for( leg = 0; leg < NL; ++leg ) {
|
300
|
+
//
|
301
|
+
// store and send whichever payoff you want
|
302
|
+
//
|
303
|
+
if( (sim_count + 1) % 50 == 0 ) {
|
304
|
+
metrics[ point_pos + 1 ][ leg ] = sim_pos[leg];
|
305
|
+
metrics[ point_pos + 3 ][ leg ] = sim_dash_pos[leg];
|
306
|
+
}
|
307
|
+
|
275
308
|
sim_pos_sum += sim_pos[leg] * ( *( DFs_array + leg ) );
|
276
309
|
sim_neg_sum += sim_neg[leg] * ( *( DFs_array + leg ) );
|
277
310
|
sim_dash_pos_sum += sim_dash_pos[leg] * ( *( DFs_array + leg ) );
|
@@ -283,15 +316,26 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
283
316
|
pvs_pos[sim_count + 1] = sim_dash_pos_sum;
|
284
317
|
pvs_neg[sim_count] = sim_neg_sum;
|
285
318
|
pvs_neg[sim_count + 1] = sim_dash_neg_sum;
|
319
|
+
|
320
|
+
//
|
321
|
+
// increment metric storing point by 4
|
322
|
+
//
|
323
|
+
if( (sim_count + 1) % 50 == 0 ) {
|
324
|
+
point_pos += 4;
|
325
|
+
}
|
286
326
|
}
|
287
327
|
|
328
|
+
//
|
288
329
|
// sum all final +ve and -ve payoffs
|
330
|
+
//
|
289
331
|
for(sim_count = 0; sim_count < SCount; ++sim_count) {
|
290
332
|
pvs_pos_sum += *(pvs_pos + sim_count);
|
291
333
|
pvs_neg_sum += *(pvs_neg + sim_count);
|
292
334
|
}
|
293
335
|
|
336
|
+
//
|
294
337
|
// free dynamically alloted heap memory
|
338
|
+
//
|
295
339
|
free(pvs_pos);
|
296
340
|
free(pvs_neg);
|
297
341
|
free(Ls_array);
|
@@ -302,11 +346,34 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
302
346
|
free(bs_array);
|
303
347
|
free(DFs_array);
|
304
348
|
|
349
|
+
//
|
305
350
|
// return both payoffs
|
351
|
+
//
|
352
|
+
VALUE final_metrics = rb_ary_new();
|
353
|
+
for(metric = 0; metric < DATAPOINTS; metric++) {
|
354
|
+
VALUE leg_metrics = rb_ary_new();
|
355
|
+
|
356
|
+
for(leg = 0; leg < NL; leg++) {
|
357
|
+
rb_ary_push( leg_metrics, DBL2NUM( metrics[metric][leg] ) );
|
358
|
+
}
|
359
|
+
|
360
|
+
rb_ary_push(final_metrics, leg_metrics);
|
361
|
+
}
|
362
|
+
|
306
363
|
VALUE final_pvs = rb_hash_new();
|
307
364
|
rb_hash_aset(final_pvs, rb_str_new2("positive_pv"), DBL2NUM( pvs_pos_sum / SCount ));
|
308
365
|
rb_hash_aset(final_pvs, rb_str_new2("negative_pv"), DBL2NUM( pvs_neg_sum / SCount ));
|
309
366
|
rb_hash_aset(final_pvs, rb_str_new2("total_pv"), DBL2NUM( (pvs_neg_sum + pvs_pos_sum) / SCount ));
|
367
|
+
rb_hash_aset(final_pvs, rb_str_new2("metrics"), final_metrics);
|
368
|
+
|
369
|
+
//
|
370
|
+
// free your arrays from memory once you're done using them
|
371
|
+
//
|
372
|
+
for(metric = 0; metric < DATAPOINTS; metric++) {
|
373
|
+
free( metrics[metric] );
|
374
|
+
}
|
375
|
+
free(metrics);
|
376
|
+
|
310
377
|
return final_pvs;
|
311
378
|
}
|
312
379
|
|