option_lab 0.1.0

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.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +139 -0
  4. data/.yard/hooks/before_generate.rb +7 -0
  5. data/.yardopts +11 -0
  6. data/Gemfile +26 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +180 -0
  9. data/Rakefile +44 -0
  10. data/docs/OptionLab/BinomialTree.html +1271 -0
  11. data/docs/OptionLab/BjerksundStensland.html +2022 -0
  12. data/docs/OptionLab/BlackScholes.html +2388 -0
  13. data/docs/OptionLab/Engine.html +1716 -0
  14. data/docs/OptionLab/Models/AmericanModelInputs.html +937 -0
  15. data/docs/OptionLab/Models/ArrayInputs.html +463 -0
  16. data/docs/OptionLab/Models/BaseModel.html +223 -0
  17. data/docs/OptionLab/Models/BinomialModelInputs.html +1161 -0
  18. data/docs/OptionLab/Models/BlackScholesInfo.html +967 -0
  19. data/docs/OptionLab/Models/BlackScholesModelInputs.html +851 -0
  20. data/docs/OptionLab/Models/ClosedPosition.html +445 -0
  21. data/docs/OptionLab/Models/EngineData.html +2523 -0
  22. data/docs/OptionLab/Models/EngineDataResults.html +435 -0
  23. data/docs/OptionLab/Models/Inputs.html +2241 -0
  24. data/docs/OptionLab/Models/LaplaceInputs.html +777 -0
  25. data/docs/OptionLab/Models/Option.html +736 -0
  26. data/docs/OptionLab/Models/Outputs.html +1753 -0
  27. data/docs/OptionLab/Models/PoPOutputs.html +645 -0
  28. data/docs/OptionLab/Models/PricingResult.html +848 -0
  29. data/docs/OptionLab/Models/Stock.html +583 -0
  30. data/docs/OptionLab/Models/TreeVisualization.html +688 -0
  31. data/docs/OptionLab/Models.html +251 -0
  32. data/docs/OptionLab/Plotting.html +548 -0
  33. data/docs/OptionLab/Support.html +2884 -0
  34. data/docs/OptionLab/Utils.html +619 -0
  35. data/docs/OptionLab.html +133 -0
  36. data/docs/_index.html +376 -0
  37. data/docs/class_list.html +54 -0
  38. data/docs/css/common.css +1 -0
  39. data/docs/css/full_list.css +58 -0
  40. data/docs/css/style.css +503 -0
  41. data/docs/file.LICENSE.html +70 -0
  42. data/docs/file.README.html +263 -0
  43. data/docs/file_list.html +64 -0
  44. data/docs/frames.html +22 -0
  45. data/docs/index.html +263 -0
  46. data/docs/js/app.js +344 -0
  47. data/docs/js/full_list.js +242 -0
  48. data/docs/js/jquery.js +4 -0
  49. data/docs/method_list.html +1974 -0
  50. data/docs/top-level-namespace.html +110 -0
  51. data/examples/american_options.rb +163 -0
  52. data/examples/covered_call.rb +76 -0
  53. data/lib/option_lab/binomial_tree.rb +238 -0
  54. data/lib/option_lab/bjerksund_stensland.rb +276 -0
  55. data/lib/option_lab/black_scholes.rb +323 -0
  56. data/lib/option_lab/engine.rb +492 -0
  57. data/lib/option_lab/models.rb +768 -0
  58. data/lib/option_lab/plotting.rb +182 -0
  59. data/lib/option_lab/support.rb +471 -0
  60. data/lib/option_lab/utils.rb +107 -0
  61. data/lib/option_lab/version.rb +5 -0
  62. data/lib/option_lab.rb +134 -0
  63. data/option_lab.gemspec +43 -0
  64. metadata +207 -0
@@ -0,0 +1,2884 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Module: OptionLab::Support
8
+
9
+ &mdash; OptionLab Documentation
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="../css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="../css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "OptionLab::Support";
19
+ relpath = '../';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="../js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="../class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="../_index.html">Index (S)</a> &raquo;
40
+ <span class='title'><span class='object_link'><a href="../OptionLab.html" title="OptionLab (module)">OptionLab</a></span></span>
41
+ &raquo;
42
+ <span class="title">Support</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="../class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Module: OptionLab::Support
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ <dl>
80
+ <dt>Defined in:</dt>
81
+ <dd>lib/option_lab/support.rb</dd>
82
+ </dl>
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+ <h2>
95
+ Class Method Summary
96
+ <small><a href="#" class="summary_toggle">collapse</a></small>
97
+ </h2>
98
+
99
+ <ul class="summary">
100
+
101
+ <li class="private ">
102
+ <span class="summary_signature">
103
+
104
+ <a href="#_get_array_price_from_BS-class_method" title="_get_array_price_from_BS (class method)">.<strong>_get_array_price_from_BS</strong>(inputs, n) &#x21d2; Numo::DFloat </a>
105
+
106
+
107
+
108
+ </span>
109
+
110
+
111
+
112
+ <span class="note title private">private</span>
113
+
114
+
115
+
116
+
117
+
118
+ <span class="summary_desc"><div class='inline'><p>Generate array of prices using Black-Scholes model.</p>
119
+ </div></span>
120
+
121
+ </li>
122
+
123
+
124
+ <li class="private ">
125
+ <span class="summary_signature">
126
+
127
+ <a href="#_get_array_price_from_laplace-class_method" title="_get_array_price_from_laplace (class method)">.<strong>_get_array_price_from_laplace</strong>(inputs, n) &#x21d2; Numo::DFloat </a>
128
+
129
+
130
+
131
+ </span>
132
+
133
+
134
+
135
+ <span class="note title private">private</span>
136
+
137
+
138
+
139
+
140
+
141
+ <span class="summary_desc"><div class='inline'><p>Generate array of prices using Laplace distribution.</p>
142
+ </div></span>
143
+
144
+ </li>
145
+
146
+
147
+ <li class="private ">
148
+ <span class="summary_signature">
149
+
150
+ <a href="#_get_payoff-class_method" title="_get_payoff (class method)">.<strong>_get_payoff</strong>(option_type, s, x) &#x21d2; Numo::DFloat </a>
151
+
152
+
153
+
154
+ </span>
155
+
156
+
157
+
158
+ <span class="note title private">private</span>
159
+
160
+
161
+
162
+
163
+
164
+ <span class="summary_desc"><div class='inline'><p>Calculate option payoff at expiration.</p>
165
+ </div></span>
166
+
167
+ </li>
168
+
169
+
170
+ <li class="private ">
171
+ <span class="summary_signature">
172
+
173
+ <a href="#_get_pl_option-class_method" title="_get_pl_option (class method)">.<strong>_get_pl_option</strong>(option_type, opvalue, action, s, x) &#x21d2; Numo::DFloat </a>
174
+
175
+
176
+
177
+ </span>
178
+
179
+
180
+
181
+ <span class="note title private">private</span>
182
+
183
+
184
+
185
+
186
+
187
+ <span class="summary_desc"><div class='inline'><p>Calculate P/L of an option at expiration.</p>
188
+ </div></span>
189
+
190
+ </li>
191
+
192
+
193
+ <li class="private ">
194
+ <span class="summary_signature">
195
+
196
+ <a href="#_get_pl_stock-class_method" title="_get_pl_stock (class method)">.<strong>_get_pl_stock</strong>(s0, action, s) &#x21d2; Numo::DFloat </a>
197
+
198
+
199
+
200
+ </span>
201
+
202
+
203
+
204
+ <span class="note title private">private</span>
205
+
206
+
207
+
208
+
209
+
210
+ <span class="summary_desc"><div class='inline'><p>Calculate P/L of a stock position.</p>
211
+ </div></span>
212
+
213
+ </li>
214
+
215
+
216
+ <li class="private ">
217
+ <span class="summary_signature">
218
+
219
+ <a href="#_get_pop_array-class_method" title="_get_pop_array (class method)">.<strong>_get_pop_array</strong>(inputs, target) &#x21d2; Array&lt;Float, Float, Float, Float&gt; </a>
220
+
221
+
222
+
223
+ </span>
224
+
225
+
226
+
227
+ <span class="note title private">private</span>
228
+
229
+
230
+
231
+
232
+
233
+ <span class="summary_desc"><div class='inline'><p>Calculate PoP using array of terminal prices.</p>
234
+ </div></span>
235
+
236
+ </li>
237
+
238
+
239
+ <li class="private ">
240
+ <span class="summary_signature">
241
+
242
+ <a href="#_get_pop_bs-class_method" title="_get_pop_bs (class method)">.<strong>_get_pop_bs</strong>(s, profit, inputs, profit_range) &#x21d2; Array&lt;Float, Float, Float, Float&gt; </a>
243
+
244
+
245
+
246
+ </span>
247
+
248
+
249
+
250
+ <span class="note title private">private</span>
251
+
252
+
253
+
254
+
255
+
256
+ <span class="summary_desc"><div class='inline'><p>Calculate PoP using Black-Scholes model.</p>
257
+ </div></span>
258
+
259
+ </li>
260
+
261
+
262
+ <li class="private ">
263
+ <span class="summary_signature">
264
+
265
+ <a href="#_get_profit_range-class_method" title="_get_profit_range (class method)">.<strong>_get_profit_range</strong>(s, profit, target = 0.01) &#x21d2; Array&lt;Array&lt;Array&lt;Float&gt;&gt;&gt; </a>
266
+
267
+
268
+
269
+ </span>
270
+
271
+
272
+
273
+ <span class="note title private">private</span>
274
+
275
+
276
+
277
+
278
+
279
+ <span class="summary_desc"><div class='inline'><p>Find profit/loss ranges.</p>
280
+ </div></span>
281
+
282
+ </li>
283
+
284
+
285
+ <li class="private ">
286
+ <span class="summary_signature">
287
+
288
+ <a href="#_get_sign_changes-class_method" title="_get_sign_changes (class method)">.<strong>_get_sign_changes</strong>(profit, target) &#x21d2; Array&lt;Integer&gt; </a>
289
+
290
+
291
+
292
+ </span>
293
+
294
+
295
+
296
+ <span class="note title private">private</span>
297
+
298
+
299
+
300
+
301
+
302
+ <span class="summary_desc"><div class='inline'><p>Find indices where profit crosses target.</p>
303
+ </div></span>
304
+
305
+ </li>
306
+
307
+
308
+ <li class="public ">
309
+ <span class="summary_signature">
310
+
311
+ <a href="#create_price_array-class_method" title="create_price_array (class method)">.<strong>create_price_array</strong>(inputs_data, n: 100_000, seed: nil) &#x21d2; Numo::DFloat </a>
312
+
313
+
314
+
315
+ </span>
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ <span class="summary_desc"><div class='inline'><p>Create price array for simulations.</p>
326
+ </div></span>
327
+
328
+ </li>
329
+
330
+
331
+ <li class="public ">
332
+ <span class="summary_signature">
333
+
334
+ <a href="#create_price_seq-class_method" title="create_price_seq (class method)">.<strong>create_price_seq</strong>(min_price, max_price) &#x21d2; Numo::DFloat </a>
335
+
336
+
337
+
338
+ </span>
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+ <span class="summary_desc"><div class='inline'><p>Generate a sequence of stock prices from min to max with $0.01 increment.</p>
349
+ </div></span>
350
+
351
+ </li>
352
+
353
+
354
+ <li class="public ">
355
+ <span class="summary_signature">
356
+
357
+ <a href="#get_pl_profile-class_method" title="get_pl_profile (class method)">.<strong>get_pl_profile</strong>(option_type, action, x, val, n, s, commission = 0.0) &#x21d2; Array&lt;Numo::DFloat, Float&gt; </a>
358
+
359
+
360
+
361
+ </span>
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+ <span class="summary_desc"><div class='inline'><p>Get profit/loss profile and cost of an options trade at expiration.</p>
372
+ </div></span>
373
+
374
+ </li>
375
+
376
+
377
+ <li class="public ">
378
+ <span class="summary_signature">
379
+
380
+ <a href="#get_pl_profile_bs-class_method" title="get_pl_profile_bs (class method)">.<strong>get_pl_profile_bs</strong>(option_type, action, x, val, r, target_to_maturity_years, volatility, n, s, y = 0.0, commission = 0.0) &#x21d2; Array&lt;Numo::DFloat, Float&gt; </a>
381
+
382
+
383
+
384
+ </span>
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+ <span class="summary_desc"><div class='inline'><p>Get profit/loss profile and cost of an options trade before expiration using Black-Scholes.</p>
395
+ </div></span>
396
+
397
+ </li>
398
+
399
+
400
+ <li class="public ">
401
+ <span class="summary_signature">
402
+
403
+ <a href="#get_pl_profile_stock-class_method" title="get_pl_profile_stock (class method)">.<strong>get_pl_profile_stock</strong>(s0, action, n, s, commission = 0.0) &#x21d2; Array&lt;Numo::DFloat, Float&gt; </a>
404
+
405
+
406
+
407
+ </span>
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+ <span class="summary_desc"><div class='inline'><p>Get profit/loss profile and cost of a stock position.</p>
418
+ </div></span>
419
+
420
+ </li>
421
+
422
+
423
+ <li class="public ">
424
+ <span class="summary_signature">
425
+
426
+ <a href="#get_pop-class_method" title="get_pop (class method)">.<strong>get_pop</strong>(s, profit, inputs_data, target = 0.01) &#x21d2; Models::PoPOutputs </a>
427
+
428
+
429
+
430
+ </span>
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+ <span class="summary_desc"><div class='inline'><p>Estimate probability of profit.</p>
441
+ </div></span>
442
+
443
+ </li>
444
+
445
+
446
+ </ul>
447
+
448
+
449
+
450
+
451
+ <div id="class_method_details" class="method_details_list">
452
+ <h2>Class Method Details</h2>
453
+
454
+
455
+ <div class="method_details first">
456
+ <h3 class="signature first" id="_get_array_price_from_BS-class_method">
457
+
458
+ .<strong>_get_array_price_from_BS</strong>(inputs, n) &#x21d2; <tt>Numo::DFloat</tt> <span class="extras">(private)</span>
459
+
460
+
461
+
462
+
463
+
464
+ </h3><div class="docstring">
465
+ <div class="discussion">
466
+ <p>Generate array of prices using Black-Scholes model</p>
467
+
468
+
469
+ </div>
470
+ </div>
471
+ <div class="tags">
472
+ <p class="tag_title">Parameters:</p>
473
+ <ul class="param">
474
+
475
+ <li>
476
+
477
+ <span class='name'>inputs</span>
478
+
479
+
480
+ <span class='type'>(<tt><span class='object_link'><a href="Models/BlackScholesModelInputs.html" title="OptionLab::Models::BlackScholesModelInputs (class)">Models::BlackScholesModelInputs</a></span></tt>)</span>
481
+
482
+
483
+
484
+ &mdash;
485
+ <div class='inline'><p>Black-Scholes inputs</p>
486
+ </div>
487
+
488
+ </li>
489
+
490
+ <li>
491
+
492
+ <span class='name'>n</span>
493
+
494
+
495
+ <span class='type'>(<tt>Integer</tt>)</span>
496
+
497
+
498
+
499
+ &mdash;
500
+ <div class='inline'><p>Number of prices to generate</p>
501
+ </div>
502
+
503
+ </li>
504
+
505
+ </ul>
506
+
507
+ <p class="tag_title">Returns:</p>
508
+ <ul class="return">
509
+
510
+ <li>
511
+
512
+
513
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
514
+
515
+
516
+
517
+ &mdash;
518
+ <div class='inline'><p>Array of prices</p>
519
+ </div>
520
+
521
+ </li>
522
+
523
+ </ul>
524
+
525
+ </div><table class="source_code">
526
+ <tr>
527
+ <td>
528
+ <pre class="lines">
529
+
530
+
531
+ 437
532
+ 438
533
+ 439
534
+ 440
535
+ 441
536
+ 442
537
+ 443
538
+ 444
539
+ 445
540
+ 446
541
+ 447
542
+ 448
543
+ 449</pre>
544
+ </td>
545
+ <td>
546
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 437</span>
547
+
548
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_array_price_from_BS'>_get_array_price_from_BS</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span><span class='rparen'>)</span>
549
+ <span class='comment'># Calculate mean and std
550
+ </span> <span class='id identifier rubyid_mean'>mean</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_log'>log</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_stock_price'>stock_price</span><span class='rparen'>)</span> <span class='op'>+</span>
551
+ <span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_interest_rate'>interest_rate</span> <span class='op'>-</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_dividend_yield'>dividend_yield</span> <span class='op'>-</span> <span class='float'>0.5</span> <span class='op'>*</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_volatility'>volatility</span><span class='op'>**</span><span class='int'>2</span><span class='rparen'>)</span> <span class='op'>*</span>
552
+ <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_years_to_target_date'>years_to_target_date</span>
553
+ <span class='id identifier rubyid_std'>std</span> <span class='op'>=</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_volatility'>volatility</span> <span class='op'>*</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_sqrt'>sqrt</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_years_to_target_date'>years_to_target_date</span><span class='rparen'>)</span>
554
+
555
+ <span class='comment'># Generate random values
556
+ </span> <span class='id identifier rubyid_random_values'>random_values</span> <span class='op'>=</span> <span class='const'>Numo</span><span class='op'>::</span><span class='const'>DFloat</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n'>n</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_rand_norm'>rand_norm</span><span class='lparen'>(</span><span class='int'>0</span><span class='comma'>,</span> <span class='int'>1</span><span class='rparen'>)</span>
557
+
558
+ <span class='comment'># Apply formula
559
+ </span> <span class='const'>Numo</span><span class='op'>::</span><span class='const'>NMath</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</span><span class='id identifier rubyid_mean'>mean</span> <span class='op'>+</span> <span class='id identifier rubyid_std'>std</span> <span class='op'>*</span> <span class='id identifier rubyid_random_values'>random_values</span><span class='rparen'>)</span>
560
+ <span class='kw'>end</span></pre>
561
+ </td>
562
+ </tr>
563
+ </table>
564
+ </div>
565
+
566
+ <div class="method_details ">
567
+ <h3 class="signature " id="_get_array_price_from_laplace-class_method">
568
+
569
+ .<strong>_get_array_price_from_laplace</strong>(inputs, n) &#x21d2; <tt>Numo::DFloat</tt> <span class="extras">(private)</span>
570
+
571
+
572
+
573
+
574
+
575
+ </h3><div class="docstring">
576
+ <div class="discussion">
577
+ <p>Generate array of prices using Laplace distribution</p>
578
+
579
+
580
+ </div>
581
+ </div>
582
+ <div class="tags">
583
+ <p class="tag_title">Parameters:</p>
584
+ <ul class="param">
585
+
586
+ <li>
587
+
588
+ <span class='name'>inputs</span>
589
+
590
+
591
+ <span class='type'>(<tt><span class='object_link'><a href="Models/LaplaceInputs.html" title="OptionLab::Models::LaplaceInputs (class)">Models::LaplaceInputs</a></span></tt>)</span>
592
+
593
+
594
+
595
+ &mdash;
596
+ <div class='inline'><p>Laplace inputs</p>
597
+ </div>
598
+
599
+ </li>
600
+
601
+ <li>
602
+
603
+ <span class='name'>n</span>
604
+
605
+
606
+ <span class='type'>(<tt>Integer</tt>)</span>
607
+
608
+
609
+
610
+ &mdash;
611
+ <div class='inline'><p>Number of prices to generate</p>
612
+ </div>
613
+
614
+ </li>
615
+
616
+ </ul>
617
+
618
+ <p class="tag_title">Returns:</p>
619
+ <ul class="return">
620
+
621
+ <li>
622
+
623
+
624
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
625
+
626
+
627
+
628
+ &mdash;
629
+ <div class='inline'><p>Array of prices</p>
630
+ </div>
631
+
632
+ </li>
633
+
634
+ </ul>
635
+
636
+ </div><table class="source_code">
637
+ <tr>
638
+ <td>
639
+ <pre class="lines">
640
+
641
+
642
+ 455
643
+ 456
644
+ 457
645
+ 458
646
+ 459
647
+ 460
648
+ 461
649
+ 462
650
+ 463
651
+ 464
652
+ 465
653
+ 466
654
+ 467
655
+ 468</pre>
656
+ </td>
657
+ <td>
658
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 455</span>
659
+
660
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_array_price_from_laplace'>_get_array_price_from_laplace</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span><span class='rparen'>)</span>
661
+ <span class='comment'># Calculate location and scale
662
+ </span> <span class='id identifier rubyid_location'>location</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_log'>log</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_stock_price'>stock_price</span><span class='rparen'>)</span> <span class='op'>+</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_mu'>mu</span> <span class='op'>*</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_years_to_target_date'>years_to_target_date</span>
663
+ <span class='id identifier rubyid_scale'>scale</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_volatility'>volatility</span> <span class='op'>*</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_sqrt'>sqrt</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_years_to_target_date'>years_to_target_date</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_sqrt'>sqrt</span><span class='lparen'>(</span><span class='float'>2.0</span><span class='rparen'>)</span>
664
+
665
+ <span class='comment'># Generate random values from uniform distribution
666
+ </span> <span class='id identifier rubyid_u'>u</span> <span class='op'>=</span> <span class='const'>Numo</span><span class='op'>::</span><span class='const'>DFloat</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n'>n</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_rand'>rand</span> <span class='op'>-</span> <span class='float'>0.5</span>
667
+
668
+ <span class='comment'># Convert to Laplace distribution
669
+ </span> <span class='id identifier rubyid_laplace_values'>laplace_values</span> <span class='op'>=</span> <span class='id identifier rubyid_location'>location</span> <span class='op'>-</span> <span class='id identifier rubyid_scale'>scale</span> <span class='op'>*</span> <span class='id identifier rubyid_u'>u</span><span class='period'>.</span><span class='id identifier rubyid_abs'>abs</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_v'>v</span><span class='op'>|</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&lt;</span> <span class='int'>0</span> <span class='op'>?</span> <span class='op'>-</span><span class='int'>1</span> <span class='op'>:</span> <span class='int'>1</span> <span class='rbrace'>}</span> <span class='op'>*</span> <span class='const'>Numo</span><span class='op'>::</span><span class='const'>NMath</span><span class='period'>.</span><span class='id identifier rubyid_log'>log</span><span class='lparen'>(</span><span class='int'>1</span> <span class='op'>-</span> <span class='int'>2</span> <span class='op'>*</span> <span class='id identifier rubyid_u'>u</span><span class='period'>.</span><span class='id identifier rubyid_abs'>abs</span><span class='rparen'>)</span>
670
+
671
+ <span class='comment'># Apply formula
672
+ </span> <span class='const'>Numo</span><span class='op'>::</span><span class='const'>NMath</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</span><span class='id identifier rubyid_laplace_values'>laplace_values</span><span class='rparen'>)</span>
673
+ <span class='kw'>end</span></pre>
674
+ </td>
675
+ </tr>
676
+ </table>
677
+ </div>
678
+
679
+ <div class="method_details ">
680
+ <h3 class="signature " id="_get_payoff-class_method">
681
+
682
+ .<strong>_get_payoff</strong>(option_type, s, x) &#x21d2; <tt>Numo::DFloat</tt> <span class="extras">(private)</span>
683
+
684
+
685
+
686
+
687
+
688
+ </h3><div class="docstring">
689
+ <div class="discussion">
690
+ <p>Calculate option payoff at expiration</p>
691
+
692
+
693
+ </div>
694
+ </div>
695
+ <div class="tags">
696
+ <p class="tag_title">Parameters:</p>
697
+ <ul class="param">
698
+
699
+ <li>
700
+
701
+ <span class='name'>option_type</span>
702
+
703
+
704
+ <span class='type'>(<tt>String</tt>)</span>
705
+
706
+
707
+
708
+ &mdash;
709
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
710
+ </div>
711
+
712
+ </li>
713
+
714
+ <li>
715
+
716
+ <span class='name'>s</span>
717
+
718
+
719
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
720
+
721
+
722
+
723
+ &mdash;
724
+ <div class='inline'><p>Array of stock prices</p>
725
+ </div>
726
+
727
+ </li>
728
+
729
+ <li>
730
+
731
+ <span class='name'>x</span>
732
+
733
+
734
+ <span class='type'>(<tt>Float</tt>)</span>
735
+
736
+
737
+
738
+ &mdash;
739
+ <div class='inline'><p>Strike price</p>
740
+ </div>
741
+
742
+ </li>
743
+
744
+ </ul>
745
+
746
+ <p class="tag_title">Returns:</p>
747
+ <ul class="return">
748
+
749
+ <li>
750
+
751
+
752
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
753
+
754
+
755
+
756
+ &mdash;
757
+ <div class='inline'><p>Option payoff</p>
758
+ </div>
759
+
760
+ </li>
761
+
762
+ </ul>
763
+
764
+ </div><table class="source_code">
765
+ <tr>
766
+ <td>
767
+ <pre class="lines">
768
+
769
+
770
+ 225
771
+ 226
772
+ 227
773
+ 228
774
+ 229
775
+ 230
776
+ 231
777
+ 232
778
+ 233
779
+ 234
780
+ 235</pre>
781
+ </td>
782
+ <td>
783
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 225</span>
784
+
785
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_payoff'>_get_payoff</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
786
+ <span class='kw'>if</span> <span class='id identifier rubyid_option_type'>option_type</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>call</span><span class='tstring_end'>&#39;</span></span>
787
+ <span class='id identifier rubyid_diff'>diff</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span> <span class='op'>-</span> <span class='id identifier rubyid_x'>x</span>
788
+ <span class='lparen'>(</span><span class='id identifier rubyid_diff'>diff</span> <span class='op'>+</span> <span class='id identifier rubyid_diff'>diff</span><span class='period'>.</span><span class='id identifier rubyid_abs'>abs</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='float'>2.0</span>
789
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_option_type'>option_type</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>put</span><span class='tstring_end'>&#39;</span></span>
790
+ <span class='id identifier rubyid_diff'>diff</span> <span class='op'>=</span> <span class='id identifier rubyid_x'>x</span> <span class='op'>-</span> <span class='id identifier rubyid_s'>s</span>
791
+ <span class='lparen'>(</span><span class='id identifier rubyid_diff'>diff</span> <span class='op'>+</span> <span class='id identifier rubyid_diff'>diff</span><span class='period'>.</span><span class='id identifier rubyid_abs'>abs</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='float'>2.0</span>
792
+ <span class='kw'>else</span>
793
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option type must be either &#39;call&#39; or &#39;put&#39;!</span><span class='tstring_end'>&quot;</span></span>
794
+ <span class='kw'>end</span>
795
+ <span class='kw'>end</span></pre>
796
+ </td>
797
+ </tr>
798
+ </table>
799
+ </div>
800
+
801
+ <div class="method_details ">
802
+ <h3 class="signature " id="_get_pl_option-class_method">
803
+
804
+ .<strong>_get_pl_option</strong>(option_type, opvalue, action, s, x) &#x21d2; <tt>Numo::DFloat</tt> <span class="extras">(private)</span>
805
+
806
+
807
+
808
+
809
+
810
+ </h3><div class="docstring">
811
+ <div class="discussion">
812
+ <p>Calculate P/L of an option at expiration</p>
813
+
814
+
815
+ </div>
816
+ </div>
817
+ <div class="tags">
818
+ <p class="tag_title">Parameters:</p>
819
+ <ul class="param">
820
+
821
+ <li>
822
+
823
+ <span class='name'>option_type</span>
824
+
825
+
826
+ <span class='type'>(<tt>String</tt>)</span>
827
+
828
+
829
+
830
+ &mdash;
831
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
832
+ </div>
833
+
834
+ </li>
835
+
836
+ <li>
837
+
838
+ <span class='name'>opvalue</span>
839
+
840
+
841
+ <span class='type'>(<tt>Float</tt>)</span>
842
+
843
+
844
+
845
+ &mdash;
846
+ <div class='inline'><p>Option price</p>
847
+ </div>
848
+
849
+ </li>
850
+
851
+ <li>
852
+
853
+ <span class='name'>action</span>
854
+
855
+
856
+ <span class='type'>(<tt>String</tt>)</span>
857
+
858
+
859
+
860
+ &mdash;
861
+ <div class='inline'><p>&#39;buy&#39; or &#39;sell&#39;</p>
862
+ </div>
863
+
864
+ </li>
865
+
866
+ <li>
867
+
868
+ <span class='name'>s</span>
869
+
870
+
871
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
872
+
873
+
874
+
875
+ &mdash;
876
+ <div class='inline'><p>Array of stock prices</p>
877
+ </div>
878
+
879
+ </li>
880
+
881
+ <li>
882
+
883
+ <span class='name'>x</span>
884
+
885
+
886
+ <span class='type'>(<tt>Float</tt>)</span>
887
+
888
+
889
+
890
+ &mdash;
891
+ <div class='inline'><p>Strike price</p>
892
+ </div>
893
+
894
+ </li>
895
+
896
+ </ul>
897
+
898
+ <p class="tag_title">Returns:</p>
899
+ <ul class="return">
900
+
901
+ <li>
902
+
903
+
904
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
905
+
906
+
907
+
908
+ &mdash;
909
+ <div class='inline'><p>P/L profile</p>
910
+ </div>
911
+
912
+ </li>
913
+
914
+ </ul>
915
+
916
+ </div><table class="source_code">
917
+ <tr>
918
+ <td>
919
+ <pre class="lines">
920
+
921
+
922
+ 210
923
+ 211
924
+ 212
925
+ 213
926
+ 214
927
+ 215
928
+ 216
929
+ 217
930
+ 218</pre>
931
+ </td>
932
+ <td>
933
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 210</span>
934
+
935
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_pl_option'>_get_pl_option</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_opvalue'>opvalue</span><span class='comma'>,</span> <span class='id identifier rubyid_action'>action</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
936
+ <span class='kw'>if</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>sell</span><span class='tstring_end'>&#39;</span></span>
937
+ <span class='id identifier rubyid_opvalue'>opvalue</span> <span class='op'>-</span> <span class='id identifier rubyid__get_payoff'>_get_payoff</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
938
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>buy</span><span class='tstring_end'>&#39;</span></span>
939
+ <span class='id identifier rubyid__get_payoff'>_get_payoff</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span> <span class='op'>-</span> <span class='id identifier rubyid_opvalue'>opvalue</span>
940
+ <span class='kw'>else</span>
941
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Action must be either &#39;sell&#39; or &#39;buy&#39;!</span><span class='tstring_end'>&quot;</span></span>
942
+ <span class='kw'>end</span>
943
+ <span class='kw'>end</span></pre>
944
+ </td>
945
+ </tr>
946
+ </table>
947
+ </div>
948
+
949
+ <div class="method_details ">
950
+ <h3 class="signature " id="_get_pl_stock-class_method">
951
+
952
+ .<strong>_get_pl_stock</strong>(s0, action, s) &#x21d2; <tt>Numo::DFloat</tt> <span class="extras">(private)</span>
953
+
954
+
955
+
956
+
957
+
958
+ </h3><div class="docstring">
959
+ <div class="discussion">
960
+ <p>Calculate P/L of a stock position</p>
961
+
962
+
963
+ </div>
964
+ </div>
965
+ <div class="tags">
966
+ <p class="tag_title">Parameters:</p>
967
+ <ul class="param">
968
+
969
+ <li>
970
+
971
+ <span class='name'>s0</span>
972
+
973
+
974
+ <span class='type'>(<tt>Float</tt>)</span>
975
+
976
+
977
+
978
+ &mdash;
979
+ <div class='inline'><p>Spot price</p>
980
+ </div>
981
+
982
+ </li>
983
+
984
+ <li>
985
+
986
+ <span class='name'>action</span>
987
+
988
+
989
+ <span class='type'>(<tt>String</tt>)</span>
990
+
991
+
992
+
993
+ &mdash;
994
+ <div class='inline'><p>&#39;buy&#39; or &#39;sell&#39;</p>
995
+ </div>
996
+
997
+ </li>
998
+
999
+ <li>
1000
+
1001
+ <span class='name'>s</span>
1002
+
1003
+
1004
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1005
+
1006
+
1007
+
1008
+ &mdash;
1009
+ <div class='inline'><p>Array of stock prices</p>
1010
+ </div>
1011
+
1012
+ </li>
1013
+
1014
+ </ul>
1015
+
1016
+ <p class="tag_title">Returns:</p>
1017
+ <ul class="return">
1018
+
1019
+ <li>
1020
+
1021
+
1022
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1023
+
1024
+
1025
+
1026
+ &mdash;
1027
+ <div class='inline'><p>P/L profile</p>
1028
+ </div>
1029
+
1030
+ </li>
1031
+
1032
+ </ul>
1033
+
1034
+ </div><table class="source_code">
1035
+ <tr>
1036
+ <td>
1037
+ <pre class="lines">
1038
+
1039
+
1040
+ 242
1041
+ 243
1042
+ 244
1043
+ 245
1044
+ 246
1045
+ 247
1046
+ 248
1047
+ 249
1048
+ 250</pre>
1049
+ </td>
1050
+ <td>
1051
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 242</span>
1052
+
1053
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_pl_stock'>_get_pl_stock</span><span class='lparen'>(</span><span class='id identifier rubyid_s0'>s0</span><span class='comma'>,</span> <span class='id identifier rubyid_action'>action</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='rparen'>)</span>
1054
+ <span class='kw'>if</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>sell</span><span class='tstring_end'>&#39;</span></span>
1055
+ <span class='id identifier rubyid_s0'>s0</span> <span class='op'>-</span> <span class='id identifier rubyid_s'>s</span>
1056
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>buy</span><span class='tstring_end'>&#39;</span></span>
1057
+ <span class='id identifier rubyid_s'>s</span> <span class='op'>-</span> <span class='id identifier rubyid_s0'>s0</span>
1058
+ <span class='kw'>else</span>
1059
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Action must be either &#39;sell&#39; or &#39;buy&#39;!</span><span class='tstring_end'>&quot;</span></span>
1060
+ <span class='kw'>end</span>
1061
+ <span class='kw'>end</span></pre>
1062
+ </td>
1063
+ </tr>
1064
+ </table>
1065
+ </div>
1066
+
1067
+ <div class="method_details ">
1068
+ <h3 class="signature " id="_get_pop_array-class_method">
1069
+
1070
+ .<strong>_get_pop_array</strong>(inputs, target) &#x21d2; <tt>Array&lt;Float, Float, Float, Float&gt;</tt> <span class="extras">(private)</span>
1071
+
1072
+
1073
+
1074
+
1075
+
1076
+ </h3><div class="docstring">
1077
+ <div class="discussion">
1078
+ <p>Calculate PoP using array of terminal prices</p>
1079
+
1080
+
1081
+ </div>
1082
+ </div>
1083
+ <div class="tags">
1084
+ <p class="tag_title">Parameters:</p>
1085
+ <ul class="param">
1086
+
1087
+ <li>
1088
+
1089
+ <span class='name'>inputs</span>
1090
+
1091
+
1092
+ <span class='type'>(<tt><span class='object_link'><a href="Models/ArrayInputs.html" title="OptionLab::Models::ArrayInputs (class)">Models::ArrayInputs</a></span></tt>)</span>
1093
+
1094
+
1095
+
1096
+ &mdash;
1097
+ <div class='inline'><p>Array inputs</p>
1098
+ </div>
1099
+
1100
+ </li>
1101
+
1102
+ <li>
1103
+
1104
+ <span class='name'>target</span>
1105
+
1106
+
1107
+ <span class='type'>(<tt>Float</tt>)</span>
1108
+
1109
+
1110
+
1111
+ &mdash;
1112
+ <div class='inline'><p>Return target</p>
1113
+ </div>
1114
+
1115
+ </li>
1116
+
1117
+ </ul>
1118
+
1119
+ <p class="tag_title">Returns:</p>
1120
+ <ul class="return">
1121
+
1122
+ <li>
1123
+
1124
+
1125
+ <span class='type'>(<tt>Array&lt;Float, Float, Float, Float&gt;</tt>)</span>
1126
+
1127
+
1128
+
1129
+ &mdash;
1130
+ <div class='inline'><p>PoP calculation results</p>
1131
+ </div>
1132
+
1133
+ </li>
1134
+
1135
+ </ul>
1136
+
1137
+ </div><table class="source_code">
1138
+ <tr>
1139
+ <td>
1140
+ <pre class="lines">
1141
+
1142
+
1143
+ 312
1144
+ 313
1145
+ 314
1146
+ 315
1147
+ 316
1148
+ 317
1149
+ 318
1150
+ 319
1151
+ 320
1152
+ 321
1153
+ 322
1154
+ 323
1155
+ 324
1156
+ 325
1157
+ 326
1158
+ 327
1159
+ 328
1160
+ 329
1161
+ 330
1162
+ 331
1163
+ 332
1164
+ 333
1165
+ 334
1166
+ 335</pre>
1167
+ </td>
1168
+ <td>
1169
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 312</span>
1170
+
1171
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_pop_array'>_get_pop_array</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='comma'>,</span> <span class='id identifier rubyid_target'>target</span><span class='rparen'>)</span>
1172
+ <span class='kw'>if</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_array'>array</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span> <span class='op'>==</span> <span class='int'>0</span>
1173
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>The array is empty!</span><span class='tstring_end'>&quot;</span></span>
1174
+ <span class='kw'>end</span>
1175
+
1176
+ <span class='comment'># Split array by target
1177
+ </span> <span class='id identifier rubyid_above_target'>above_target</span> <span class='op'>=</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_array'>array</span><span class='lbracket'>[</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_array'>array</span> <span class='op'>&gt;=</span> <span class='id identifier rubyid_target'>target</span><span class='rbracket'>]</span>
1178
+ <span class='id identifier rubyid_below_target'>below_target</span> <span class='op'>=</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_array'>array</span><span class='lbracket'>[</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_array'>array</span> <span class='op'>&lt;</span> <span class='id identifier rubyid_target'>target</span><span class='rbracket'>]</span>
1179
+
1180
+ <span class='comment'># Calculate probabilities
1181
+ </span> <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span> <span class='op'>=</span> <span class='id identifier rubyid_above_target'>above_target</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span> <span class='op'>/</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_array'>array</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span>
1182
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span> <span class='op'>=</span> <span class='float'>1.0</span> <span class='op'>-</span> <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span>
1183
+
1184
+ <span class='comment'># Calculate expected returns
1185
+ </span> <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span> <span class='op'>=</span> <span class='id identifier rubyid_above_target'>above_target</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='op'>?</span> <span class='id identifier rubyid_above_target'>above_target</span><span class='period'>.</span><span class='id identifier rubyid_mean'>mean</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span><span class='lparen'>(</span><span class='int'>2</span><span class='rparen'>)</span> <span class='op'>:</span> <span class='kw'>nil</span>
1186
+ <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span> <span class='op'>=</span> <span class='id identifier rubyid_below_target'>below_target</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='op'>?</span> <span class='id identifier rubyid_below_target'>below_target</span><span class='period'>.</span><span class='id identifier rubyid_mean'>mean</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span><span class='lparen'>(</span><span class='int'>2</span><span class='rparen'>)</span> <span class='op'>:</span> <span class='kw'>nil</span>
1187
+
1188
+ <span class='lbracket'>[</span>
1189
+ <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span><span class='comma'>,</span>
1190
+ <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span><span class='comma'>,</span>
1191
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span><span class='comma'>,</span>
1192
+ <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span>
1193
+ <span class='rbracket'>]</span>
1194
+ <span class='kw'>end</span></pre>
1195
+ </td>
1196
+ </tr>
1197
+ </table>
1198
+ </div>
1199
+
1200
+ <div class="method_details ">
1201
+ <h3 class="signature " id="_get_pop_bs-class_method">
1202
+
1203
+ .<strong>_get_pop_bs</strong>(s, profit, inputs, profit_range) &#x21d2; <tt>Array&lt;Float, Float, Float, Float&gt;</tt> <span class="extras">(private)</span>
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+ </h3><div class="docstring">
1210
+ <div class="discussion">
1211
+ <p>Calculate PoP using Black-Scholes model</p>
1212
+
1213
+
1214
+ </div>
1215
+ </div>
1216
+ <div class="tags">
1217
+ <p class="tag_title">Parameters:</p>
1218
+ <ul class="param">
1219
+
1220
+ <li>
1221
+
1222
+ <span class='name'>s</span>
1223
+
1224
+
1225
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1226
+
1227
+
1228
+
1229
+ &mdash;
1230
+ <div class='inline'><p>Array of stock prices</p>
1231
+ </div>
1232
+
1233
+ </li>
1234
+
1235
+ <li>
1236
+
1237
+ <span class='name'>profit</span>
1238
+
1239
+
1240
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1241
+
1242
+
1243
+
1244
+ &mdash;
1245
+ <div class='inline'><p>Array of profits</p>
1246
+ </div>
1247
+
1248
+ </li>
1249
+
1250
+ <li>
1251
+
1252
+ <span class='name'>inputs</span>
1253
+
1254
+
1255
+ <span class='type'>(<tt><span class='object_link'><a href="Models/BlackScholesModelInputs.html" title="OptionLab::Models::BlackScholesModelInputs (class)">Models::BlackScholesModelInputs</a></span></tt>)</span>
1256
+
1257
+
1258
+
1259
+ &mdash;
1260
+ <div class='inline'><p>Model inputs</p>
1261
+ </div>
1262
+
1263
+ </li>
1264
+
1265
+ <li>
1266
+
1267
+ <span class='name'>profit_range</span>
1268
+
1269
+
1270
+ <span class='type'>(<tt>Array&lt;Array&lt;Array&lt;Float&gt;&gt;&gt;</tt>)</span>
1271
+
1272
+
1273
+
1274
+ &mdash;
1275
+ <div class='inline'><p>Profit and loss ranges</p>
1276
+ </div>
1277
+
1278
+ </li>
1279
+
1280
+ </ul>
1281
+
1282
+ <p class="tag_title">Returns:</p>
1283
+ <ul class="return">
1284
+
1285
+ <li>
1286
+
1287
+
1288
+ <span class='type'>(<tt>Array&lt;Float, Float, Float, Float&gt;</tt>)</span>
1289
+
1290
+
1291
+
1292
+ &mdash;
1293
+ <div class='inline'><p>PoP calculation results</p>
1294
+ </div>
1295
+
1296
+ </li>
1297
+
1298
+ </ul>
1299
+
1300
+ </div><table class="source_code">
1301
+ <tr>
1302
+ <td>
1303
+ <pre class="lines">
1304
+
1305
+
1306
+ 258
1307
+ 259
1308
+ 260
1309
+ 261
1310
+ 262
1311
+ 263
1312
+ 264
1313
+ 265
1314
+ 266
1315
+ 267
1316
+ 268
1317
+ 269
1318
+ 270
1319
+ 271
1320
+ 272
1321
+ 273
1322
+ 274
1323
+ 275
1324
+ 276
1325
+ 277
1326
+ 278
1327
+ 279
1328
+ 280
1329
+ 281
1330
+ 282
1331
+ 283
1332
+ 284
1333
+ 285
1334
+ 286
1335
+ 287
1336
+ 288
1337
+ 289
1338
+ 290
1339
+ 291
1340
+ 292
1341
+ 293
1342
+ 294
1343
+ 295
1344
+ 296
1345
+ 297
1346
+ 298
1347
+ 299
1348
+ 300
1349
+ 301
1350
+ 302
1351
+ 303
1352
+ 304
1353
+ 305
1354
+ 306</pre>
1355
+ </td>
1356
+ <td>
1357
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 258</span>
1358
+
1359
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_pop_bs'>_get_pop_bs</span><span class='lparen'>(</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_profit'>profit</span><span class='comma'>,</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='comma'>,</span> <span class='id identifier rubyid_profit_range'>profit_range</span><span class='rparen'>)</span>
1360
+ <span class='comment'># Initialize variables
1361
+ </span> <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span> <span class='op'>=</span> <span class='kw'>nil</span>
1362
+ <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span> <span class='op'>=</span> <span class='kw'>nil</span>
1363
+ <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span> <span class='op'>=</span> <span class='float'>0.0</span>
1364
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span> <span class='op'>=</span> <span class='float'>0.0</span>
1365
+
1366
+ <span class='comment'># Calculate sigma
1367
+ </span> <span class='id identifier rubyid_sigma'>sigma</span> <span class='op'>=</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_volatility'>volatility</span> <span class='op'>&gt;</span> <span class='float'>0.0</span> <span class='op'>?</span>
1368
+ <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_volatility'>volatility</span> <span class='op'>*</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_sqrt'>sqrt</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_years_to_target_date'>years_to_target_date</span><span class='rparen'>)</span> <span class='op'>:</span> <span class='float'>1e-10</span>
1369
+
1370
+ <span class='comment'># Calculate PoP for each range
1371
+ </span> <span class='id identifier rubyid_profit_range'>profit_range</span><span class='period'>.</span><span class='id identifier rubyid_each_with_index'>each_with_index</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_t'>t</span><span class='comma'>,</span> <span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1372
+ <span class='id identifier rubyid_prob'>prob</span> <span class='op'>=</span> <span class='float'>0.0</span>
1373
+
1374
+ <span class='kw'>if</span> <span class='id identifier rubyid_t'>t</span> <span class='op'>!=</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='float'>0.0</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rbracket'>]</span><span class='rbracket'>]</span>
1375
+ <span class='id identifier rubyid_t'>t</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_p_range'>p_range</span><span class='op'>|</span>
1376
+ <span class='comment'># Calculate log values
1377
+ </span> <span class='id identifier rubyid_lval'>lval</span> <span class='op'>=</span> <span class='id identifier rubyid_p_range'>p_range</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>&gt;</span> <span class='float'>0.0</span> <span class='op'>?</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_log'>log</span><span class='lparen'>(</span><span class='id identifier rubyid_p_range'>p_range</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='op'>:</span> <span class='op'>-</span><span class='const'>Float</span><span class='op'>::</span><span class='const'>INFINITY</span>
1378
+ <span class='id identifier rubyid_hval'>hval</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_log'>log</span><span class='lparen'>(</span><span class='id identifier rubyid_p_range'>p_range</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span><span class='rparen'>)</span>
1379
+
1380
+ <span class='comment'># Calculate drift and mean
1381
+ </span> <span class='id identifier rubyid_drift'>drift</span> <span class='op'>=</span> <span class='lparen'>(</span>
1382
+ <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_interest_rate'>interest_rate</span> <span class='op'>-</span>
1383
+ <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_dividend_yield'>dividend_yield</span> <span class='op'>-</span>
1384
+ <span class='float'>0.5</span> <span class='op'>*</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_volatility'>volatility</span> <span class='op'>*</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_volatility'>volatility</span>
1385
+ <span class='rparen'>)</span> <span class='op'>*</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_years_to_target_date'>years_to_target_date</span>
1386
+
1387
+ <span class='id identifier rubyid_m'>m</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_log'>log</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_stock_price'>stock_price</span><span class='rparen'>)</span> <span class='op'>+</span> <span class='id identifier rubyid_drift'>drift</span>
1388
+
1389
+ <span class='comment'># Calculate probability
1390
+ </span> <span class='id identifier rubyid_prob'>prob</span> <span class='op'>+=</span> <span class='const'>Distribution</span><span class='op'>::</span><span class='const'>Normal</span><span class='period'>.</span><span class='id identifier rubyid_cdf'>cdf</span><span class='lparen'>(</span><span class='lparen'>(</span><span class='id identifier rubyid_hval'>hval</span> <span class='op'>-</span> <span class='id identifier rubyid_m'>m</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='id identifier rubyid_sigma'>sigma</span><span class='rparen'>)</span> <span class='op'>-</span> <span class='const'>Distribution</span><span class='op'>::</span><span class='const'>Normal</span><span class='period'>.</span><span class='id identifier rubyid_cdf'>cdf</span><span class='lparen'>(</span><span class='lparen'>(</span><span class='id identifier rubyid_lval'>lval</span> <span class='op'>-</span> <span class='id identifier rubyid_m'>m</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='id identifier rubyid_sigma'>sigma</span><span class='rparen'>)</span>
1391
+ <span class='kw'>end</span>
1392
+ <span class='kw'>end</span>
1393
+
1394
+ <span class='kw'>if</span> <span class='id identifier rubyid_i'>i</span> <span class='op'>==</span> <span class='int'>0</span>
1395
+ <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span> <span class='op'>=</span> <span class='id identifier rubyid_prob'>prob</span>
1396
+ <span class='kw'>else</span>
1397
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span> <span class='op'>=</span> <span class='id identifier rubyid_prob'>prob</span>
1398
+ <span class='kw'>end</span>
1399
+ <span class='kw'>end</span>
1400
+
1401
+ <span class='lbracket'>[</span>
1402
+ <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span><span class='comma'>,</span>
1403
+ <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span><span class='comma'>,</span>
1404
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span><span class='comma'>,</span>
1405
+ <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span>
1406
+ <span class='rbracket'>]</span>
1407
+ <span class='kw'>end</span></pre>
1408
+ </td>
1409
+ </tr>
1410
+ </table>
1411
+ </div>
1412
+
1413
+ <div class="method_details ">
1414
+ <h3 class="signature " id="_get_profit_range-class_method">
1415
+
1416
+ .<strong>_get_profit_range</strong>(s, profit, target = 0.01) &#x21d2; <tt>Array&lt;Array&lt;Array&lt;Float&gt;&gt;&gt;</tt> <span class="extras">(private)</span>
1417
+
1418
+
1419
+
1420
+
1421
+
1422
+ </h3><div class="docstring">
1423
+ <div class="discussion">
1424
+ <p>Find profit/loss ranges</p>
1425
+
1426
+
1427
+ </div>
1428
+ </div>
1429
+ <div class="tags">
1430
+ <p class="tag_title">Parameters:</p>
1431
+ <ul class="param">
1432
+
1433
+ <li>
1434
+
1435
+ <span class='name'>s</span>
1436
+
1437
+
1438
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1439
+
1440
+
1441
+
1442
+ &mdash;
1443
+ <div class='inline'><p>Array of stock prices</p>
1444
+ </div>
1445
+
1446
+ </li>
1447
+
1448
+ <li>
1449
+
1450
+ <span class='name'>profit</span>
1451
+
1452
+
1453
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1454
+
1455
+
1456
+
1457
+ &mdash;
1458
+ <div class='inline'><p>Array of profits</p>
1459
+ </div>
1460
+
1461
+ </li>
1462
+
1463
+ <li>
1464
+
1465
+ <span class='name'>target</span>
1466
+
1467
+
1468
+ <span class='type'>(<tt>Float</tt>)</span>
1469
+
1470
+
1471
+ <em class="default">(defaults to: <tt>0.01</tt>)</em>
1472
+
1473
+
1474
+ &mdash;
1475
+ <div class='inline'><p>Profit target</p>
1476
+ </div>
1477
+
1478
+ </li>
1479
+
1480
+ </ul>
1481
+
1482
+ <p class="tag_title">Returns:</p>
1483
+ <ul class="return">
1484
+
1485
+ <li>
1486
+
1487
+
1488
+ <span class='type'>(<tt>Array&lt;Array&lt;Array&lt;Float&gt;&gt;&gt;</tt>)</span>
1489
+
1490
+
1491
+
1492
+ &mdash;
1493
+ <div class='inline'><p>Profit and loss ranges</p>
1494
+ </div>
1495
+
1496
+ </li>
1497
+
1498
+ </ul>
1499
+
1500
+ </div><table class="source_code">
1501
+ <tr>
1502
+ <td>
1503
+ <pre class="lines">
1504
+
1505
+
1506
+ 342
1507
+ 343
1508
+ 344
1509
+ 345
1510
+ 346
1511
+ 347
1512
+ 348
1513
+ 349
1514
+ 350
1515
+ 351
1516
+ 352
1517
+ 353
1518
+ 354
1519
+ 355
1520
+ 356
1521
+ 357
1522
+ 358
1523
+ 359
1524
+ 360
1525
+ 361
1526
+ 362
1527
+ 363
1528
+ 364
1529
+ 365
1530
+ 366
1531
+ 367
1532
+ 368
1533
+ 369
1534
+ 370
1535
+ 371
1536
+ 372
1537
+ 373
1538
+ 374
1539
+ 375
1540
+ 376
1541
+ 377
1542
+ 378
1543
+ 379
1544
+ 380
1545
+ 381
1546
+ 382
1547
+ 383
1548
+ 384
1549
+ 385
1550
+ 386
1551
+ 387
1552
+ 388
1553
+ 389
1554
+ 390
1555
+ 391
1556
+ 392
1557
+ 393
1558
+ 394
1559
+ 395
1560
+ 396
1561
+ 397
1562
+ 398
1563
+ 399
1564
+ 400
1565
+ 401
1566
+ 402
1567
+ 403
1568
+ 404
1569
+ 405
1570
+ 406
1571
+ 407
1572
+ 408
1573
+ 409
1574
+ 410</pre>
1575
+ </td>
1576
+ <td>
1577
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 342</span>
1578
+
1579
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_profit_range'>_get_profit_range</span><span class='lparen'>(</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_profit'>profit</span><span class='comma'>,</span> <span class='id identifier rubyid_target'>target</span> <span class='op'>=</span> <span class='float'>0.01</span><span class='rparen'>)</span>
1580
+ <span class='id identifier rubyid_profit_range'>profit_range</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1581
+ <span class='id identifier rubyid_loss_range'>loss_range</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1582
+
1583
+ <span class='comment'># Find where profit crosses target
1584
+ </span> <span class='id identifier rubyid_crossings'>crossings</span> <span class='op'>=</span> <span class='id identifier rubyid__get_sign_changes'>_get_sign_changes</span><span class='lparen'>(</span><span class='id identifier rubyid_profit'>profit</span><span class='comma'>,</span> <span class='id identifier rubyid_target'>target</span><span class='rparen'>)</span>
1585
+ <span class='id identifier rubyid_n_crossings'>n_crossings</span> <span class='op'>=</span> <span class='id identifier rubyid_crossings'>crossings</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span>
1586
+
1587
+ <span class='comment'># Handle case with no crossings
1588
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_n_crossings'>n_crossings</span> <span class='op'>==</span> <span class='int'>0</span>
1589
+ <span class='kw'>if</span> <span class='id identifier rubyid_profit'>profit</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>&gt;=</span> <span class='id identifier rubyid_target'>target</span>
1590
+ <span class='kw'>return</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='lbracket'>[</span><span class='float'>0.0</span><span class='comma'>,</span> <span class='const'>Float</span><span class='op'>::</span><span class='const'>INFINITY</span><span class='rbracket'>]</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='float'>0.0</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rbracket'>]</span><span class='rbracket'>]</span><span class='rbracket'>]</span>
1591
+ <span class='kw'>else</span>
1592
+ <span class='kw'>return</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='lbracket'>[</span><span class='float'>0.0</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rbracket'>]</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='float'>0.0</span><span class='comma'>,</span> <span class='const'>Float</span><span class='op'>::</span><span class='const'>INFINITY</span><span class='rbracket'>]</span><span class='rbracket'>]</span><span class='rbracket'>]</span>
1593
+ <span class='kw'>end</span>
1594
+ <span class='kw'>end</span>
1595
+
1596
+ <span class='comment'># Find profit and loss ranges
1597
+ </span> <span class='id identifier rubyid_lb_profit'>lb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_hb_profit'>hb_profit</span> <span class='op'>=</span> <span class='kw'>nil</span>
1598
+ <span class='id identifier rubyid_lb_loss'>lb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_hb_loss'>hb_loss</span> <span class='op'>=</span> <span class='kw'>nil</span>
1599
+
1600
+ <span class='id identifier rubyid_crossings'>crossings</span><span class='period'>.</span><span class='id identifier rubyid_each_with_index'>each_with_index</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_index'>index</span><span class='comma'>,</span> <span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1601
+ <span class='kw'>if</span> <span class='id identifier rubyid_i'>i</span> <span class='op'>==</span> <span class='int'>0</span>
1602
+ <span class='kw'>if</span> <span class='id identifier rubyid_profit'>profit</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span> <span class='op'>&lt;</span> <span class='id identifier rubyid_profit'>profit</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1603
+ <span class='id identifier rubyid_lb_profit'>lb_profit</span> <span class='op'>=</span> <span class='float'>0.0</span>
1604
+ <span class='id identifier rubyid_hb_profit'>hb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1605
+ <span class='id identifier rubyid_lb_loss'>lb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span>
1606
+
1607
+ <span class='id identifier rubyid_hb_loss'>hb_loss</span> <span class='op'>=</span> <span class='const'>Float</span><span class='op'>::</span><span class='const'>INFINITY</span> <span class='kw'>if</span> <span class='id identifier rubyid_n_crossings'>n_crossings</span> <span class='op'>==</span> <span class='int'>1</span>
1608
+ <span class='kw'>else</span>
1609
+ <span class='id identifier rubyid_lb_profit'>lb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span>
1610
+ <span class='id identifier rubyid_lb_loss'>lb_loss</span> <span class='op'>=</span> <span class='float'>0.0</span>
1611
+ <span class='id identifier rubyid_hb_loss'>hb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1612
+
1613
+ <span class='id identifier rubyid_hb_profit'>hb_profit</span> <span class='op'>=</span> <span class='const'>Float</span><span class='op'>::</span><span class='const'>INFINITY</span> <span class='kw'>if</span> <span class='id identifier rubyid_n_crossings'>n_crossings</span> <span class='op'>==</span> <span class='int'>1</span>
1614
+ <span class='kw'>end</span>
1615
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_i'>i</span> <span class='op'>==</span> <span class='id identifier rubyid_n_crossings'>n_crossings</span> <span class='op'>-</span> <span class='int'>1</span>
1616
+ <span class='kw'>if</span> <span class='id identifier rubyid_profit'>profit</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span> <span class='op'>&gt;</span> <span class='id identifier rubyid_profit'>profit</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1617
+ <span class='id identifier rubyid_lb_profit'>lb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span>
1618
+ <span class='id identifier rubyid_hb_profit'>hb_profit</span> <span class='op'>=</span> <span class='const'>Float</span><span class='op'>::</span><span class='const'>INFINITY</span>
1619
+ <span class='id identifier rubyid_hb_loss'>hb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1620
+ <span class='kw'>else</span>
1621
+ <span class='id identifier rubyid_hb_profit'>hb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1622
+ <span class='id identifier rubyid_lb_loss'>lb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span>
1623
+ <span class='id identifier rubyid_hb_loss'>hb_loss</span> <span class='op'>=</span> <span class='const'>Float</span><span class='op'>::</span><span class='const'>INFINITY</span>
1624
+ <span class='kw'>end</span>
1625
+ <span class='kw'>else</span>
1626
+ <span class='kw'>if</span> <span class='id identifier rubyid_profit'>profit</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span> <span class='op'>&gt;</span> <span class='id identifier rubyid_profit'>profit</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1627
+ <span class='id identifier rubyid_lb_profit'>lb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span>
1628
+ <span class='id identifier rubyid_hb_loss'>hb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1629
+ <span class='kw'>else</span>
1630
+ <span class='id identifier rubyid_hb_profit'>hb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span> <span class='op'>-</span> <span class='int'>1</span><span class='rbracket'>]</span>
1631
+ <span class='id identifier rubyid_lb_loss'>lb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_s'>s</span><span class='lbracket'>[</span><span class='id identifier rubyid_index'>index</span><span class='rbracket'>]</span>
1632
+ <span class='kw'>end</span>
1633
+ <span class='kw'>end</span>
1634
+
1635
+ <span class='kw'>if</span> <span class='id identifier rubyid_lb_profit'>lb_profit</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_hb_profit'>hb_profit</span>
1636
+ <span class='id identifier rubyid_profit_range'>profit_range</span> <span class='op'>&lt;&lt;</span> <span class='lbracket'>[</span><span class='id identifier rubyid_lb_profit'>lb_profit</span><span class='comma'>,</span> <span class='id identifier rubyid_hb_profit'>hb_profit</span><span class='rbracket'>]</span>
1637
+ <span class='id identifier rubyid_lb_profit'>lb_profit</span> <span class='op'>=</span> <span class='id identifier rubyid_hb_profit'>hb_profit</span> <span class='op'>=</span> <span class='kw'>nil</span>
1638
+ <span class='kw'>end</span>
1639
+
1640
+ <span class='kw'>if</span> <span class='id identifier rubyid_lb_loss'>lb_loss</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_hb_loss'>hb_loss</span>
1641
+ <span class='id identifier rubyid_loss_range'>loss_range</span> <span class='op'>&lt;&lt;</span> <span class='lbracket'>[</span><span class='id identifier rubyid_lb_loss'>lb_loss</span><span class='comma'>,</span> <span class='id identifier rubyid_hb_loss'>hb_loss</span><span class='rbracket'>]</span>
1642
+ <span class='id identifier rubyid_lb_loss'>lb_loss</span> <span class='op'>=</span> <span class='id identifier rubyid_hb_loss'>hb_loss</span> <span class='op'>=</span> <span class='kw'>nil</span>
1643
+ <span class='kw'>end</span>
1644
+ <span class='kw'>end</span>
1645
+
1646
+ <span class='lbracket'>[</span><span class='id identifier rubyid_profit_range'>profit_range</span><span class='comma'>,</span> <span class='id identifier rubyid_loss_range'>loss_range</span><span class='rbracket'>]</span>
1647
+ <span class='kw'>end</span></pre>
1648
+ </td>
1649
+ </tr>
1650
+ </table>
1651
+ </div>
1652
+
1653
+ <div class="method_details ">
1654
+ <h3 class="signature " id="_get_sign_changes-class_method">
1655
+
1656
+ .<strong>_get_sign_changes</strong>(profit, target) &#x21d2; <tt>Array&lt;Integer&gt;</tt> <span class="extras">(private)</span>
1657
+
1658
+
1659
+
1660
+
1661
+
1662
+ </h3><div class="docstring">
1663
+ <div class="discussion">
1664
+ <p>Find indices where profit crosses target</p>
1665
+
1666
+
1667
+ </div>
1668
+ </div>
1669
+ <div class="tags">
1670
+ <p class="tag_title">Parameters:</p>
1671
+ <ul class="param">
1672
+
1673
+ <li>
1674
+
1675
+ <span class='name'>profit</span>
1676
+
1677
+
1678
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1679
+
1680
+
1681
+
1682
+ &mdash;
1683
+ <div class='inline'><p>Array of profits</p>
1684
+ </div>
1685
+
1686
+ </li>
1687
+
1688
+ <li>
1689
+
1690
+ <span class='name'>target</span>
1691
+
1692
+
1693
+ <span class='type'>(<tt>Float</tt>)</span>
1694
+
1695
+
1696
+
1697
+ &mdash;
1698
+ <div class='inline'><p>Profit target</p>
1699
+ </div>
1700
+
1701
+ </li>
1702
+
1703
+ </ul>
1704
+
1705
+ <p class="tag_title">Returns:</p>
1706
+ <ul class="return">
1707
+
1708
+ <li>
1709
+
1710
+
1711
+ <span class='type'>(<tt>Array&lt;Integer&gt;</tt>)</span>
1712
+
1713
+
1714
+
1715
+ &mdash;
1716
+ <div class='inline'><p>Array of indices</p>
1717
+ </div>
1718
+
1719
+ </li>
1720
+
1721
+ </ul>
1722
+
1723
+ </div><table class="source_code">
1724
+ <tr>
1725
+ <td>
1726
+ <pre class="lines">
1727
+
1728
+
1729
+ 416
1730
+ 417
1731
+ 418
1732
+ 419
1733
+ 420
1734
+ 421
1735
+ 422
1736
+ 423
1737
+ 424
1738
+ 425
1739
+ 426
1740
+ 427
1741
+ 428
1742
+ 429
1743
+ 430
1744
+ 431</pre>
1745
+ </td>
1746
+ <td>
1747
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 416</span>
1748
+
1749
+ <span class='kw'>def</span> <span class='id identifier rubyid__get_sign_changes'>_get_sign_changes</span><span class='lparen'>(</span><span class='id identifier rubyid_profit'>profit</span><span class='comma'>,</span> <span class='id identifier rubyid_target'>target</span><span class='rparen'>)</span>
1750
+ <span class='comment'># Subtract target and add small epsilon
1751
+ </span> <span class='id identifier rubyid_p_temp'>p_temp</span> <span class='op'>=</span> <span class='id identifier rubyid_profit'>profit</span> <span class='op'>-</span> <span class='id identifier rubyid_target'>target</span> <span class='op'>+</span> <span class='float'>1e-10</span>
1752
+
1753
+ <span class='comment'># Get signs (convert to array first since Numo::DFloat doesn&#39;t have collect)
1754
+ </span> <span class='id identifier rubyid_signs_1'>signs_1</span> <span class='op'>=</span> <span class='id identifier rubyid_p_temp'>p_temp</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>...</span><span class='op'>-</span><span class='int'>1</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_a'>to_a</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_v'>v</span><span class='op'>|</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='op'>?</span> <span class='int'>1</span> <span class='op'>:</span> <span class='op'>-</span><span class='int'>1</span> <span class='rbrace'>}</span>
1755
+ <span class='id identifier rubyid_signs_2'>signs_2</span> <span class='op'>=</span> <span class='id identifier rubyid_p_temp'>p_temp</span><span class='lbracket'>[</span><span class='int'>1</span><span class='op'>..</span><span class='op'>-</span><span class='int'>1</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_a'>to_a</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_v'>v</span><span class='op'>|</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='op'>?</span> <span class='int'>1</span> <span class='op'>:</span> <span class='op'>-</span><span class='int'>1</span> <span class='rbrace'>}</span>
1756
+
1757
+ <span class='comment'># Find sign changes
1758
+ </span> <span class='id identifier rubyid_changes'>changes</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1759
+ <span class='id identifier rubyid_signs_1'>signs_1</span><span class='period'>.</span><span class='id identifier rubyid_each_with_index'>each_with_index</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_s1'>s1</span><span class='comma'>,</span> <span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1760
+ <span class='id identifier rubyid_changes'>changes</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_i'>i</span> <span class='op'>+</span> <span class='int'>1</span> <span class='kw'>if</span> <span class='id identifier rubyid_s1'>s1</span> <span class='op'>*</span> <span class='id identifier rubyid_signs_2'>signs_2</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span> <span class='op'>&lt;</span> <span class='int'>0</span>
1761
+ <span class='kw'>end</span>
1762
+
1763
+ <span class='id identifier rubyid_changes'>changes</span>
1764
+ <span class='kw'>end</span></pre>
1765
+ </td>
1766
+ </tr>
1767
+ </table>
1768
+ </div>
1769
+
1770
+ <div class="method_details ">
1771
+ <h3 class="signature " id="create_price_array-class_method">
1772
+
1773
+ .<strong>create_price_array</strong>(inputs_data, n: 100_000, seed: nil) &#x21d2; <tt>Numo::DFloat</tt>
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+ </h3><div class="docstring">
1780
+ <div class="discussion">
1781
+ <p>Create price array for simulations</p>
1782
+
1783
+
1784
+ </div>
1785
+ </div>
1786
+ <div class="tags">
1787
+ <p class="tag_title">Parameters:</p>
1788
+ <ul class="param">
1789
+
1790
+ <li>
1791
+
1792
+ <span class='name'>inputs_data</span>
1793
+
1794
+
1795
+ <span class='type'>(<tt>Hash</tt>, <tt><span class='object_link'><a href="Models/BlackScholesModelInputs.html" title="OptionLab::Models::BlackScholesModelInputs (class)">Models::BlackScholesModelInputs</a></span></tt>, <tt><span class='object_link'><a href="Models/LaplaceInputs.html" title="OptionLab::Models::LaplaceInputs (class)">Models::LaplaceInputs</a></span></tt>)</span>
1796
+
1797
+
1798
+
1799
+ &mdash;
1800
+ <div class='inline'><p>Model inputs</p>
1801
+ </div>
1802
+
1803
+ </li>
1804
+
1805
+ <li>
1806
+
1807
+ <span class='name'>n</span>
1808
+
1809
+
1810
+ <span class='type'>(<tt>Integer</tt>)</span>
1811
+
1812
+
1813
+ <em class="default">(defaults to: <tt>100_000</tt>)</em>
1814
+
1815
+
1816
+ &mdash;
1817
+ <div class='inline'><p>Number of prices to generate</p>
1818
+ </div>
1819
+
1820
+ </li>
1821
+
1822
+ <li>
1823
+
1824
+ <span class='name'>seed</span>
1825
+
1826
+
1827
+ <span class='type'>(<tt>Integer</tt>, <tt>nil</tt>)</span>
1828
+
1829
+
1830
+ <em class="default">(defaults to: <tt>nil</tt>)</em>
1831
+
1832
+
1833
+ &mdash;
1834
+ <div class='inline'><p>Random seed</p>
1835
+ </div>
1836
+
1837
+ </li>
1838
+
1839
+ </ul>
1840
+
1841
+ <p class="tag_title">Returns:</p>
1842
+ <ul class="return">
1843
+
1844
+ <li>
1845
+
1846
+
1847
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1848
+
1849
+
1850
+
1851
+ &mdash;
1852
+ <div class='inline'><p>Array of prices</p>
1853
+ </div>
1854
+
1855
+ </li>
1856
+
1857
+ </ul>
1858
+
1859
+ </div><table class="source_code">
1860
+ <tr>
1861
+ <td>
1862
+ <pre class="lines">
1863
+
1864
+
1865
+ 169
1866
+ 170
1867
+ 171
1868
+ 172
1869
+ 173
1870
+ 174
1871
+ 175
1872
+ 176
1873
+ 177
1874
+ 178
1875
+ 179
1876
+ 180
1877
+ 181
1878
+ 182
1879
+ 183
1880
+ 184
1881
+ 185
1882
+ 186
1883
+ 187
1884
+ 188
1885
+ 189
1886
+ 190
1887
+ 191
1888
+ 192
1889
+ 193
1890
+ 194
1891
+ 195
1892
+ 196
1893
+ 197
1894
+ 198
1895
+ 199</pre>
1896
+ </td>
1897
+ <td>
1898
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 169</span>
1899
+
1900
+ <span class='kw'>def</span> <span class='id identifier rubyid_create_price_array'>create_price_array</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='comma'>,</span> <span class='label'>n:</span> <span class='int'>100_000</span><span class='comma'>,</span> <span class='label'>seed:</span> <span class='kw'>nil</span><span class='rparen'>)</span>
1901
+ <span class='comment'># Set random seed if provided
1902
+ </span> <span class='const'>Kernel</span><span class='period'>.</span><span class='id identifier rubyid_srand'>srand</span><span class='lparen'>(</span><span class='id identifier rubyid_seed'>seed</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_seed'>seed</span>
1903
+
1904
+ <span class='comment'># Convert hash to appropriate model if needed
1905
+ </span> <span class='id identifier rubyid_inputs'>inputs</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Hash</span><span class='rparen'>)</span>
1906
+ <span class='kw'>if</span> <span class='qwords_beg'>%w[</span><span class='tstring_content'>black-scholes</span><span class='words_sep'> </span><span class='tstring_content'>normal</span><span class='tstring_end'>]</span></span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='lbracket'>[</span><span class='symbol'>:model</span><span class='rbracket'>]</span> <span class='op'>||</span> <span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>model</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
1907
+ <span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models/BlackScholesModelInputs.html" title="OptionLab::Models::BlackScholesModelInputs (class)">BlackScholesModelInputs</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Models/BlackScholesModelInputs.html#initialize-instance_method" title="OptionLab::Models::BlackScholesModelInputs#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='rparen'>)</span>
1908
+ <span class='kw'>elsif</span> <span class='lparen'>(</span><span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='lbracket'>[</span><span class='symbol'>:model</span><span class='rbracket'>]</span> <span class='op'>||</span> <span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>model</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>laplace</span><span class='tstring_end'>&#39;</span></span>
1909
+ <span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models/LaplaceInputs.html" title="OptionLab::Models::LaplaceInputs (class)">LaplaceInputs</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Models/LaplaceInputs.html#initialize-instance_method" title="OptionLab::Models::LaplaceInputs#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='rparen'>)</span>
1910
+ <span class='kw'>else</span>
1911
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Invalid model type!</span><span class='tstring_end'>&quot;</span></span>
1912
+ <span class='kw'>end</span>
1913
+ <span class='kw'>else</span>
1914
+ <span class='id identifier rubyid_inputs_data'>inputs_data</span>
1915
+ <span class='kw'>end</span>
1916
+
1917
+ <span class='comment'># Generate array based on model
1918
+ </span> <span class='id identifier rubyid_arr'>arr</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models/BlackScholesModelInputs.html" title="OptionLab::Models::BlackScholesModelInputs (class)">BlackScholesModelInputs</a></span></span><span class='rparen'>)</span>
1919
+ <span class='id identifier rubyid__get_array_price_from_BS'>_get_array_price_from_BS</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span><span class='rparen'>)</span>
1920
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_inputs'>inputs</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models/LaplaceInputs.html" title="OptionLab::Models::LaplaceInputs (class)">LaplaceInputs</a></span></span><span class='rparen'>)</span>
1921
+ <span class='id identifier rubyid__get_array_price_from_laplace'>_get_array_price_from_laplace</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs'>inputs</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span><span class='rparen'>)</span>
1922
+ <span class='kw'>else</span>
1923
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Invalid inputs type!</span><span class='tstring_end'>&quot;</span></span>
1924
+ <span class='kw'>end</span>
1925
+
1926
+ <span class='comment'># Reset random seed
1927
+ </span> <span class='const'>Kernel</span><span class='period'>.</span><span class='id identifier rubyid_srand'>srand</span> <span class='kw'>if</span> <span class='id identifier rubyid_seed'>seed</span>
1928
+
1929
+ <span class='id identifier rubyid_arr'>arr</span>
1930
+ <span class='kw'>end</span></pre>
1931
+ </td>
1932
+ </tr>
1933
+ </table>
1934
+ </div>
1935
+
1936
+ <div class="method_details ">
1937
+ <h3 class="signature " id="create_price_seq-class_method">
1938
+
1939
+ .<strong>create_price_seq</strong>(min_price, max_price) &#x21d2; <tt>Numo::DFloat</tt>
1940
+
1941
+
1942
+
1943
+
1944
+
1945
+ </h3><div class="docstring">
1946
+ <div class="discussion">
1947
+ <p>Generate a sequence of stock prices from min to max with $0.01 increment</p>
1948
+
1949
+
1950
+ </div>
1951
+ </div>
1952
+ <div class="tags">
1953
+ <p class="tag_title">Parameters:</p>
1954
+ <ul class="param">
1955
+
1956
+ <li>
1957
+
1958
+ <span class='name'>min_price</span>
1959
+
1960
+
1961
+ <span class='type'>(<tt>Float</tt>)</span>
1962
+
1963
+
1964
+
1965
+ &mdash;
1966
+ <div class='inline'><p>Minimum stock price</p>
1967
+ </div>
1968
+
1969
+ </li>
1970
+
1971
+ <li>
1972
+
1973
+ <span class='name'>max_price</span>
1974
+
1975
+
1976
+ <span class='type'>(<tt>Float</tt>)</span>
1977
+
1978
+
1979
+
1980
+ &mdash;
1981
+ <div class='inline'><p>Maximum stock price</p>
1982
+ </div>
1983
+
1984
+ </li>
1985
+
1986
+ </ul>
1987
+
1988
+ <p class="tag_title">Returns:</p>
1989
+ <ul class="return">
1990
+
1991
+ <li>
1992
+
1993
+
1994
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
1995
+
1996
+
1997
+
1998
+ &mdash;
1999
+ <div class='inline'><p>Array of sequential stock prices</p>
2000
+ </div>
2001
+
2002
+ </li>
2003
+
2004
+ </ul>
2005
+
2006
+ </div><table class="source_code">
2007
+ <tr>
2008
+ <td>
2009
+ <pre class="lines">
2010
+
2011
+
2012
+ 100
2013
+ 101
2014
+ 102
2015
+ 103
2016
+ 104
2017
+ 105
2018
+ 106
2019
+ 107
2020
+ 108
2021
+ 109
2022
+ 110
2023
+ 111
2024
+ 112
2025
+ 113
2026
+ 114
2027
+ 115
2028
+ 116
2029
+ 117
2030
+ 118
2031
+ 119
2032
+ 120
2033
+ 121</pre>
2034
+ </td>
2035
+ <td>
2036
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 100</span>
2037
+
2038
+ <span class='kw'>def</span> <span class='id identifier rubyid_create_price_seq'>create_price_seq</span><span class='lparen'>(</span><span class='id identifier rubyid_min_price'>min_price</span><span class='comma'>,</span> <span class='id identifier rubyid_max_price'>max_price</span><span class='rparen'>)</span>
2039
+ <span class='id identifier rubyid_cache_key'>cache_key</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_min_price'>min_price</span><span class='embexpr_end'>}</span><span class='tstring_content'>-</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_max_price'>max_price</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
2040
+
2041
+ <span class='comment'># Return cached result if available
2042
+ </span> <span class='kw'>return</span> <span class='ivar'>@price_seq_cache</span><span class='lbracket'>[</span><span class='id identifier rubyid_cache_key'>cache_key</span><span class='rbracket'>]</span> <span class='kw'>if</span> <span class='ivar'>@price_seq_cache</span><span class='period'>.</span><span class='id identifier rubyid_key?'>key?</span><span class='lparen'>(</span><span class='id identifier rubyid_cache_key'>cache_key</span><span class='rparen'>)</span>
2043
+
2044
+ <span class='kw'>if</span> <span class='id identifier rubyid_max_price'>max_price</span> <span class='op'>&gt;</span> <span class='id identifier rubyid_min_price'>min_price</span>
2045
+ <span class='comment'># Create array with increment 0.01
2046
+ </span> <span class='id identifier rubyid_steps'>steps</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='lparen'>(</span><span class='id identifier rubyid_max_price'>max_price</span> <span class='op'>-</span> <span class='id identifier rubyid_min_price'>min_price</span><span class='rparen'>)</span> <span class='op'>*</span> <span class='int'>100</span> <span class='op'>+</span> <span class='int'>1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span>
2047
+ <span class='id identifier rubyid_arr'>arr</span> <span class='op'>=</span> <span class='const'>Numo</span><span class='op'>::</span><span class='const'>DFloat</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_steps'>steps</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_seq'>seq</span><span class='lparen'>(</span><span class='id identifier rubyid_min_price'>min_price</span><span class='comma'>,</span> <span class='float'>0.01</span><span class='rparen'>)</span>
2048
+
2049
+ <span class='comment'># Round to 2 decimal places (Numo::DFloat doesn&#39;t support arguments to round)
2050
+ </span> <span class='id identifier rubyid_arr'>arr</span> <span class='op'>=</span> <span class='id identifier rubyid_arr'>arr</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span>
2051
+
2052
+ <span class='comment'># Cache the result
2053
+ </span> <span class='ivar'>@price_seq_cache</span><span class='lbracket'>[</span><span class='id identifier rubyid_cache_key'>cache_key</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_arr'>arr</span>
2054
+
2055
+ <span class='id identifier rubyid_arr'>arr</span>
2056
+ <span class='kw'>else</span>
2057
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Maximum price cannot be less than minimum price!</span><span class='tstring_end'>&quot;</span></span>
2058
+ <span class='kw'>end</span>
2059
+ <span class='kw'>end</span></pre>
2060
+ </td>
2061
+ </tr>
2062
+ </table>
2063
+ </div>
2064
+
2065
+ <div class="method_details ">
2066
+ <h3 class="signature " id="get_pl_profile-class_method">
2067
+
2068
+ .<strong>get_pl_profile</strong>(option_type, action, x, val, n, s, commission = 0.0) &#x21d2; <tt>Array&lt;Numo::DFloat, Float&gt;</tt>
2069
+
2070
+
2071
+
2072
+
2073
+
2074
+ </h3><div class="docstring">
2075
+ <div class="discussion">
2076
+ <p>Get profit/loss profile and cost of an options trade at expiration</p>
2077
+
2078
+
2079
+ </div>
2080
+ </div>
2081
+ <div class="tags">
2082
+ <p class="tag_title">Parameters:</p>
2083
+ <ul class="param">
2084
+
2085
+ <li>
2086
+
2087
+ <span class='name'>option_type</span>
2088
+
2089
+
2090
+ <span class='type'>(<tt>String</tt>)</span>
2091
+
2092
+
2093
+
2094
+ &mdash;
2095
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
2096
+ </div>
2097
+
2098
+ </li>
2099
+
2100
+ <li>
2101
+
2102
+ <span class='name'>action</span>
2103
+
2104
+
2105
+ <span class='type'>(<tt>String</tt>)</span>
2106
+
2107
+
2108
+
2109
+ &mdash;
2110
+ <div class='inline'><p>&#39;buy&#39; or &#39;sell&#39;</p>
2111
+ </div>
2112
+
2113
+ </li>
2114
+
2115
+ <li>
2116
+
2117
+ <span class='name'>x</span>
2118
+
2119
+
2120
+ <span class='type'>(<tt>Float</tt>)</span>
2121
+
2122
+
2123
+
2124
+ &mdash;
2125
+ <div class='inline'><p>Strike price</p>
2126
+ </div>
2127
+
2128
+ </li>
2129
+
2130
+ <li>
2131
+
2132
+ <span class='name'>val</span>
2133
+
2134
+
2135
+ <span class='type'>(<tt>Float</tt>)</span>
2136
+
2137
+
2138
+
2139
+ &mdash;
2140
+ <div class='inline'><p>Option price</p>
2141
+ </div>
2142
+
2143
+ </li>
2144
+
2145
+ <li>
2146
+
2147
+ <span class='name'>n</span>
2148
+
2149
+
2150
+ <span class='type'>(<tt>Integer</tt>)</span>
2151
+
2152
+
2153
+
2154
+ &mdash;
2155
+ <div class='inline'><p>Number of options</p>
2156
+ </div>
2157
+
2158
+ </li>
2159
+
2160
+ <li>
2161
+
2162
+ <span class='name'>s</span>
2163
+
2164
+
2165
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
2166
+
2167
+
2168
+
2169
+ &mdash;
2170
+ <div class='inline'><p>Array of stock prices</p>
2171
+ </div>
2172
+
2173
+ </li>
2174
+
2175
+ <li>
2176
+
2177
+ <span class='name'>commission</span>
2178
+
2179
+
2180
+ <span class='type'>(<tt>Float</tt>)</span>
2181
+
2182
+
2183
+ <em class="default">(defaults to: <tt>0.0</tt>)</em>
2184
+
2185
+
2186
+ &mdash;
2187
+ <div class='inline'><p>Brokerage commission</p>
2188
+ </div>
2189
+
2190
+ </li>
2191
+
2192
+ </ul>
2193
+
2194
+ <p class="tag_title">Returns:</p>
2195
+ <ul class="return">
2196
+
2197
+ <li>
2198
+
2199
+
2200
+ <span class='type'>(<tt>Array&lt;Numo::DFloat, Float&gt;</tt>)</span>
2201
+
2202
+
2203
+
2204
+ &mdash;
2205
+ <div class='inline'><p>P/L profile and cost</p>
2206
+ </div>
2207
+
2208
+ </li>
2209
+
2210
+ </ul>
2211
+
2212
+ </div><table class="source_code">
2213
+ <tr>
2214
+ <td>
2215
+ <pre class="lines">
2216
+
2217
+
2218
+ 21
2219
+ 22
2220
+ 23
2221
+ 24
2222
+ 25
2223
+ 26
2224
+ 27
2225
+ 28
2226
+ 29
2227
+ 30
2228
+ 31
2229
+ 32
2230
+ 33
2231
+ 34
2232
+ 35
2233
+ 36
2234
+ 37
2235
+ 38</pre>
2236
+ </td>
2237
+ <td>
2238
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 21</span>
2239
+
2240
+ <span class='kw'>def</span> <span class='id identifier rubyid_get_pl_profile'>get_pl_profile</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_action'>action</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='comma'>,</span> <span class='id identifier rubyid_val'>val</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_commission'>commission</span> <span class='op'>=</span> <span class='float'>0.0</span><span class='rparen'>)</span>
2241
+ <span class='kw'>if</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>buy</span><span class='tstring_end'>&#39;</span></span>
2242
+ <span class='id identifier rubyid_cost'>cost</span> <span class='op'>=</span> <span class='op'>-</span><span class='id identifier rubyid_val'>val</span>
2243
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>sell</span><span class='tstring_end'>&#39;</span></span>
2244
+ <span class='id identifier rubyid_cost'>cost</span> <span class='op'>=</span> <span class='id identifier rubyid_val'>val</span>
2245
+ <span class='kw'>else</span>
2246
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Action must be either &#39;buy&#39; or &#39;sell&#39;!</span><span class='tstring_end'>&quot;</span></span>
2247
+ <span class='kw'>end</span>
2248
+
2249
+ <span class='kw'>if</span> <span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models.html#OPTION_TYPES-constant" title="OptionLab::Models::OPTION_TYPES (constant)">OPTION_TYPES</a></span></span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='rparen'>)</span>
2250
+ <span class='lbracket'>[</span>
2251
+ <span class='id identifier rubyid_n'>n</span> <span class='op'>*</span> <span class='id identifier rubyid__get_pl_option'>_get_pl_option</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_val'>val</span><span class='comma'>,</span> <span class='id identifier rubyid_action'>action</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span> <span class='op'>-</span> <span class='id identifier rubyid_commission'>commission</span><span class='comma'>,</span>
2252
+ <span class='id identifier rubyid_n'>n</span> <span class='op'>*</span> <span class='id identifier rubyid_cost'>cost</span> <span class='op'>-</span> <span class='id identifier rubyid_commission'>commission</span>
2253
+ <span class='rbracket'>]</span>
2254
+ <span class='kw'>else</span>
2255
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option type must be either &#39;call&#39; or &#39;put&#39;!</span><span class='tstring_end'>&quot;</span></span>
2256
+ <span class='kw'>end</span>
2257
+ <span class='kw'>end</span></pre>
2258
+ </td>
2259
+ </tr>
2260
+ </table>
2261
+ </div>
2262
+
2263
+ <div class="method_details ">
2264
+ <h3 class="signature " id="get_pl_profile_bs-class_method">
2265
+
2266
+ .<strong>get_pl_profile_bs</strong>(option_type, action, x, val, r, target_to_maturity_years, volatility, n, s, y = 0.0, commission = 0.0) &#x21d2; <tt>Array&lt;Numo::DFloat, Float&gt;</tt>
2267
+
2268
+
2269
+
2270
+
2271
+
2272
+ </h3><div class="docstring">
2273
+ <div class="discussion">
2274
+ <p>Get profit/loss profile and cost of an options trade before expiration using Black-Scholes</p>
2275
+
2276
+
2277
+ </div>
2278
+ </div>
2279
+ <div class="tags">
2280
+ <p class="tag_title">Parameters:</p>
2281
+ <ul class="param">
2282
+
2283
+ <li>
2284
+
2285
+ <span class='name'>option_type</span>
2286
+
2287
+
2288
+ <span class='type'>(<tt>String</tt>)</span>
2289
+
2290
+
2291
+
2292
+ &mdash;
2293
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
2294
+ </div>
2295
+
2296
+ </li>
2297
+
2298
+ <li>
2299
+
2300
+ <span class='name'>action</span>
2301
+
2302
+
2303
+ <span class='type'>(<tt>String</tt>)</span>
2304
+
2305
+
2306
+
2307
+ &mdash;
2308
+ <div class='inline'><p>&#39;buy&#39; or &#39;sell&#39;</p>
2309
+ </div>
2310
+
2311
+ </li>
2312
+
2313
+ <li>
2314
+
2315
+ <span class='name'>x</span>
2316
+
2317
+
2318
+ <span class='type'>(<tt>Float</tt>)</span>
2319
+
2320
+
2321
+
2322
+ &mdash;
2323
+ <div class='inline'><p>Strike price</p>
2324
+ </div>
2325
+
2326
+ </li>
2327
+
2328
+ <li>
2329
+
2330
+ <span class='name'>val</span>
2331
+
2332
+
2333
+ <span class='type'>(<tt>Float</tt>)</span>
2334
+
2335
+
2336
+
2337
+ &mdash;
2338
+ <div class='inline'><p>Option price</p>
2339
+ </div>
2340
+
2341
+ </li>
2342
+
2343
+ <li>
2344
+
2345
+ <span class='name'>r</span>
2346
+
2347
+
2348
+ <span class='type'>(<tt>Float</tt>)</span>
2349
+
2350
+
2351
+
2352
+ &mdash;
2353
+ <div class='inline'><p>Risk-free interest rate</p>
2354
+ </div>
2355
+
2356
+ </li>
2357
+
2358
+ <li>
2359
+
2360
+ <span class='name'>target_to_maturity_years</span>
2361
+
2362
+
2363
+ <span class='type'>(<tt>Float</tt>)</span>
2364
+
2365
+
2366
+
2367
+ &mdash;
2368
+ <div class='inline'><p>Time remaining to maturity from target date</p>
2369
+ </div>
2370
+
2371
+ </li>
2372
+
2373
+ <li>
2374
+
2375
+ <span class='name'>volatility</span>
2376
+
2377
+
2378
+ <span class='type'>(<tt>Float</tt>)</span>
2379
+
2380
+
2381
+
2382
+ &mdash;
2383
+ <div class='inline'><p>Volatility</p>
2384
+ </div>
2385
+
2386
+ </li>
2387
+
2388
+ <li>
2389
+
2390
+ <span class='name'>n</span>
2391
+
2392
+
2393
+ <span class='type'>(<tt>Integer</tt>)</span>
2394
+
2395
+
2396
+
2397
+ &mdash;
2398
+ <div class='inline'><p>Number of options</p>
2399
+ </div>
2400
+
2401
+ </li>
2402
+
2403
+ <li>
2404
+
2405
+ <span class='name'>s</span>
2406
+
2407
+
2408
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
2409
+
2410
+
2411
+
2412
+ &mdash;
2413
+ <div class='inline'><p>Array of stock prices</p>
2414
+ </div>
2415
+
2416
+ </li>
2417
+
2418
+ <li>
2419
+
2420
+ <span class='name'>y</span>
2421
+
2422
+
2423
+ <span class='type'>(<tt>Float</tt>)</span>
2424
+
2425
+
2426
+ <em class="default">(defaults to: <tt>0.0</tt>)</em>
2427
+
2428
+
2429
+ &mdash;
2430
+ <div class='inline'><p>Dividend yield</p>
2431
+ </div>
2432
+
2433
+ </li>
2434
+
2435
+ <li>
2436
+
2437
+ <span class='name'>commission</span>
2438
+
2439
+
2440
+ <span class='type'>(<tt>Float</tt>)</span>
2441
+
2442
+
2443
+ <em class="default">(defaults to: <tt>0.0</tt>)</em>
2444
+
2445
+
2446
+ &mdash;
2447
+ <div class='inline'><p>Brokerage commission</p>
2448
+ </div>
2449
+
2450
+ </li>
2451
+
2452
+ </ul>
2453
+
2454
+ <p class="tag_title">Returns:</p>
2455
+ <ul class="return">
2456
+
2457
+ <li>
2458
+
2459
+
2460
+ <span class='type'>(<tt>Array&lt;Numo::DFloat, Float&gt;</tt>)</span>
2461
+
2462
+
2463
+
2464
+ &mdash;
2465
+ <div class='inline'><p>P/L profile and cost</p>
2466
+ </div>
2467
+
2468
+ </li>
2469
+
2470
+ </ul>
2471
+
2472
+ </div><table class="source_code">
2473
+ <tr>
2474
+ <td>
2475
+ <pre class="lines">
2476
+
2477
+
2478
+ 75
2479
+ 76
2480
+ 77
2481
+ 78
2482
+ 79
2483
+ 80
2484
+ 81
2485
+ 82
2486
+ 83
2487
+ 84
2488
+ 85
2489
+ 86
2490
+ 87
2491
+ 88
2492
+ 89
2493
+ 90
2494
+ 91
2495
+ 92
2496
+ 93
2497
+ 94</pre>
2498
+ </td>
2499
+ <td>
2500
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 75</span>
2501
+
2502
+ <span class='kw'>def</span> <span class='id identifier rubyid_get_pl_profile_bs'>get_pl_profile_bs</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_action'>action</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='comma'>,</span> <span class='id identifier rubyid_val'>val</span><span class='comma'>,</span> <span class='id identifier rubyid_r'>r</span><span class='comma'>,</span> <span class='id identifier rubyid_target_to_maturity_years'>target_to_maturity_years</span><span class='comma'>,</span> <span class='id identifier rubyid_volatility'>volatility</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_y'>y</span> <span class='op'>=</span> <span class='float'>0.0</span><span class='comma'>,</span> <span class='id identifier rubyid_commission'>commission</span> <span class='op'>=</span> <span class='float'>0.0</span><span class='rparen'>)</span>
2503
+ <span class='kw'>if</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>buy</span><span class='tstring_end'>&#39;</span></span>
2504
+ <span class='id identifier rubyid_cost'>cost</span> <span class='op'>=</span> <span class='op'>-</span><span class='id identifier rubyid_val'>val</span>
2505
+ <span class='id identifier rubyid_factor'>factor</span> <span class='op'>=</span> <span class='int'>1</span>
2506
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>sell</span><span class='tstring_end'>&#39;</span></span>
2507
+ <span class='id identifier rubyid_cost'>cost</span> <span class='op'>=</span> <span class='id identifier rubyid_val'>val</span>
2508
+ <span class='id identifier rubyid_factor'>factor</span> <span class='op'>=</span> <span class='op'>-</span><span class='int'>1</span>
2509
+ <span class='kw'>else</span>
2510
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Action must be either &#39;buy&#39; or &#39;sell&#39;!</span><span class='tstring_end'>&quot;</span></span>
2511
+ <span class='kw'>end</span>
2512
+
2513
+ <span class='comment'># Calculate prices using Black-Scholes
2514
+ </span> <span class='id identifier rubyid_d1'>d1</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="BlackScholes.html" title="OptionLab::BlackScholes (module)">BlackScholes</a></span></span><span class='period'>.</span><span class='id identifier rubyid_get_d1'><span class='object_link'><a href="BlackScholes.html#get_d1-class_method" title="OptionLab::BlackScholes.get_d1 (method)">get_d1</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='comma'>,</span> <span class='id identifier rubyid_r'>r</span><span class='comma'>,</span> <span class='id identifier rubyid_volatility'>volatility</span><span class='comma'>,</span> <span class='id identifier rubyid_target_to_maturity_years'>target_to_maturity_years</span><span class='comma'>,</span> <span class='id identifier rubyid_y'>y</span><span class='rparen'>)</span>
2515
+ <span class='id identifier rubyid_d2'>d2</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="BlackScholes.html" title="OptionLab::BlackScholes (module)">BlackScholes</a></span></span><span class='period'>.</span><span class='id identifier rubyid_get_d2'><span class='object_link'><a href="BlackScholes.html#get_d2-class_method" title="OptionLab::BlackScholes.get_d2 (method)">get_d2</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='comma'>,</span> <span class='id identifier rubyid_r'>r</span><span class='comma'>,</span> <span class='id identifier rubyid_volatility'>volatility</span><span class='comma'>,</span> <span class='id identifier rubyid_target_to_maturity_years'>target_to_maturity_years</span><span class='comma'>,</span> <span class='id identifier rubyid_y'>y</span><span class='rparen'>)</span>
2516
+ <span class='id identifier rubyid_calc_price'>calc_price</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="BlackScholes.html" title="OptionLab::BlackScholes (module)">BlackScholes</a></span></span><span class='period'>.</span><span class='id identifier rubyid_get_option_price'><span class='object_link'><a href="BlackScholes.html#get_option_price-class_method" title="OptionLab::BlackScholes.get_option_price (method)">get_option_price</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='comma'>,</span> <span class='id identifier rubyid_r'>r</span><span class='comma'>,</span> <span class='id identifier rubyid_target_to_maturity_years'>target_to_maturity_years</span><span class='comma'>,</span> <span class='id identifier rubyid_d1'>d1</span><span class='comma'>,</span> <span class='id identifier rubyid_d2'>d2</span><span class='comma'>,</span> <span class='id identifier rubyid_y'>y</span><span class='rparen'>)</span>
2517
+
2518
+ <span class='id identifier rubyid_profile'>profile</span> <span class='op'>=</span> <span class='id identifier rubyid_factor'>factor</span> <span class='op'>*</span> <span class='id identifier rubyid_n'>n</span> <span class='op'>*</span> <span class='lparen'>(</span><span class='id identifier rubyid_calc_price'>calc_price</span> <span class='op'>-</span> <span class='id identifier rubyid_val'>val</span><span class='rparen'>)</span> <span class='op'>-</span> <span class='id identifier rubyid_commission'>commission</span>
2519
+
2520
+ <span class='lbracket'>[</span><span class='id identifier rubyid_profile'>profile</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span> <span class='op'>*</span> <span class='id identifier rubyid_cost'>cost</span> <span class='op'>-</span> <span class='id identifier rubyid_commission'>commission</span><span class='rbracket'>]</span>
2521
+ <span class='kw'>end</span></pre>
2522
+ </td>
2523
+ </tr>
2524
+ </table>
2525
+ </div>
2526
+
2527
+ <div class="method_details ">
2528
+ <h3 class="signature " id="get_pl_profile_stock-class_method">
2529
+
2530
+ .<strong>get_pl_profile_stock</strong>(s0, action, n, s, commission = 0.0) &#x21d2; <tt>Array&lt;Numo::DFloat, Float&gt;</tt>
2531
+
2532
+
2533
+
2534
+
2535
+
2536
+ </h3><div class="docstring">
2537
+ <div class="discussion">
2538
+ <p>Get profit/loss profile and cost of a stock position</p>
2539
+
2540
+
2541
+ </div>
2542
+ </div>
2543
+ <div class="tags">
2544
+ <p class="tag_title">Parameters:</p>
2545
+ <ul class="param">
2546
+
2547
+ <li>
2548
+
2549
+ <span class='name'>s0</span>
2550
+
2551
+
2552
+ <span class='type'>(<tt>Float</tt>)</span>
2553
+
2554
+
2555
+
2556
+ &mdash;
2557
+ <div class='inline'><p>Initial stock price</p>
2558
+ </div>
2559
+
2560
+ </li>
2561
+
2562
+ <li>
2563
+
2564
+ <span class='name'>action</span>
2565
+
2566
+
2567
+ <span class='type'>(<tt>String</tt>)</span>
2568
+
2569
+
2570
+
2571
+ &mdash;
2572
+ <div class='inline'><p>&#39;buy&#39; or &#39;sell&#39;</p>
2573
+ </div>
2574
+
2575
+ </li>
2576
+
2577
+ <li>
2578
+
2579
+ <span class='name'>n</span>
2580
+
2581
+
2582
+ <span class='type'>(<tt>Integer</tt>)</span>
2583
+
2584
+
2585
+
2586
+ &mdash;
2587
+ <div class='inline'><p>Number of shares</p>
2588
+ </div>
2589
+
2590
+ </li>
2591
+
2592
+ <li>
2593
+
2594
+ <span class='name'>s</span>
2595
+
2596
+
2597
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
2598
+
2599
+
2600
+
2601
+ &mdash;
2602
+ <div class='inline'><p>Array of stock prices</p>
2603
+ </div>
2604
+
2605
+ </li>
2606
+
2607
+ <li>
2608
+
2609
+ <span class='name'>commission</span>
2610
+
2611
+
2612
+ <span class='type'>(<tt>Float</tt>)</span>
2613
+
2614
+
2615
+ <em class="default">(defaults to: <tt>0.0</tt>)</em>
2616
+
2617
+
2618
+ &mdash;
2619
+ <div class='inline'><p>Brokerage commission</p>
2620
+ </div>
2621
+
2622
+ </li>
2623
+
2624
+ </ul>
2625
+
2626
+ <p class="tag_title">Returns:</p>
2627
+ <ul class="return">
2628
+
2629
+ <li>
2630
+
2631
+
2632
+ <span class='type'>(<tt>Array&lt;Numo::DFloat, Float&gt;</tt>)</span>
2633
+
2634
+
2635
+
2636
+ &mdash;
2637
+ <div class='inline'><p>P/L profile and cost</p>
2638
+ </div>
2639
+
2640
+ </li>
2641
+
2642
+ </ul>
2643
+
2644
+ </div><table class="source_code">
2645
+ <tr>
2646
+ <td>
2647
+ <pre class="lines">
2648
+
2649
+
2650
+ 47
2651
+ 48
2652
+ 49
2653
+ 50
2654
+ 51
2655
+ 52
2656
+ 53
2657
+ 54
2658
+ 55
2659
+ 56
2660
+ 57
2661
+ 58
2662
+ 59
2663
+ 60</pre>
2664
+ </td>
2665
+ <td>
2666
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 47</span>
2667
+
2668
+ <span class='kw'>def</span> <span class='id identifier rubyid_get_pl_profile_stock'>get_pl_profile_stock</span><span class='lparen'>(</span><span class='id identifier rubyid_s0'>s0</span><span class='comma'>,</span> <span class='id identifier rubyid_action'>action</span><span class='comma'>,</span> <span class='id identifier rubyid_n'>n</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_commission'>commission</span> <span class='op'>=</span> <span class='float'>0.0</span><span class='rparen'>)</span>
2669
+ <span class='kw'>if</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>buy</span><span class='tstring_end'>&#39;</span></span>
2670
+ <span class='id identifier rubyid_cost'>cost</span> <span class='op'>=</span> <span class='op'>-</span><span class='id identifier rubyid_s0'>s0</span>
2671
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_action'>action</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>sell</span><span class='tstring_end'>&#39;</span></span>
2672
+ <span class='id identifier rubyid_cost'>cost</span> <span class='op'>=</span> <span class='id identifier rubyid_s0'>s0</span>
2673
+ <span class='kw'>else</span>
2674
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Action must be either &#39;buy&#39; or &#39;sell&#39;!</span><span class='tstring_end'>&quot;</span></span>
2675
+ <span class='kw'>end</span>
2676
+
2677
+ <span class='lbracket'>[</span>
2678
+ <span class='id identifier rubyid_n'>n</span> <span class='op'>*</span> <span class='id identifier rubyid__get_pl_stock'>_get_pl_stock</span><span class='lparen'>(</span><span class='id identifier rubyid_s0'>s0</span><span class='comma'>,</span> <span class='id identifier rubyid_action'>action</span><span class='comma'>,</span> <span class='id identifier rubyid_s'>s</span><span class='rparen'>)</span> <span class='op'>-</span> <span class='id identifier rubyid_commission'>commission</span><span class='comma'>,</span>
2679
+ <span class='id identifier rubyid_n'>n</span> <span class='op'>*</span> <span class='id identifier rubyid_cost'>cost</span> <span class='op'>-</span> <span class='id identifier rubyid_commission'>commission</span>
2680
+ <span class='rbracket'>]</span>
2681
+ <span class='kw'>end</span></pre>
2682
+ </td>
2683
+ </tr>
2684
+ </table>
2685
+ </div>
2686
+
2687
+ <div class="method_details ">
2688
+ <h3 class="signature " id="get_pop-class_method">
2689
+
2690
+ .<strong>get_pop</strong>(s, profit, inputs_data, target = 0.01) &#x21d2; <tt><span class='object_link'><a href="Models/PoPOutputs.html" title="OptionLab::Models::PoPOutputs (class)">Models::PoPOutputs</a></span></tt>
2691
+
2692
+
2693
+
2694
+
2695
+
2696
+ </h3><div class="docstring">
2697
+ <div class="discussion">
2698
+ <p>Estimate probability of profit</p>
2699
+
2700
+
2701
+ </div>
2702
+ </div>
2703
+ <div class="tags">
2704
+ <p class="tag_title">Parameters:</p>
2705
+ <ul class="param">
2706
+
2707
+ <li>
2708
+
2709
+ <span class='name'>s</span>
2710
+
2711
+
2712
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
2713
+
2714
+
2715
+
2716
+ &mdash;
2717
+ <div class='inline'><p>Array of stock prices</p>
2718
+ </div>
2719
+
2720
+ </li>
2721
+
2722
+ <li>
2723
+
2724
+ <span class='name'>profit</span>
2725
+
2726
+
2727
+ <span class='type'>(<tt>Numo::DFloat</tt>)</span>
2728
+
2729
+
2730
+
2731
+ &mdash;
2732
+ <div class='inline'><p>Array of profits</p>
2733
+ </div>
2734
+
2735
+ </li>
2736
+
2737
+ <li>
2738
+
2739
+ <span class='name'>inputs_data</span>
2740
+
2741
+
2742
+ <span class='type'>(<tt><span class='object_link'><a href="Models/BlackScholesModelInputs.html" title="OptionLab::Models::BlackScholesModelInputs (class)">Models::BlackScholesModelInputs</a></span></tt>, <tt><span class='object_link'><a href="Models/ArrayInputs.html" title="OptionLab::Models::ArrayInputs (class)">Models::ArrayInputs</a></span></tt>)</span>
2743
+
2744
+
2745
+
2746
+ &mdash;
2747
+ <div class='inline'><p>Model inputs</p>
2748
+ </div>
2749
+
2750
+ </li>
2751
+
2752
+ <li>
2753
+
2754
+ <span class='name'>target</span>
2755
+
2756
+
2757
+ <span class='type'>(<tt>Float</tt>)</span>
2758
+
2759
+
2760
+ <em class="default">(defaults to: <tt>0.01</tt>)</em>
2761
+
2762
+
2763
+ &mdash;
2764
+ <div class='inline'><p>Return target</p>
2765
+ </div>
2766
+
2767
+ </li>
2768
+
2769
+ </ul>
2770
+
2771
+ <p class="tag_title">Returns:</p>
2772
+ <ul class="return">
2773
+
2774
+ <li>
2775
+
2776
+
2777
+ <span class='type'>(<tt><span class='object_link'><a href="Models/PoPOutputs.html" title="OptionLab::Models::PoPOutputs (class)">Models::PoPOutputs</a></span></tt>)</span>
2778
+
2779
+
2780
+
2781
+ &mdash;
2782
+ <div class='inline'><p>Probability of profit outputs</p>
2783
+ </div>
2784
+
2785
+ </li>
2786
+
2787
+ </ul>
2788
+
2789
+ </div><table class="source_code">
2790
+ <tr>
2791
+ <td>
2792
+ <pre class="lines">
2793
+
2794
+
2795
+ 129
2796
+ 130
2797
+ 131
2798
+ 132
2799
+ 133
2800
+ 134
2801
+ 135
2802
+ 136
2803
+ 137
2804
+ 138
2805
+ 139
2806
+ 140
2807
+ 141
2808
+ 142
2809
+ 143
2810
+ 144
2811
+ 145
2812
+ 146
2813
+ 147
2814
+ 148
2815
+ 149
2816
+ 150
2817
+ 151
2818
+ 152
2819
+ 153
2820
+ 154
2821
+ 155
2822
+ 156
2823
+ 157
2824
+ 158
2825
+ 159
2826
+ 160
2827
+ 161
2828
+ 162</pre>
2829
+ </td>
2830
+ <td>
2831
+ <pre class="code"><span class="info file"># File 'lib/option_lab/support.rb', line 129</span>
2832
+
2833
+ <span class='kw'>def</span> <span class='id identifier rubyid_get_pop'>get_pop</span><span class='lparen'>(</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_profit'>profit</span><span class='comma'>,</span> <span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='comma'>,</span> <span class='id identifier rubyid_target'>target</span> <span class='op'>=</span> <span class='float'>0.01</span><span class='rparen'>)</span>
2834
+ <span class='comment'># Initialize variables
2835
+ </span> <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span> <span class='op'>=</span> <span class='float'>0.0</span>
2836
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span> <span class='op'>=</span> <span class='float'>0.0</span>
2837
+ <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span> <span class='op'>=</span> <span class='kw'>nil</span>
2838
+ <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span> <span class='op'>=</span> <span class='kw'>nil</span>
2839
+
2840
+ <span class='comment'># Get profit ranges
2841
+ </span> <span class='id identifier rubyid_t_ranges'>t_ranges</span> <span class='op'>=</span> <span class='id identifier rubyid__get_profit_range'>_get_profit_range</span><span class='lparen'>(</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_profit'>profit</span><span class='comma'>,</span> <span class='id identifier rubyid_target'>target</span><span class='rparen'>)</span>
2842
+
2843
+ <span class='id identifier rubyid_reaching_target_range'>reaching_target_range</span> <span class='op'>=</span> <span class='id identifier rubyid_t_ranges'>t_ranges</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='float'>0.0</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rbracket'>]</span><span class='rbracket'>]</span> <span class='op'>?</span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='op'>:</span> <span class='id identifier rubyid_t_ranges'>t_ranges</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
2844
+ <span class='id identifier rubyid_missing_target_range'>missing_target_range</span> <span class='op'>=</span> <span class='id identifier rubyid_t_ranges'>t_ranges</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='float'>0.0</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rbracket'>]</span><span class='rbracket'>]</span> <span class='op'>?</span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='op'>:</span> <span class='id identifier rubyid_t_ranges'>t_ranges</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span>
2845
+
2846
+ <span class='comment'># Calculate PoP based on inputs model
2847
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models/BlackScholesModelInputs.html" title="OptionLab::Models::BlackScholesModelInputs (class)">BlackScholesModelInputs</a></span></span><span class='rparen'>)</span>
2848
+ <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span><span class='comma'>,</span> <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span><span class='comma'>,</span>
2849
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span><span class='comma'>,</span> <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span> <span class='op'>=</span>
2850
+ <span class='id identifier rubyid__get_pop_bs'>_get_pop_bs</span><span class='lparen'>(</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_profit'>profit</span><span class='comma'>,</span> <span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='comma'>,</span> <span class='id identifier rubyid_t_ranges'>t_ranges</span><span class='rparen'>)</span>
2851
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models/ArrayInputs.html" title="OptionLab::Models::ArrayInputs (class)">ArrayInputs</a></span></span><span class='rparen'>)</span>
2852
+ <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span><span class='comma'>,</span> <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span><span class='comma'>,</span>
2853
+ <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span><span class='comma'>,</span> <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span> <span class='op'>=</span>
2854
+ <span class='id identifier rubyid__get_pop_array'>_get_pop_array</span><span class='lparen'>(</span><span class='id identifier rubyid_inputs_data'>inputs_data</span><span class='comma'>,</span> <span class='id identifier rubyid_target'>target</span><span class='rparen'>)</span>
2855
+ <span class='kw'>end</span>
2856
+
2857
+ <span class='comment'># Return outputs
2858
+ </span> <span class='const'><span class='object_link'><a href="Models.html" title="OptionLab::Models (module)">Models</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Models/PoPOutputs.html" title="OptionLab::Models::PoPOutputs (class)">PoPOutputs</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Models/PoPOutputs.html#initialize-instance_method" title="OptionLab::Models::PoPOutputs#initialize (method)">new</a></span></span><span class='lparen'>(</span>
2859
+ <span class='label'>probability_of_reaching_target:</span> <span class='id identifier rubyid_probability_of_reaching_target'>probability_of_reaching_target</span><span class='comma'>,</span>
2860
+ <span class='label'>probability_of_missing_target:</span> <span class='id identifier rubyid_probability_of_missing_target'>probability_of_missing_target</span><span class='comma'>,</span>
2861
+ <span class='label'>reaching_target_range:</span> <span class='id identifier rubyid_reaching_target_range'>reaching_target_range</span><span class='comma'>,</span>
2862
+ <span class='label'>missing_target_range:</span> <span class='id identifier rubyid_missing_target_range'>missing_target_range</span><span class='comma'>,</span>
2863
+ <span class='label'>expected_return_above_target:</span> <span class='id identifier rubyid_expected_return_above_target'>expected_return_above_target</span><span class='comma'>,</span>
2864
+ <span class='label'>expected_return_below_target:</span> <span class='id identifier rubyid_expected_return_below_target'>expected_return_below_target</span>
2865
+ <span class='rparen'>)</span>
2866
+ <span class='kw'>end</span></pre>
2867
+ </td>
2868
+ </tr>
2869
+ </table>
2870
+ </div>
2871
+
2872
+ </div>
2873
+
2874
+ </div>
2875
+
2876
+ <div id="footer">
2877
+ Generated on Sun Apr 27 16:09:34 2025 by
2878
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
2879
+ 0.9.37 (ruby-3.3.3).
2880
+ </div>
2881
+
2882
+ </div>
2883
+ </body>
2884
+ </html>