tarf_monte_carlo 3.15.2 → 3.19
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 +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
|