tarf_monte_carlo 3.7 → 3.11

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: cefc9ef8eb8823816be8c5856f835261f38587509092f4c1f24a680dfe5ed074
4
- data.tar.gz: 3f4dc845dfd85eb5a7cd942525ef74fbce147399454acf3ab1d68fee22495e3c
3
+ metadata.gz: 850a097b6405e2fa4e128216700ef8c0a4748e9eddbc08ecadf7e0b1987c7e48
4
+ data.tar.gz: 2184d334e6b788c45a555e526a0fcb00788722de7068755dac602523699f80f7
5
5
  SHA512:
6
- metadata.gz: 259da15728d5b6717a09edf7eba18f28353c27e5c6a2273582a5c1cc07616e2163845b798a4062c0ca44a0dd4540d45a509420e9139059bc21adcdd99671d7d2
7
- data.tar.gz: 3b9f7a303b3807c9726591c8c50547065c6d21f1186e0fb70902412845f0a84513b57f3023fedeb724a03092cf87eaf20323a5eaf589b17ffd28d07d8e6f6ed4
6
+ metadata.gz: de2b4441025568d072934b8c530c6c81f50f659a72347f3e06e4e561d283241c37681ad9425c405054dae83c7838714b8edeb37a298703f8da84ca4ebf337ec3
7
+ data.tar.gz: da7fec9328f798922d3fa1e16f6840d9a48654ae597936a3e3d0fe01c73611e08404ab05c9deabfaadd7ef0a95fa55dba7ce2539b8586e10a7dc65be0c35cb50
@@ -28,6 +28,9 @@
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 PIVOT_POINTS 4
32
+ #define COLLAR_POINTS 5
33
+ #define DUAL_STRIKE_POINTS 6
31
34
  #define DATAPOINTS 200 // data for plotting
32
35
  #define INTERVAL 50
33
36
  #define SIM_LIMIT 196 // 196 + 4 = 200 simulations nedded
@@ -67,8 +70,8 @@ VALUE method_box_muller( VALUE self ) {
67
70
  // main method for running monte carlo simulation from sidekiq worker/outside method
68
71
  VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
69
72
  VALUE MCInputs = rb_ary_shift(args);
70
- rb_p(rb_str_new2("MC Inputs:"));
71
- rb_p(MCInputs);
73
+ // rb_p(rb_str_new2("MC Inputs:"));
74
+ // rb_p(MCInputs);
72
75
 
73
76
  // seed value for rand() function
74
77
  srand( time(0) );
@@ -87,15 +90,19 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
87
90
  int Ko_compare_mult = NUM2INT( rb_hash_aref(MCInputs, rb_str_new2("multiplier")) );
88
91
 
89
92
  // assign leg specific attributes
90
- double *pvs_pos = ( double* ) malloc( SCount * sizeof(double) );
91
- double *pvs_neg = ( double* ) malloc( SCount * sizeof(double) );
92
- double *Ls_array = ( double* ) malloc( NL * sizeof(double) );
93
- double *Ts_array = ( double* ) malloc( NL * sizeof(double) );
94
- double *Ns_array = ( double* ) malloc( NL * sizeof(double) );
95
- double *Xs_array = ( double* ) malloc( NL * sizeof(double) );
96
- double *vs_array = ( double* ) malloc( NL * sizeof(double) );
97
- double *bs_array = ( double* ) malloc( NL * sizeof(double) );
98
- double *DFs_array = ( double* ) malloc( NL * sizeof(double) );
93
+ double *pvs_pos = ( double* ) malloc( SCount * sizeof(double) );
94
+ double *pvs_neg = ( double* ) malloc( SCount * sizeof(double) );
95
+ double *Ls_array = ( double* ) malloc( NL * sizeof(double) );
96
+ double *Ts_array = ( double* ) malloc( NL * sizeof(double) );
97
+ double *Ns_array = ( double* ) malloc( NL * sizeof(double) );
98
+ double *Xs_array = ( double* ) malloc( NL * sizeof(double) );
99
+ double *vs_array = ( double* ) malloc( NL * sizeof(double) );
100
+ double *bs_array = ( double* ) malloc( NL * sizeof(double) );
101
+ double *DFs_array = ( double* ) malloc( NL * sizeof(double) );
102
+ double *Ps_array = ( double* ) malloc( NL * sizeof(double) );
103
+ double *CFs_array = ( double* ) malloc( NL * sizeof(double) );
104
+ double *LSts_array = ( double* ) malloc( NL * sizeof(double) );
105
+ double *USts_array = ( double* ) malloc( NL * sizeof(double) );
99
106
 
100
107
  VALUE Ls = rb_hash_aref(MCInputs, rb_str_new2("leverage_ratios") );
101
108
  VALUE Ts = rb_hash_aref(MCInputs, rb_str_new2("expiration_times") );
@@ -104,6 +111,10 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
104
111
  VALUE vs = rb_hash_aref(MCInputs, rb_str_new2("volatilities") );
105
112
  VALUE bs = rb_hash_aref(MCInputs, rb_str_new2("carry_rates") );
106
113
  VALUE DFs = rb_hash_aref(MCInputs, rb_str_new2("discount_factors") );
114
+ VALUE Ps = rb_hash_aref(MCInputs, rb_str_new2("pivots") );
115
+ VALUE CFs = rb_hash_aref(MCInputs, rb_str_new2("caps") );
116
+ VALUE LSts = rb_hash_aref(MCInputs, rb_str_new2("lower_strikes") );
117
+ VALUE USts = rb_hash_aref(MCInputs, rb_str_new2("upper_strikes") );
107
118
 
108
119
  for (leg = 0; leg < NL; ++leg) {
109
120
  Ls_array[leg] = NUM2DBL( rb_ary_entry(Ls, leg) );
@@ -113,6 +124,10 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
113
124
  vs_array[leg] = NUM2DBL( rb_ary_entry(vs, leg) );
114
125
  bs_array[leg] = NUM2DBL( rb_ary_entry(bs, leg) );
115
126
  DFs_array[leg] = NUM2DBL( rb_ary_entry(DFs, leg) );
127
+ Ps_array[leg] = NUM2DBL( rb_ary_entry(Ps, leg) );
128
+ CFs_array[leg] = NUM2DBL( rb_ary_entry(CFs, leg) );
129
+ LSts_array[leg] = NUM2DBL( rb_ary_entry(LSts, leg) );
130
+ USts_array[leg] = NUM2DBL( rb_ary_entry(USts, leg) );
116
131
  }
117
132
 
118
133
  //
@@ -166,10 +181,28 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
166
181
  // profit if spot is higher than market price
167
182
  profit_loss_dash = ( Spot_dash - ( *( Xs_array + leg ) ) );
168
183
  } else if ( BS == SELL ) {
169
- // profit if spot is lower than market price
170
- profit_loss = ( ( *( Xs_array + leg ) ) - Spot );
171
- // profit if spot is lower than market price
172
- profit_loss_dash = ( ( *( Xs_array + leg ) ) - Spot_dash );
184
+ if ( KType == PIVOT_POINTS ) {
185
+ if ( Spot <= *( Xs_array + leg ) && Spot < *( Ps_array + leg ) ) {
186
+ profit_loss = *( Xs_array + leg ) - Spot;
187
+ } else if ( Spot > *( Xs_array + leg ) && Spot >= *( Ps_array + leg ) ) {
188
+ profit_loss = *( Xs_array + leg ) - Spot;
189
+ } else {
190
+ profit_loss = 0.0;
191
+ }
192
+ // dash
193
+ if ( Spot_dash <= *( Xs_array + leg ) && Spot_dash < *( Ps_array + leg ) ) {
194
+ profit_loss_dash = *( Xs_array + leg ) - Spot_dash;
195
+ } else if ( Spot_dash > *( Xs_array + leg ) && Spot_dash >= *( Ps_array + leg ) ) {
196
+ profit_loss_dash = *( Xs_array + leg ) - Spot_dash;
197
+ } else {
198
+ profit_loss_dash = 0.0;
199
+ }
200
+ } else {
201
+ // profit if spot is lower than market price
202
+ profit_loss = ( ( *( Xs_array + leg ) ) - Spot );
203
+ // profit if spot is lower than market price
204
+ profit_loss_dash = ( ( *( Xs_array + leg ) ) - Spot_dash );
205
+ }
173
206
  }
174
207
 
175
208
  sim[leg] = profit_loss;
@@ -179,7 +212,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
179
212
  // Store spot and spot dash
180
213
  //
181
214
  if( point_pos <= SIM_LIMIT && (sim_count + 2) % INTERVAL == 0 ) {
182
- rb_p(rb_str_new2("Leg:Spots"));
215
+ // rb_p(rb_str_new2("Leg:Spots"));
183
216
  metrics[ point_pos ][ leg ] = Spot;
184
217
  metrics[ point_pos + 2 ][ leg ] = Spot_dash;
185
218
  }
@@ -302,7 +335,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
302
335
  // store and send whichever payoff you want
303
336
  //
304
337
  if( point_pos <= SIM_LIMIT && (sim_count + 2) % INTERVAL == 0 ) {
305
- rb_p(rb_str_new2("Leg:Payoffs"));
338
+ // rb_p(rb_str_new2("Leg:Payoffs"));
306
339
  metrics[ point_pos + 1 ][ leg ] = (sim_pos[leg] + sim_neg[leg]);
307
340
  metrics[ point_pos + 3 ][ leg ] = (sim_dash_pos[leg] + sim_dash_neg[leg]);
308
341
  }
@@ -324,18 +357,18 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
324
357
  // Note: no limit condition here
325
358
  //
326
359
  if( (sim_count + 2) % INTERVAL == 0 ) {
327
- rb_p(rb_str_new2("T:"));
328
- rb_p(INT2NUM(point_pos));
360
+ // rb_p(rb_str_new2("T:"));
361
+ // rb_p(INT2NUM(point_pos));
329
362
  point_pos += 4;
330
363
  }
331
364
  }
332
365
  // run simulations loop
333
- rb_p(rb_str_new2("Simulation loop done"));
366
+ // rb_p(rb_str_new2("Simulation loop done"));
334
367
 
335
368
  //
336
369
  // sum all final +ve and -ve payoffs
337
370
  //
338
- rb_p(rb_str_new2("Calculating final PVs"));
371
+ // rb_p(rb_str_new2("Calculating final PVs"));
339
372
  for(sim_count = 0; sim_count < SCount; ++sim_count) {
340
373
  pvs_pos_sum += *(pvs_pos + sim_count);
341
374
  pvs_neg_sum += *(pvs_neg + sim_count);
@@ -344,7 +377,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
344
377
  //
345
378
  // free dynamically alloted heap memory
346
379
  //
347
- rb_p(rb_str_new2("Free allocated arrays"));
380
+ // rb_p(rb_str_new2("Free allocated arrays"));
348
381
  free(pvs_pos);
349
382
  free(pvs_neg);
350
383
  free(Ls_array);
@@ -358,7 +391,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
358
391
  //
359
392
  // return both payoffs
360
393
  //
361
- rb_p(rb_str_new2("Converting metrics"));
394
+ // rb_p(rb_str_new2("Converting metrics"));
362
395
  VALUE final_metrics = rb_ary_new();
363
396
  for(metric = 0; metric < DATAPOINTS; metric++) {
364
397
  VALUE leg_metrics = rb_ary_new();
@@ -370,7 +403,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
370
403
  rb_ary_push(final_metrics, leg_metrics);
371
404
  }
372
405
 
373
- rb_p(rb_str_new2("Generating output hash"));
406
+ // rb_p(rb_str_new2("Generating output hash"));
374
407
  VALUE final_pvs = rb_hash_new();
375
408
  rb_hash_aset(final_pvs, rb_str_new2("positive_pv"), DBL2NUM( pvs_pos_sum / SCount ));
376
409
  rb_hash_aset(final_pvs, rb_str_new2("negative_pv"), DBL2NUM( pvs_neg_sum / SCount ));
data/lib/.DS_Store ADDED
Binary file
@@ -4,11 +4,11 @@ require "tarf_monte_carlo/version"
4
4
  # my_malloc/my_malloc will be the shared object built when the gem is
5
5
  # installed then copied into lib/my_malloc/.
6
6
 
7
- # begin
8
- # require "tarf_monte_carlo/#{RUBY_VERSION[/\d+.\d+/]}/tarf_monte_carlo"
9
- # rescue LoadError
10
- # require "tarf_monte_carlo/tarf_monte_carlo"
11
- # end
7
+ begin
8
+ require "tarf_monte_carlo/#{RUBY_VERSION[/\d+.\d+/]}/tarf_monte_carlo"
9
+ rescue LoadError
10
+ require "tarf_monte_carlo/tarf_monte_carlo"
11
+ end
12
12
 
13
13
  module TarfMonteCarlo
14
14
  # Your code goes here...
@@ -3,5 +3,5 @@
3
3
  # gem yank tarf_monte_carlo -v 2.3
4
4
 
5
5
  module TarfMonteCarlo
6
- VERSION = "3.7"
6
+ VERSION = "3.11"
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.7'
4
+ version: '3.11'
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-04-06 00:00:00.000000000 Z
11
+ date: 2020-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -116,6 +116,7 @@ files:
116
116
  - bin/setup
117
117
  - ext/tarf_monte_carlo/extconf.rb
118
118
  - ext/tarf_monte_carlo/tarf_monte_carlo.c
119
+ - lib/.DS_Store
119
120
  - lib/tarf_monte_carlo.rb
120
121
  - lib/tarf_monte_carlo/version.rb
121
122
  - tarf_monte_carlo.gemspec