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 |  |