tarf_monte_carlo 3.44 → 3.50
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 +32 -15
- 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: d378d28787178efe7bf21a742d34f732738ca1dd0d6cc88aa82726676fb1c767
|
|
4
|
+
data.tar.gz: 51ccc1a2352a018d9db80dd1b95acb51739c8ff51e6e80f73a8799444f381b21
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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(
|
|
199
|
-
for( metric = 0; 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]
|
|
422
|
-
metrics[1][point_pos]
|
|
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]
|
|
449
|
-
metrics[1][point_pos]
|
|
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
|
-
|
|
585
|
-
|
|
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 <
|
|
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) ?
|
|
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
|
}
|
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.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-
|
|
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.
|