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 +4 -4
- data/ext/tarf_monte_carlo/tarf_monte_carlo.c +43 -19
- data/lib/tarf_monte_carlo/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92ba4ec2f8c25a6704d3e7388a8a3e243ff51693b8ea1966d57b67b42d09514f
|
4
|
+
data.tar.gz: f80d07fdca106e815b442561331e1cfce8a7772e5e8b9bfb830cf6b043432fcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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(
|
199
|
-
for( metric = 0; 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]
|
422
|
-
metrics[1][point_pos]
|
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]
|
444
|
-
metrics[1][point_pos]
|
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
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
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 <
|
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) ?
|
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
|
}
|
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.
|
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-
|
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.
|
143
|
+
rubygems_version: 3.0.6
|
144
144
|
signing_key:
|
145
145
|
specification_version: 4
|
146
146
|
summary: Monte Carlo Simulation.
|