tarf_monte_carlo 3.15 → 3.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/tarf_monte_carlo/tarf_monte_carlo.c +36 -18
- 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: dfddf29d3a8c0d3029234c9acba98d0579c2cd035395594b730b74dadd9353ff
|
4
|
+
data.tar.gz: ee157914ed8faedc35096514802b25bd89eebdb6485300ad9e6762563ee65a1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1645aef91181a04b99a91bf8ae9bfb983b82b0cfd27b2932914042481642ca1f77a096f65def64ab94f71f7c6876a5d89fc03f8125a9115e952c3058125f62a
|
7
|
+
data.tar.gz: 341783f3006b2c2d81181b3a1f7ca15c70550233e28991da9561f85dd60716a9190f6f126d6b2cf811841f15e2992f78b9c26d72383255c0b2a2c39c8bfcc066
|
@@ -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,15 +199,23 @@ 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 )){
|
195
206
|
profit_loss = (*( USts_array + leg ) - Spot);
|
196
207
|
} else if(Spot >= *( LSts_array + leg ) && (Spot < *(Ps_array + leg))) {
|
197
|
-
profit_loss = (*( LSts_array + leg ))
|
208
|
+
profit_loss = Spot - (*( LSts_array + leg ));
|
198
209
|
} else {
|
199
|
-
profit_loss =
|
210
|
+
profit_loss = (*( USts_array + leg )) - Spot;
|
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
|
+
}
|
200
219
|
}
|
201
220
|
// dash
|
202
221
|
if ( Spot_dash < *( LSts_array + leg ) ) {
|
@@ -204,13 +223,12 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
204
223
|
} else if(Spot_dash > *( USts_array + leg )){
|
205
224
|
profit_loss_dash = (*( USts_array + leg ) - Spot_dash);
|
206
225
|
} else if(Spot_dash >= *( LSts_array + leg ) && (Spot_dash < *(Ps_array + leg))) {
|
207
|
-
profit_loss_dash = (*( LSts_array + leg ))
|
226
|
+
profit_loss_dash = Spot_dash - (*( LSts_array + leg ));
|
208
227
|
} else {
|
209
|
-
profit_loss_dash =
|
228
|
+
profit_loss_dash = (*( USts_array + leg )) - Spot_dash;
|
210
229
|
}
|
211
|
-
}
|
212
|
-
|
213
|
-
if ( KType == PIVOT_POINTS ) {
|
230
|
+
} else if ( BS == BUY ) {
|
231
|
+
if ( KType == PIVOT_POINTS || KType == PIVOT_ABSOLUTE || KType == PIVOT_LEGS ) {
|
214
232
|
if ( *( Xs_array + leg ) > Spot && Spot > *( Ps_array + leg ) ) {
|
215
233
|
profit_loss = 0.0;
|
216
234
|
} else {
|
@@ -222,7 +240,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
222
240
|
} else {
|
223
241
|
profit_loss_dash = Spot_dash - (*( Xs_array + leg ));
|
224
242
|
}
|
225
|
-
} else if ( KType == COLLAR_POINTS ) {
|
243
|
+
} else if ( KType == COLLAR_POINTS || KType == COLLAR_ABSOLUTE || KType == COLLAR_LEGS ) {
|
226
244
|
if ( *( Xs_array + leg ) > Spot && Spot > *( CFs_array + leg ) ) {
|
227
245
|
profit_loss = 0.0;
|
228
246
|
} else if(Spot <= *( CFs_array + leg )){
|
@@ -245,7 +263,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
245
263
|
profit_loss_dash = ( Spot_dash - ( *( Xs_array + leg ) ) );
|
246
264
|
}
|
247
265
|
} else if ( BS == SELL ) {
|
248
|
-
if ( KType == PIVOT_POINTS ) {
|
266
|
+
if ( KType == PIVOT_POINTS || KType == PIVOT_ABSOLUTE || KType == PIVOT_LEGS ) {
|
249
267
|
if ( *( Xs_array + leg ) < Spot && Spot < *( Ps_array + leg ) ) {
|
250
268
|
profit_loss = 0.0;
|
251
269
|
} else {
|
@@ -257,7 +275,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
257
275
|
} else {
|
258
276
|
profit_loss_dash = ( ( *( Xs_array + leg ) ) - Spot_dash );
|
259
277
|
}
|
260
|
-
} else if ( KType == COLLAR_POINTS ) {
|
278
|
+
} else if ( KType == COLLAR_POINTS || KType == COLLAR_ABSOLUTE || KType == COLLAR_LEGS ) {
|
261
279
|
if ( *( Xs_array + leg ) < Spot && Spot < *( CFs_array + leg ) ) {
|
262
280
|
profit_loss = 0.0;
|
263
281
|
} else if(Spot >= *( CFs_array + leg )){
|
@@ -303,7 +321,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
303
321
|
// legs loop end
|
304
322
|
// start from the Knock value
|
305
323
|
double ko_so_far = K, ko_so_far_dash = K;
|
306
|
-
if( KType == ABSOLUTE ) {
|
324
|
+
if( KType == ABSOLUTE || KType == PIVOT_ABSOLUTE || KType == COLLAR_ABSOLUTE || KType == DOUBLE_STRIKE_ABSOLUTE ) {
|
307
325
|
for( leg = 0; leg < NL; ++leg ) {
|
308
326
|
// simulation normal
|
309
327
|
if( ko_so_far > 0.0 ) {
|
@@ -343,7 +361,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
343
361
|
}
|
344
362
|
}
|
345
363
|
}
|
346
|
-
} else if( KType == POINTS || KType == PIVOT_POINTS || KType == COLLAR_POINTS || KType ==
|
364
|
+
} else if( KType == POINTS || KType == PIVOT_POINTS || KType == COLLAR_POINTS || KType == DOUBLE_STRIKE_POINTS ) {
|
347
365
|
for( leg = 0; leg < NL; ++leg ) {
|
348
366
|
// simulation normal
|
349
367
|
if ( ko_so_far > 0.0 ) {
|
@@ -377,7 +395,7 @@ VALUE method_run_monte_carlo( VALUE self, VALUE args ) {
|
|
377
395
|
}
|
378
396
|
}
|
379
397
|
}
|
380
|
-
} else if( KType == LEGS ) {
|
398
|
+
} else if( KType == LEGS || KType == PIVOT_LEGS || KType == COLLAR_LEGS || KType == DOUBLE_STRIKE_LEGS ) {
|
381
399
|
for( leg = 0; leg < NL; ++leg ) {
|
382
400
|
// simulation normal
|
383
401
|
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.17'
|
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
|