tarf_monte_carlo 3.43 → 3.49

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88cc80746dba47969e5cdc166b6510be889fd4c090ec1415cfdc066f47e32ebc
4
- data.tar.gz: 4c7ab741260ab16d84a21659176211a466585d61be1c5adbdda62503173afa95
3
+ metadata.gz: 92ba4ec2f8c25a6704d3e7388a8a3e243ff51693b8ea1966d57b67b42d09514f
4
+ data.tar.gz: f80d07fdca106e815b442561331e1cfce8a7772e5e8b9bfb830cf6b043432fcd
5
5
  SHA512:
6
- metadata.gz: 421f79a3b144d3066b04576f79b2041b24d3643322c76c4a06cca0be951069cff5e8d999cc3eaa6e2dcf62b81a321c7c8c5018aeefb1b3269d86d751d39251c7
7
- data.tar.gz: 35b4d0df1af4fa5ca3ab88617c9516543a1c6127bf49287f21f19d00c1afa8bc13489fdb67bf808bcd8ac8d1348544a75fe3132f90f5f1d7979cdb7beae47a00
6
+ metadata.gz: 944741bc4e48a44ecd97d09e36a316bb2eba4b78a6d2bbd2e645699b5e595008e443f88e78e841844ef6765af80b45a9a47144978e8628048699787a8859ee9b
7
+ data.tar.gz: a03e00f6749dcdc4358370b1d49056032b9d97ff4293208633045dddeb970fea0b9be734037383734a117f13dce003d5fa851e734a6b725cd72f4908a47b6e9f
@@ -43,8 +43,11 @@
43
43
 
44
44
  #define FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE 13
45
45
  #define FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE 14
46
+ #define FX_AMERICAN_BARRIER_WINDOW_KNOCKIN 15
47
+ #define FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT 16
46
48
 
47
49
  #define DATAPOINTS 200 // data for plotting
50
+ #define BARRIER_DP 4 // data for plotting
48
51
  #define INTERVAL 50
49
52
  #define SIM_LIMIT 196 // 196 + 4 = 200 simulations nedded
50
53
 
@@ -142,6 +145,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
142
145
  double *USts_array = ( double* ) malloc( NL * sizeof(double) );
143
146
  double *TempNs_array = ( double* ) malloc( NL * sizeof(double) );
144
147
  double *Barrier_array = ( double* ) malloc( NL * sizeof(double) );
148
+ double *Barrier2_array = ( double* ) malloc( NL * sizeof(double) );
145
149
  double *Rebate_array = ( double* ) malloc( NL * sizeof(double) );
146
150
 
147
151
  VALUE Ls = rb_hash_aref(MCInputs, rb_str_new2("leverage_ratios") );
@@ -156,6 +160,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
156
160
  VALUE LSts = rb_hash_aref(MCInputs, rb_str_new2("lower_strikes") );
157
161
  VALUE USts = rb_hash_aref(MCInputs, rb_str_new2("upper_strikes") );
158
162
  VALUE Brs = rb_hash_aref(MCInputs, rb_str_new2("barriers") );
163
+ VALUE Brs2 = rb_hash_aref(MCInputs, rb_str_new2("barriers2") );
159
164
  VALUE Rbts = rb_hash_aref(MCInputs, rb_str_new2("rebates") );
160
165
 
161
166
  for (leg = 0; leg < NL; ++leg) {
@@ -188,6 +193,8 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
188
193
  Barrier_array[leg] = NUM2DBL( rb_ary_entry(Brs, leg) );
189
194
  Rebate_array[leg] = NUM2DBL( rb_ary_entry(Rbts, leg) );
190
195
  }
196
+ } else if(KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT){
197
+ Barrier2_array[leg] = NUM2DBL( rb_ary_entry(Brs2, leg) );
191
198
  }
192
199
 
193
200
  //
@@ -195,15 +202,15 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
195
202
  //
196
203
  double **metrics;
197
204
  if (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE){
198
- metrics = ( double** ) malloc( 3 * sizeof(double*) );
199
- for( metric = 0; metric < 3; metric++ ) {
205
+ metrics = ( double** ) malloc( BARRIER_DP * sizeof(double*) );
206
+ for( metric = 0; metric < BARRIER_DP; metric++ ) {
200
207
  metrics[metric] = ( double* ) malloc( DATAPOINTS * sizeof(double) );
201
208
  for(leg = 0; leg < DATAPOINTS; leg++) {
202
209
  metrics[metric][leg] = 0.0;
203
210
  }
204
211
  }
205
212
  }
206
- else{
213
+ else{
207
214
  metrics = ( double** ) malloc( DATAPOINTS * sizeof(double*) );
208
215
  for( metric = 0; metric < DATAPOINTS; metric++ ) {
209
216
  metrics[metric] = ( double* ) malloc( NL * sizeof(double) );
@@ -261,6 +268,16 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
261
268
  if(knockedLeg_dash == -1 && knockin_dash >= 0){
262
269
  knockedLeg_dash = leg;
263
270
  }
271
+ } else if(KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT){
272
+ profit_loss = Spot;
273
+ profit_loss_dash = Spot_dash;
274
+
275
+ if(knockedLeg == -1 && (Spot <= *(Barrier_array + leg) || Spot >= *(Barrier2_array + leg))){
276
+ knockedLeg = leg;
277
+ }
278
+ if(knockedLeg_dash == -1 && (Spot_dash <= *(Barrier_array + leg) || Spot_dash >= *(Barrier2_array + leg))){
279
+ knockedLeg_dash = leg;
280
+ }
264
281
  } else if ( KType == DOUBLE_STRIKE_POINTS || KType == DOUBLE_STRIKE_ABSOLUTE || KType == DOUBLE_STRIKE_LEGS ) {
265
282
  if ( Spot < *( LSts_array + leg ) ) {
266
283
  profit_loss = Spot - (*( LSts_array + leg ));
@@ -418,10 +435,12 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
418
435
  sim_dash_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + 0 ) ), sim_dash[NL-1], dir_sign);
419
436
  }
420
437
  if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
421
- metrics[0][point_pos] = sim[NL-1];
422
- metrics[1][point_pos] = (knockedLeg >= 0) ? ( *( Xs_array + (knockedLeg) ) ) : 0;
438
+ metrics[0][point_pos] = sim[NL-1];
439
+ metrics[1][point_pos] = (knockedLeg >= 0) ? ( *( Xs_array + (knockedLeg) ) ) : 0;
440
+ metrics[3][point_pos] = knockedLeg;
423
441
  metrics[0][point_pos+1] = sim_dash[NL-1];
424
442
  metrics[1][point_pos+1] = (knockedLeg_dash >= 0) ? ( *( Xs_array + (knockedLeg_dash) ) ) : 0;
443
+ metrics[3][point_pos+1] = knockedLeg_dash;
425
444
  }
426
445
  } else if(KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE){
427
446
  if(knockedLeg >= 0){
@@ -440,10 +459,12 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
440
459
  }
441
460
 
442
461
  if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
443
- metrics[0][point_pos] = (knockedLeg >= 0) ? sim[knockedLeg] : sim[NL-1];
444
- metrics[1][point_pos] = ( *( Xs_array + 0 ) );
462
+ metrics[0][point_pos] = (knockedLeg >= 0) ? sim[knockedLeg] : sim[NL-1];
463
+ metrics[1][point_pos] = ( *( Xs_array + 0 ) );
464
+ metrics[3][point_pos] = knockedLeg;
445
465
  metrics[0][point_pos+1] = (knockedLeg_dash >= 0) ? sim[knockedLeg_dash] : sim[NL-1];
446
466
  metrics[1][point_pos+1] = ( *( Xs_array + 0 ) );
467
+ metrics[3][point_pos+1] = knockedLeg_dash;
447
468
  }
448
469
 
449
470
  } else if( KType == ABSOLUTE || KType == PIVOT_ABSOLUTE || KType == COLLAR_ABSOLUTE || KType == DOUBLE_STRIKE_ABSOLUTE ) {
@@ -572,17 +593,20 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
572
593
  pvs_pos[sim_count + 1] = sim_dash_pos_sum;
573
594
  pvs_neg[sim_count] = sim_neg_sum;
574
595
  pvs_neg[sim_count + 1] = sim_dash_neg_sum;
575
- if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
576
- metrics[2][point_pos] = sim_pos_sum;
577
- metrics[2][point_pos+1] = sim_dash_pos_sum;
578
- point_pos += 2;
579
- }
580
596
 
581
- //
582
- // increment metric storing point by 4
583
- // Note: no limit condition here
584
- //
585
- if (!(KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE)){
597
+
598
+ if (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE){
599
+ if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
600
+ metrics[2][point_pos] = sim_pos_sum;
601
+ metrics[2][point_pos+1] = sim_dash_pos_sum;
602
+ point_pos += 2;
603
+ }
604
+ }
605
+ else{
606
+ //
607
+ // increment metric storing point by 4
608
+ // Note: no limit condition here
609
+ //
586
610
  if( (sim_count + 2) % INTERVAL == 0 ) {
587
611
  // rb_p(rb_str_new2("T:"));
588
612
  // rb_p(INT2NUM(point_pos));
@@ -623,7 +647,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
623
647
  VALUE final_metrics = rb_ary_new();
624
648
 
625
649
  if (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE){
626
- for(metric = 0; metric < 3; metric++) {
650
+ for(metric = 0; metric < BARRIER_DP; metric++) {
627
651
  VALUE leg_metrics = rb_ary_new();
628
652
 
629
653
  for(leg = 0; leg < DATAPOINTS; leg++) {
@@ -655,7 +679,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
655
679
  //
656
680
  // free your arrays from memory once you're done using them
657
681
  //
658
- int dp = (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE) ? 3 : DATAPOINTS;
682
+ int dp = (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE) ? BARRIER_DP : DATAPOINTS;
659
683
  for(metric = 0; metric < dp; metric++) {
660
684
  free( metrics[metric] );
661
685
  }
@@ -3,5 +3,5 @@
3
3
  # gem yank tarf_monte_carlo -v 2.3
4
4
 
5
5
  module TarfMonteCarlo
6
- VERSION = "3.43"
6
+ VERSION = "3.49"
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tarf_monte_carlo
3
3
  version: !ruby/object:Gem::Version
4
- version: '3.43'
4
+ version: '3.49'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vivek Routh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-06 00:00:00.000000000 Z
11
+ date: 2020-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -140,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
142
  requirements: []
143
- rubygems_version: 3.0.8
143
+ rubygems_version: 3.0.6
144
144
  signing_key:
145
145
  specification_version: 4
146
146
  summary: Monte Carlo Simulation.