tarf_monte_carlo 3.64 → 3.69
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 +24 -10
- data/lib/tarf_monte_carlo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a09821b8f49b2435d5faac86b35b58e9514de07dcf70200c99d9fe8c2a496cd1
|
|
4
|
+
data.tar.gz: 6f19dd72e7a81ba7ed41f8e40e29a57965acf4e4b5ee78cb1fb2f931d5ae3270
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3fb2c088e7cd659ebae7db0b3dadb0ddac9e58661ca70383df086ff550f1e7387f384c29f66f216d13b9e0b6f073770521db72815544ac1aa401ac84476a8b93
|
|
7
|
+
data.tar.gz: c686b6a2e6a347ffcb62a293f7b1b39beafae1755b31ab4d9a540b1b8f0b9ce16a3b0ae00ec43447214b4247229d58ea15ae996ee5467205432be179f9fccdb9
|
|
@@ -211,6 +211,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
211
211
|
//
|
|
212
212
|
// first create a 1-D array of pointers, and then, for each array entry, create another 1-D array.
|
|
213
213
|
//
|
|
214
|
+
double testing[SCount];
|
|
214
215
|
double **metrics;
|
|
215
216
|
if (barrier_variations(KType)){
|
|
216
217
|
metrics = ( double** ) malloc( BARRIER_DP * sizeof(double*) );
|
|
@@ -234,6 +235,10 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
234
235
|
|
|
235
236
|
// run simulations loop
|
|
236
237
|
for( sim_count = 0; sim_count < SCount; sim_count += 2 ) {
|
|
238
|
+
|
|
239
|
+
testing[sim_count] = -1;
|
|
240
|
+
testing[sim_count+1] = -1;
|
|
241
|
+
|
|
237
242
|
// initial spot rate for each iteration would be current spot rate
|
|
238
243
|
double Spot = S, Spot_dash = S;
|
|
239
244
|
double sim[NL], sim_pos[NL], sim_neg[NL], sim_dash[NL], sim_dash_pos[NL], sim_dash_neg[NL];
|
|
@@ -283,14 +288,14 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
283
288
|
profit_loss_dash = Spot_dash;
|
|
284
289
|
|
|
285
290
|
// Both Until KI & Exp
|
|
286
|
-
if ( ((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign
|
|
291
|
+
if ( (((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign) <= 0) && (((*(Barrier2_array + leg) - *(Xs_array + leg)) * cp_sign) >= 0) ){
|
|
287
292
|
if ((knockedLeg == -1) && ((*(Barrier_array + leg) - Spot) * cp_sign >= 0)){ knockedLeg = leg; }
|
|
288
293
|
if ((knockedLeg2 == -1) && ((*(Barrier2_array + leg) - Spot) * cp_sign <= 0)){ knockedLeg2 = leg; }
|
|
289
294
|
|
|
290
295
|
if ((knockedLeg_dash == -1) && ((*(Barrier_array + leg) - Spot_dash) * cp_sign >= 0)){ knockedLeg_dash = leg; }
|
|
291
296
|
if ((knockedLeg2_dash == -1) && ((*(Barrier2_array + leg) - Spot_dash) * cp_sign <= 0)){ knockedLeg2_dash = leg; }
|
|
292
297
|
}
|
|
293
|
-
else if( ((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign
|
|
298
|
+
else if( (((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign) >= 0) && (((*(Barrier2_array + leg) - *(Xs_array + leg)) * cp_sign) <= 0) ){
|
|
294
299
|
if ((knockedLeg == -1) && ((*(Barrier_array + leg) - Spot) * cp_sign <= 0)){ knockedLeg = leg; }
|
|
295
300
|
if ((knockedLeg2 == -1) && ((*(Barrier2_array + leg) - Spot) * cp_sign >= 0)){ knockedLeg2 = leg; }
|
|
296
301
|
|
|
@@ -298,7 +303,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
298
303
|
if ((knockedLeg2_dash == -1) && ((*(Barrier2_array + leg) - Spot_dash) * cp_sign >= 0)){ knockedLeg2_dash = leg; }
|
|
299
304
|
}
|
|
300
305
|
// Only Until Exp
|
|
301
|
-
else if( (KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP) && ((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign
|
|
306
|
+
else if( (KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP) && (((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign) >= 0) && (((*(Barrier2_array + leg) - *(Barrier_array + leg)) * cp_sign) >= 0) ){
|
|
302
307
|
if ((knockedLeg == -1) && ((*(Barrier_array + leg) - Spot) * cp_sign <= 0)){ knockedLeg = leg; }
|
|
303
308
|
if ((knockedLeg2 == -1) && ((*(Barrier2_array + leg) - Spot) * cp_sign <= 0)){ knockedLeg2 = leg; }
|
|
304
309
|
|
|
@@ -306,7 +311,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
306
311
|
if ((knockedLeg2_dash == -1) && ((*(Barrier2_array + leg) - Spot_dash) * cp_sign <= 0)){ knockedLeg2_dash = leg; }
|
|
307
312
|
}
|
|
308
313
|
|
|
309
|
-
else if( (KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP) && ((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign
|
|
314
|
+
else if( (KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP) && (((*(Barrier_array + leg) - *(Xs_array + leg)) * cp_sign) <= 0) && (((*(Barrier2_array + leg) - *(Barrier_array + leg)) * cp_sign) <= 0) ){
|
|
310
315
|
if ((knockedLeg == -1) && ((*(Barrier_array + leg) - Spot) * cp_sign >= 0)){ knockedLeg = leg; }
|
|
311
316
|
if ((knockedLeg2 == -1) && ((*(Barrier2_array + leg) - Spot) * cp_sign >= 0)){ knockedLeg2 = leg; }
|
|
312
317
|
|
|
@@ -555,13 +560,13 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
555
560
|
}
|
|
556
561
|
} else if(KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_EXP){
|
|
557
562
|
if(knockedLeg2 >= 0){
|
|
558
|
-
sim_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array +
|
|
563
|
+
sim_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + knockedLeg2 ) ), sim[NL-1], dir_sign);
|
|
559
564
|
} else if(knockedLeg >= 0) {
|
|
560
565
|
double equivalent_notional = *( Ns_array + knockedLeg );
|
|
561
566
|
sim_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg) ) ), sim[NL-1], cp_sign, dir_sign, equivalent_notional);
|
|
562
567
|
}
|
|
563
568
|
if(knockedLeg2_dash >= 0){
|
|
564
|
-
sim_dash_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array +
|
|
569
|
+
sim_dash_pos[NL-1] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + knockedLeg2 ) ), sim_dash[NL-1], dir_sign);
|
|
565
570
|
} else if(knockedLeg_dash >= 0) {
|
|
566
571
|
double equivalent_notional = *( Ns_array + knockedLeg_dash );
|
|
567
572
|
sim_dash_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg_dash) ) ), sim_dash[NL-1], cp_sign, dir_sign, equivalent_notional);
|
|
@@ -576,15 +581,18 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
576
581
|
metrics[3][point_pos+1] = knockedLeg_dash;
|
|
577
582
|
}
|
|
578
583
|
} else if(KType == FX_AMERICAN_BARRIER_KIKO_UNTIL_KI){
|
|
584
|
+
testing[sim_count] = knockedLeg2;
|
|
585
|
+
testing[sim_count + 1] = knockedLeg2_dash;
|
|
586
|
+
|
|
579
587
|
if(knockedLeg >= 0 && knockedLeg2 >= 0){
|
|
580
588
|
if(knockedLeg < knockedLeg2){
|
|
581
589
|
double equivalent_notional = *( Ns_array + knockedLeg );
|
|
582
590
|
sim_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg) ) ), sim[NL-1], cp_sign, dir_sign, equivalent_notional);
|
|
583
591
|
} else {
|
|
584
|
-
sim_pos[knockedLeg2] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array +
|
|
592
|
+
sim_pos[knockedLeg2] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + knockedLeg2 ) ), sim[knockedLeg2], dir_sign);
|
|
585
593
|
}
|
|
586
594
|
} else if(knockedLeg2 >= 0){
|
|
587
|
-
sim_pos[knockedLeg2] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array +
|
|
595
|
+
sim_pos[knockedLeg2] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + knockedLeg2 ) ), sim[knockedLeg2], dir_sign);
|
|
588
596
|
} else if(knockedLeg >= 0) {
|
|
589
597
|
double equivalent_notional = *( Ns_array + knockedLeg );
|
|
590
598
|
sim_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg) ) ), sim[NL-1], cp_sign, dir_sign, equivalent_notional);
|
|
@@ -595,10 +603,10 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
595
603
|
double equivalent_notional = *( Ns_array + knockedLeg_dash );
|
|
596
604
|
sim_dash_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg_dash) ) ), sim_dash[NL-1], cp_sign, dir_sign, equivalent_notional);
|
|
597
605
|
} else {
|
|
598
|
-
sim_dash_pos[knockedLeg2_dash] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array +
|
|
606
|
+
sim_dash_pos[knockedLeg2_dash] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + knockedLeg2_dash ) ), sim_dash[knockedLeg2_dash], dir_sign);
|
|
599
607
|
}
|
|
600
608
|
} else if(knockedLeg2_dash >= 0){
|
|
601
|
-
sim_dash_pos[knockedLeg2_dash] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array +
|
|
609
|
+
sim_dash_pos[knockedLeg2_dash] = get_equivalent_rebate(rebate_conversion_sign, ( *( Rebate_array + knockedLeg2_dash ) ), sim_dash[knockedLeg2_dash], dir_sign);
|
|
602
610
|
} else if(knockedLeg_dash >= 0) {
|
|
603
611
|
double equivalent_notional = *( Ns_array + knockedLeg_dash );
|
|
604
612
|
sim_dash_pos[NL-1] = european_payoff(( *( Xs_array + (knockedLeg_dash) ) ), sim_dash[NL-1], cp_sign, dir_sign, equivalent_notional);
|
|
@@ -839,12 +847,18 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
839
847
|
}
|
|
840
848
|
}
|
|
841
849
|
|
|
850
|
+
VALUE testing_data = rb_ary_new();
|
|
851
|
+
for(metric = 0; metric < SCount; metric++) {
|
|
852
|
+
rb_ary_push(testing_data, DBL2NUM(testing[metric]));
|
|
853
|
+
}
|
|
854
|
+
|
|
842
855
|
// rb_p(rb_str_new2("Generating output hash"));
|
|
843
856
|
VALUE final_pvs = rb_hash_new();
|
|
844
857
|
rb_hash_aset(final_pvs, rb_str_new2("positive_pv"), DBL2NUM( pvs_pos_sum / SCount ));
|
|
845
858
|
rb_hash_aset(final_pvs, rb_str_new2("negative_pv"), DBL2NUM( pvs_neg_sum / SCount ));
|
|
846
859
|
rb_hash_aset(final_pvs, rb_str_new2("total_pv"), DBL2NUM( (pvs_neg_sum + pvs_pos_sum) / SCount ));
|
|
847
860
|
rb_hash_aset(final_pvs, rb_str_new2("metrics"), final_metrics);
|
|
861
|
+
rb_hash_aset(final_pvs, rb_str_new2("testing"), testing_data);
|
|
848
862
|
|
|
849
863
|
//
|
|
850
864
|
// free your arrays from memory once you're done using them
|
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.69'
|
|
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-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|