tarf_monte_carlo 3.44 → 3.50

Sign up to get free protection for your applications and to get access to all the features.
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.