tarf_monte_carlo 3.44 → 3.50

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: 3983fc474126c8a34f0fce99d3f127b0057f5bf92e35949278a7018bc4c6eba0
4
- data.tar.gz: 3071b3646c65f592b9b2dfa75a8cfee0dac798b20a4b6d9d21db8758068c2191
3
+ metadata.gz: d378d28787178efe7bf21a742d34f732738ca1dd0d6cc88aa82726676fb1c767
4
+ data.tar.gz: 51ccc1a2352a018d9db80dd1b95acb51739c8ff51e6e80f73a8799444f381b21
5
5
  SHA512:
6
- metadata.gz: a457cd81fbd653af84c587af0de58495646567a9e9e0616f95226592db687e6122c109c62559867f4589bd81ae2a3bada9f79768f6ee9d1c418230868c5579bc
7
- data.tar.gz: eada7cec1fa54069644d41817988789080d127fe003918e5a7fd9d40f24b9001bece1c9090dd0defd006a168716158c731f9e47fc00b2cedc31f92c26cf68522
6
+ metadata.gz: 6cac6595d2997a12b7d39835fbe6e072e6ab052ad90aa9f0579fb4d3e3355bb0ef947ed818b36308ccde5239aef682f299844fda9fdd4d1f6925dc2238f642fb
7
+ data.tar.gz: 6df19f6a90f00d43c43b76a86e287ba2358ea63b47e68b75aa5fbc104ed562408dfbc0de249609b4446dafdda6a2fc54ab29cadc00f0d85d6d4025be02bd1b0a
@@ -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) {
@@ -187,6 +192,9 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
187
192
  for (leg = 0; leg < NL; ++leg) {
188
193
  Barrier_array[leg] = NUM2DBL( rb_ary_entry(Brs, leg) );
189
194
  Rebate_array[leg] = NUM2DBL( rb_ary_entry(Rbts, leg) );
195
+ if(KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT){
196
+ Barrier2_array[leg] = NUM2DBL( rb_ary_entry(Brs2, leg) );
197
+ }
190
198
  }
191
199
  }
192
200
 
@@ -195,15 +203,15 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
195
203
  //
196
204
  double **metrics;
197
205
  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 < 4; metric++ ) {
206
+ metrics = ( double** ) malloc( BARRIER_DP * sizeof(double*) );
207
+ for( metric = 0; metric < BARRIER_DP; metric++ ) {
200
208
  metrics[metric] = ( double* ) malloc( DATAPOINTS * sizeof(double) );
201
209
  for(leg = 0; leg < DATAPOINTS; leg++) {
202
210
  metrics[metric][leg] = 0.0;
203
211
  }
204
212
  }
205
213
  }
206
- else{
214
+ else{
207
215
  metrics = ( double** ) malloc( DATAPOINTS * sizeof(double*) );
208
216
  for( metric = 0; metric < DATAPOINTS; metric++ ) {
209
217
  metrics[metric] = ( double* ) malloc( NL * sizeof(double) );
@@ -261,6 +269,16 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
261
269
  if(knockedLeg_dash == -1 && knockin_dash >= 0){
262
270
  knockedLeg_dash = leg;
263
271
  }
272
+ } else if(KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT){
273
+ profit_loss = Spot;
274
+ profit_loss_dash = Spot_dash;
275
+
276
+ if(knockedLeg == -1 && (Spot <= *(Barrier_array + leg) || Spot >= *(Barrier2_array + leg))){
277
+ knockedLeg = leg;
278
+ }
279
+ if(knockedLeg_dash == -1 && (Spot_dash <= *(Barrier_array + leg) || Spot_dash >= *(Barrier2_array + leg))){
280
+ knockedLeg_dash = leg;
281
+ }
264
282
  } else if ( KType == DOUBLE_STRIKE_POINTS || KType == DOUBLE_STRIKE_ABSOLUTE || KType == DOUBLE_STRIKE_LEGS ) {
265
283
  if ( Spot < *( LSts_array + leg ) ) {
266
284
  profit_loss = Spot - (*( LSts_array + leg ));
@@ -418,14 +436,11 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
418
436
  sim_dash_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + 0 ) ), sim_dash[NL-1], dir_sign);
419
437
  }
420
438
  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;
439
+ metrics[0][point_pos] = sim[NL-1];
440
+ metrics[1][point_pos] = (knockedLeg >= 0) ? ( *( Xs_array + (knockedLeg) ) ) : 0;
441
+ metrics[3][point_pos] = knockedLeg;
423
442
  metrics[0][point_pos+1] = sim_dash[NL-1];
424
443
  metrics[1][point_pos+1] = (knockedLeg_dash >= 0) ? ( *( Xs_array + (knockedLeg_dash) ) ) : 0;
425
-
426
- metrics[2][point_pos] = sim_pos[NL-1];
427
- metrics[2][point_pos+1] = sim_dash_pos[NL-1];
428
- metrics[3][point_pos] = knockedLeg;
429
444
  metrics[3][point_pos+1] = knockedLeg_dash;
430
445
  }
431
446
  } else if(KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE){
@@ -445,10 +460,12 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
445
460
  }
446
461
 
447
462
  if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
448
- metrics[0][point_pos] = (knockedLeg >= 0) ? sim[knockedLeg] : sim[NL-1];
449
- metrics[1][point_pos] = ( *( Xs_array + 0 ) );
463
+ metrics[0][point_pos] = (knockedLeg >= 0) ? sim[knockedLeg] : sim[NL-1];
464
+ metrics[1][point_pos] = ( *( Xs_array + 0 ) );
465
+ metrics[3][point_pos] = knockedLeg;
450
466
  metrics[0][point_pos+1] = (knockedLeg_dash >= 0) ? sim[knockedLeg_dash] : sim[NL-1];
451
467
  metrics[1][point_pos+1] = ( *( Xs_array + 0 ) );
468
+ metrics[3][point_pos+1] = knockedLeg_dash;
452
469
  }
453
470
 
454
471
  } else if( KType == ABSOLUTE || KType == PIVOT_ABSOLUTE || KType == COLLAR_ABSOLUTE || KType == DOUBLE_STRIKE_ABSOLUTE ) {
@@ -581,8 +598,8 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
581
598
 
582
599
  if (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE){
583
600
  if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
584
- // metrics[2][point_pos] = sim_pos_sum;
585
- // metrics[2][point_pos+1] = sim_dash_pos_sum;
601
+ metrics[2][point_pos] = sim_pos_sum;
602
+ metrics[2][point_pos+1] = sim_dash_pos_sum;
586
603
  point_pos += 2;
587
604
  }
588
605
  }
@@ -631,7 +648,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
631
648
  VALUE final_metrics = rb_ary_new();
632
649
 
633
650
  if (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE){
634
- for(metric = 0; metric < 4; metric++) {
651
+ for(metric = 0; metric < BARRIER_DP; metric++) {
635
652
  VALUE leg_metrics = rb_ary_new();
636
653
 
637
654
  for(leg = 0; leg < DATAPOINTS; leg++) {
@@ -663,7 +680,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
663
680
  //
664
681
  // free your arrays from memory once you're done using them
665
682
  //
666
- int dp = (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE) ? 4 : DATAPOINTS;
683
+ int dp = (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE) ? BARRIER_DP : DATAPOINTS;
667
684
  for(metric = 0; metric < dp; metric++) {
668
685
  free( metrics[metric] );
669
686
  }
@@ -3,5 +3,5 @@
3
3
  # gem yank tarf_monte_carlo -v 2.3
4
4
 
5
5
  module TarfMonteCarlo
6
- VERSION = "3.44"
6
+ VERSION = "3.50"
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.44'
4
+ version: '3.50'
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.