tarf_monte_carlo 3.53 → 3.54

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: 60b2cf5e21d6d9a92dbef8d1988f1a0988b31279d7010aed5eec76327968bd29
4
- data.tar.gz: b93ce27d9a66eb82683d3b1dff6aeb9c2bd98796bca3ca07fca85ab0fdf007d3
3
+ metadata.gz: e0d7cdafaf4865a66b7bbe6452a9ad3dd90c3ced070778cd288bf304cb3e2417
4
+ data.tar.gz: 79894b25d74fc53dfe3151009122e846323b18e31ba4ab71f4cced7edcad6eae
5
5
  SHA512:
6
- metadata.gz: 6231ef9420bd8dd40b08344732b75b741b76e6665d2aa1b89948b9f4ea96540b460759a1810cb07e64d2595dd3b978554eca426ca250d9f2f650b6955598eab5
7
- data.tar.gz: 68ee5e27fb0c8789362bce8af4f69fa1f7e428e04752f298d6b053f4c23d53f703968eb3eb2c0ce011f20e315237bd3ee5701c702def7f748367d9bab0525a3c
6
+ metadata.gz: c513bd0d5cbc5b2d8e3a66334131cf0d95b094510a6fb42f1862b478448b605c1e04a2714f552e9a7234bf1eeb1bd3297e034dbec69445e13ad2bf3ff2c65b58
7
+ data.tar.gz: c0ce2f67ed9a9c32f1ddaef031350535c2522bd6bfde0c80bb493189b684f68aab392fbbf773b85d1d92a11fc3d488501e5d5e8ca87e3d8f9458694c8297f9e3
@@ -45,6 +45,8 @@
45
45
  #define FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE 14
46
46
  #define FX_AMERICAN_BARRIER_WINDOW_KNOCKIN 15
47
47
  #define FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT 16
48
+ #define FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP 17
49
+ #define FX_AMERICAN_BARRIER_KIKO_UNTIL_KI 18
48
50
 
49
51
  #define DATAPOINTS 200 // data for plotting
50
52
  #define BARRIER_DP 4 // data for plotting
@@ -63,6 +65,7 @@ double european_payoff(double, double, int, int, double);
63
65
  double get_equivalent_notional(int, double, float);
64
66
  double get_equivalent_rebate(int, double, float, int);
65
67
  bool barrier_variations(int);
68
+ bool double_barrier_variations(int);
66
69
  // Prototype for our methods - methods are prefixed by 'method_' here
67
70
  VALUE method_box_muller( VALUE );
68
71
  VALUE method_run_monte_carlo( VALUE, VALUE );
@@ -102,7 +105,11 @@ double get_equivalent_rebate(int conversion_sign, double rebate, float rate, int
102
105
  }
103
106
 
104
107
  bool barrier_variations(int KType){
105
- return (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT);
108
+ return (KType == FX_AMERICAN_BARRIER_KNOCKIN_DISCRETE || KType == FX_AMERICAN_BARRIER_KNOCKOUT_DISCRETE || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT || KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP || KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_KI);
109
+ }
110
+
111
+ bool double_barrier_variations(int KType){
112
+ return (KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT || KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP || KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_KI);
106
113
  }
107
114
  // main method for running monte carlo simulation from sidekiq worker/outside method
108
115
  VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
@@ -195,7 +202,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
195
202
  for (leg = 0; leg < NL; ++leg) {
196
203
  Barrier_array[leg] = NUM2DBL( rb_ary_entry(Brs, leg) );
197
204
  Rebate_array[leg] = NUM2DBL( rb_ary_entry(Rbts, leg) );
198
- if(KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT){
205
+ if(double_barrier_variations(KType)){
199
206
  Barrier2_array[leg] = NUM2DBL( rb_ary_entry(Brs2, leg) );
200
207
  }
201
208
  }
@@ -241,8 +248,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
241
248
  sim_dash_neg[leg] = 0.0;
242
249
  }
243
250
 
244
- int knockedLeg = -1;
245
- int knockedLeg_dash = -1;
251
+ int knockedLeg = -1, knockedLeg_dash = -1, knockedLeg2 = -1, knockedLeg2_dash = -1;
246
252
  // legs loop start
247
253
  for( leg = 0; leg < NL; ++leg ) {
248
254
  double eps, eps_dash, drift, vSqrdt, profit_loss, profit_loss_dash;
@@ -272,6 +278,23 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
272
278
  if(knockedLeg_dash == -1 && knockin_dash >= 0){
273
279
  knockedLeg_dash = leg;
274
280
  }
281
+ } else if(KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_KI || KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP){
282
+ profit_loss = Spot;
283
+ profit_loss_dash = Spot_dash;
284
+
285
+ if(knockedLeg == -1 && (Spot >= *(Barrier_array + leg))){
286
+ knockedLeg = leg;
287
+ }
288
+ if(knockedLeg_dash == -1 && (Spot_dash >= *(Barrier_array + leg))){
289
+ knockedLeg_dash = leg;
290
+ }
291
+
292
+ if(knockedLeg2 == -1 && (Spot >= *(Barrier2_array + leg))){
293
+ knockedLeg2 = leg;
294
+ }
295
+ if(knockedLeg2_dash == -1 && (Spot_dash >= *(Barrier2_array + leg))){
296
+ knockedLeg2_dash = leg;
297
+ }
275
298
  } else if(KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKIN || KType == FX_AMERICAN_BARRIER_WINDOW_KNOCKOUT){
276
299
  profit_loss = Spot;
277
300
  profit_loss_dash = Spot_dash;
@@ -438,6 +461,28 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
438
461
  else{
439
462
  sim_dash_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + 0 ) ), sim_dash[NL-1], dir_sign);
440
463
  }
464
+ if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
465
+ metrics[0][point_pos] = sim[NL-1];
466
+ metrics[1][point_pos] = (knockedLeg >= 0) ? ( *( Xs_array + (knockedLeg) ) ) : 0;
467
+ metrics[3][point_pos] = knockedLeg;
468
+ metrics[0][point_pos+1] = sim_dash[NL-1];
469
+ metrics[1][point_pos+1] = (knockedLeg_dash >= 0) ? ( *( Xs_array + (knockedLeg_dash) ) ) : 0;
470
+ metrics[3][point_pos+1] = knockedLeg_dash;
471
+ }
472
+ } else if(KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP || KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_KI){
473
+ if(knockedLeg2 >= 0){
474
+ sim_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + 0 ) ), sim[NL-1], dir_sign);
475
+ } else if(knockedLeg >= 0) {
476
+ double equivalent_notional = get_equivalent_notional(conversion_sign, ( *( Ns_array + knockedLeg ) ), sim[NL-1]);
477
+ sim_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg) ) ), sim[NL-1], cp_sign, dir_sign, equivalent_notional);
478
+ }
479
+ if(knockedLeg2_dash >= 0){
480
+ sim_dash_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + 0 ) ), sim_dash[NL-1], dir_sign);
481
+ } else if(knockedLeg_dash >= 0) {
482
+ double equivalent_notional = get_equivalent_notional(conversion_sign, ( *( Ns_array + knockedLeg_dash ) ), sim_dash[NL-1]);
483
+ sim_dash_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg_dash) ) ), sim_dash[NL-1], cp_sign, dir_sign, equivalent_notional);
484
+ }
485
+
441
486
  if ((point_pos < DATAPOINTS) && (sim_count % INTERVAL) == 0){
442
487
  metrics[0][point_pos] = sim[NL-1];
443
488
  metrics[1][point_pos] = (knockedLeg >= 0) ? ( *( Xs_array + (knockedLeg) ) ) : 0;
@@ -3,5 +3,5 @@
3
3
  # gem yank tarf_monte_carlo -v 2.3
4
4
 
5
5
  module TarfMonteCarlo
6
- VERSION = "3.53"
6
+ VERSION = "3.54"
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.53'
4
+ version: '3.54'
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-08 00:00:00.000000000 Z
11
+ date: 2020-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler