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 +4 -4
- data/ext/tarf_monte_carlo/tarf_monte_carlo.c +49 -4
- 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: e0d7cdafaf4865a66b7bbe6452a9ad3dd90c3ced070778cd288bf304cb3e2417
|
4
|
+
data.tar.gz: 79894b25d74fc53dfe3151009122e846323b18e31ba4ab71f4cced7edcad6eae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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;
|
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.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-
|
11
|
+
date: 2020-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|