tarf_monte_carlo 3.15.2 → 3.19
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 +33 -12
- data/lib/tarf_monte_carlo/version.rb +2 -2
- 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: ebf0762f6765e8ae554a23e3e939185ed44968b85b3fbd22a2a9062c738fd523
|
|
4
|
+
data.tar.gz: 974090ba8593ee28ec2375362edea36cc830cc7db18693b2541864d25139fb33
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c237e5573ef3f7b3f1c4113f508c128fd3f8c9c5fb0e703545d08489a3bc3d57ebf69a8e64bb87c66b1df38218c90d13a93990a5afe17b4b30c70cf054c7323e
|
|
7
|
+
data.tar.gz: 62723066875cd488f090fb9a7285a8ef29211330744ae35a428d20dcf41c9f818a90d46dc330725af5b8d18e31c076182a8fe31bce6ff99901620d1de3723167
|
|
@@ -28,9 +28,19 @@
|
|
|
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
|
+
|
|
31
32
|
#define PIVOT_POINTS 4
|
|
32
33
|
#define COLLAR_POINTS 5
|
|
33
|
-
#define
|
|
34
|
+
#define DOUBLE_STRIKE_POINTS 6
|
|
35
|
+
|
|
36
|
+
#define PIVOT_ABSOLUTE 7
|
|
37
|
+
#define COLLAR_ABSOLUTE 8
|
|
38
|
+
#define DOUBLE_STRIKE_ABSOLUTE 9
|
|
39
|
+
|
|
40
|
+
#define PIVOT_LEGS 10
|
|
41
|
+
#define COLLAR_LEGS 11
|
|
42
|
+
#define DOUBLE_STRIKE_LEGS 12
|
|
43
|
+
|
|
34
44
|
#define DATAPOINTS 200 // data for plotting
|
|
35
45
|
#define INTERVAL 50
|
|
36
46
|
#define SIM_LIMIT 196 // 196 + 4 = 200 simulations nedded
|
|
@@ -88,6 +98,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
88
98
|
int KType = NUM2INT( rb_hash_aref(MCInputs, rb_str_new2("knockout_type")) );
|
|
89
99
|
double S = NUM2DBL( rb_hash_aref(MCInputs, rb_str_new2("spot_rate")) );
|
|
90
100
|
int Ko_compare_mult = NUM2INT( rb_hash_aref(MCInputs, rb_str_new2("multiplier")) );
|
|
101
|
+
int ConvertNotional = NUM2INT( rb_hash_aref(MCInputs, rb_str_new2("convert_notional")) );
|
|
91
102
|
|
|
92
103
|
// assign leg specific attributes
|
|
93
104
|
double *pvs_pos = ( double* ) malloc( SCount * sizeof(double) );
|
|
@@ -126,15 +137,15 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
126
137
|
DFs_array[leg] = NUM2DBL( rb_ary_entry(DFs, leg) );
|
|
127
138
|
}
|
|
128
139
|
// extra tarf structures
|
|
129
|
-
if ( KType == PIVOT_POINTS ) {
|
|
140
|
+
if ( KType == PIVOT_POINTS || KType == PIVOT_ABSOLUTE || KType == PIVOT_LEGS ) {
|
|
130
141
|
for (leg = 0; leg < NL; ++leg) {
|
|
131
142
|
Ps_array[leg] = NUM2DBL( rb_ary_entry(Ps, leg) );
|
|
132
143
|
}
|
|
133
|
-
} else if ( KType == COLLAR_POINTS ) {
|
|
144
|
+
} else if ( KType == COLLAR_POINTS || KType == COLLAR_ABSOLUTE || KType == COLLAR_LEGS ) {
|
|
134
145
|
for (leg = 0; leg < NL; ++leg) {
|
|
135
146
|
CFs_array[leg] = NUM2DBL( rb_ary_entry(CFs, leg) );
|
|
136
147
|
}
|
|
137
|
-
} else if ( KType ==
|
|
148
|
+
} else if ( KType == DOUBLE_STRIKE_POINTS || KType == DOUBLE_STRIKE_ABSOLUTE || KType == DOUBLE_STRIKE_LEGS) {
|
|
138
149
|
for (leg = 0; leg < NL; ++leg) {
|
|
139
150
|
Ps_array[leg] = NUM2DBL( rb_ary_entry(Ps, leg) );
|
|
140
151
|
LSts_array[leg] = NUM2DBL( rb_ary_entry(LSts, leg) );
|
|
@@ -188,7 +199,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
188
199
|
Spot_dash = Spot_dash * exp( drift + vSqrdt * eps_dash );
|
|
189
200
|
|
|
190
201
|
// Payoff of Dual strike points is independent of direction
|
|
191
|
-
if ( KType ==
|
|
202
|
+
if ( KType == DOUBLE_STRIKE_POINTS || KType == DOUBLE_STRIKE_ABSOLUTE || KType == DOUBLE_STRIKE_LEGS ) {
|
|
192
203
|
if ( Spot < *( LSts_array + leg ) ) {
|
|
193
204
|
profit_loss = Spot - (*( LSts_array + leg ));
|
|
194
205
|
} else if(Spot > *( USts_array + leg )){
|
|
@@ -198,6 +209,16 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
198
209
|
} else {
|
|
199
210
|
profit_loss = (*( USts_array + leg )) - Spot;
|
|
200
211
|
}
|
|
212
|
+
|
|
213
|
+
if (ConvertNotional == 1){
|
|
214
|
+
if(Spot < *( Ps_array + leg )){
|
|
215
|
+
Ns_array[leg] = *(Ns_array + leg) / *( LSts_array + leg );
|
|
216
|
+
} else {
|
|
217
|
+
Ns_array[leg] = *(Ns_array + leg) / *( USts_array + leg );
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
rb_p(Ns_array[leg]);
|
|
221
|
+
|
|
201
222
|
// dash
|
|
202
223
|
if ( Spot_dash < *( LSts_array + leg ) ) {
|
|
203
224
|
profit_loss_dash = Spot_dash - (*( LSts_array + leg ));
|
|
@@ -209,7 +230,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
209
230
|
profit_loss_dash = (*( USts_array + leg )) - Spot_dash;
|
|
210
231
|
}
|
|
211
232
|
} else if ( BS == BUY ) {
|
|
212
|
-
if ( KType == PIVOT_POINTS ) {
|
|
233
|
+
if ( KType == PIVOT_POINTS || KType == PIVOT_ABSOLUTE || KType == PIVOT_LEGS ) {
|
|
213
234
|
if ( *( Xs_array + leg ) > Spot && Spot > *( Ps_array + leg ) ) {
|
|
214
235
|
profit_loss = 0.0;
|
|
215
236
|
} else {
|
|
@@ -221,7 +242,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
221
242
|
} else {
|
|
222
243
|
profit_loss_dash = Spot_dash - (*( Xs_array + leg ));
|
|
223
244
|
}
|
|
224
|
-
} else if ( KType == COLLAR_POINTS ) {
|
|
245
|
+
} else if ( KType == COLLAR_POINTS || KType == COLLAR_ABSOLUTE || KType == COLLAR_LEGS ) {
|
|
225
246
|
if ( *( Xs_array + leg ) > Spot && Spot > *( CFs_array + leg ) ) {
|
|
226
247
|
profit_loss = 0.0;
|
|
227
248
|
} else if(Spot <= *( CFs_array + leg )){
|
|
@@ -244,7 +265,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
244
265
|
profit_loss_dash = ( Spot_dash - ( *( Xs_array + leg ) ) );
|
|
245
266
|
}
|
|
246
267
|
} else if ( BS == SELL ) {
|
|
247
|
-
if ( KType == PIVOT_POINTS ) {
|
|
268
|
+
if ( KType == PIVOT_POINTS || KType == PIVOT_ABSOLUTE || KType == PIVOT_LEGS ) {
|
|
248
269
|
if ( *( Xs_array + leg ) < Spot && Spot < *( Ps_array + leg ) ) {
|
|
249
270
|
profit_loss = 0.0;
|
|
250
271
|
} else {
|
|
@@ -256,7 +277,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
256
277
|
} else {
|
|
257
278
|
profit_loss_dash = ( ( *( Xs_array + leg ) ) - Spot_dash );
|
|
258
279
|
}
|
|
259
|
-
} else if ( KType == COLLAR_POINTS ) {
|
|
280
|
+
} else if ( KType == COLLAR_POINTS || KType == COLLAR_ABSOLUTE || KType == COLLAR_LEGS ) {
|
|
260
281
|
if ( *( Xs_array + leg ) < Spot && Spot < *( CFs_array + leg ) ) {
|
|
261
282
|
profit_loss = 0.0;
|
|
262
283
|
} else if(Spot >= *( CFs_array + leg )){
|
|
@@ -302,7 +323,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
302
323
|
// legs loop end
|
|
303
324
|
// start from the Knock value
|
|
304
325
|
double ko_so_far = K, ko_so_far_dash = K;
|
|
305
|
-
if( KType == ABSOLUTE ) {
|
|
326
|
+
if( KType == ABSOLUTE || KType == PIVOT_ABSOLUTE || KType == COLLAR_ABSOLUTE || KType == DOUBLE_STRIKE_ABSOLUTE ) {
|
|
306
327
|
for( leg = 0; leg < NL; ++leg ) {
|
|
307
328
|
// simulation normal
|
|
308
329
|
if( ko_so_far > 0.0 ) {
|
|
@@ -342,7 +363,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
342
363
|
}
|
|
343
364
|
}
|
|
344
365
|
}
|
|
345
|
-
} else if( KType == POINTS || KType == PIVOT_POINTS || KType == COLLAR_POINTS || KType ==
|
|
366
|
+
} else if( KType == POINTS || KType == PIVOT_POINTS || KType == COLLAR_POINTS || KType == DOUBLE_STRIKE_POINTS ) {
|
|
346
367
|
for( leg = 0; leg < NL; ++leg ) {
|
|
347
368
|
// simulation normal
|
|
348
369
|
if ( ko_so_far > 0.0 ) {
|
|
@@ -376,7 +397,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
|
376
397
|
}
|
|
377
398
|
}
|
|
378
399
|
}
|
|
379
|
-
} else if( KType == LEGS ) {
|
|
400
|
+
} else if( KType == LEGS || KType == PIVOT_LEGS || KType == COLLAR_LEGS || KType == DOUBLE_STRIKE_LEGS ) {
|
|
380
401
|
for( leg = 0; leg < NL; ++leg ) {
|
|
381
402
|
// simulation normal
|
|
382
403
|
if ( ko_so_far > 0.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.19'
|
|
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-09-
|
|
11
|
+
date: 2020-09-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|