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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +139 -0
- data/.yard/hooks/before_generate.rb +7 -0
- data/.yardopts +11 -0
- data/Gemfile +26 -0
- data/LICENSE.txt +21 -0
- data/README.md +180 -0
- data/Rakefile +44 -0
- data/docs/OptionLab/BinomialTree.html +1271 -0
- data/docs/OptionLab/BjerksundStensland.html +2022 -0
- data/docs/OptionLab/BlackScholes.html +2388 -0
- data/docs/OptionLab/Engine.html +1716 -0
- data/docs/OptionLab/Models/AmericanModelInputs.html +937 -0
- data/docs/OptionLab/Models/ArrayInputs.html +463 -0
- data/docs/OptionLab/Models/BaseModel.html +223 -0
- data/docs/OptionLab/Models/BinomialModelInputs.html +1161 -0
- data/docs/OptionLab/Models/BlackScholesInfo.html +967 -0
- data/docs/OptionLab/Models/BlackScholesModelInputs.html +851 -0
- data/docs/OptionLab/Models/ClosedPosition.html +445 -0
- data/docs/OptionLab/Models/EngineData.html +2523 -0
- data/docs/OptionLab/Models/EngineDataResults.html +435 -0
- data/docs/OptionLab/Models/Inputs.html +2241 -0
- data/docs/OptionLab/Models/LaplaceInputs.html +777 -0
- data/docs/OptionLab/Models/Option.html +736 -0
- data/docs/OptionLab/Models/Outputs.html +1753 -0
- data/docs/OptionLab/Models/PoPOutputs.html +645 -0
- data/docs/OptionLab/Models/PricingResult.html +848 -0
- data/docs/OptionLab/Models/Stock.html +583 -0
- data/docs/OptionLab/Models/TreeVisualization.html +688 -0
- data/docs/OptionLab/Models.html +251 -0
- data/docs/OptionLab/Plotting.html +548 -0
- data/docs/OptionLab/Support.html +2884 -0
- data/docs/OptionLab/Utils.html +619 -0
- data/docs/OptionLab.html +133 -0
- data/docs/_index.html +376 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +503 -0
- data/docs/file.LICENSE.html +70 -0
- data/docs/file.README.html +263 -0
- data/docs/file_list.html +64 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +263 -0
- data/docs/js/app.js +344 -0
- data/docs/js/full_list.js +242 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +1974 -0
- data/docs/top-level-namespace.html +110 -0
- data/examples/american_options.rb +163 -0
- data/examples/covered_call.rb +76 -0
- data/lib/option_lab/binomial_tree.rb +238 -0
- data/lib/option_lab/bjerksund_stensland.rb +276 -0
- data/lib/option_lab/black_scholes.rb +323 -0
- data/lib/option_lab/engine.rb +492 -0
- data/lib/option_lab/models.rb +768 -0
- data/lib/option_lab/plotting.rb +182 -0
- data/lib/option_lab/support.rb +471 -0
- data/lib/option_lab/utils.rb +107 -0
- data/lib/option_lab/version.rb +5 -0
- data/lib/option_lab.rb +134 -0
- data/option_lab.gemspec +43 -0
- 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
|
+
— 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> »
|
40
|
+
<span class='title'><span class='object_link'><a href="../OptionLab.html" title="OptionLab (module)">OptionLab</a></span></span>
|
41
|
+
»
|
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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ Array<Float, Float, Float, Float> </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) ⇒ Array<Float, Float, Float, Float> </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) ⇒ Array<Array<Array<Float>>> </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) ⇒ Array<Integer> </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) ⇒ 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) ⇒ 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) ⇒ Array<Numo::DFloat, Float> </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) ⇒ Array<Numo::DFloat, Float> </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) ⇒ Array<Numo::DFloat, Float> </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) ⇒ 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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'><</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) ⇒ <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
|
+
—
|
709
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>call</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>put</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Option type must be either 'call' or 'put'!</span><span class='tstring_end'>"</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) ⇒ <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
|
+
—
|
831
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
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
|
+
—
|
861
|
+
<div class='inline'><p>'buy' or 'sell'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>sell</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>buy</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Action must be either 'sell' or 'buy'!</span><span class='tstring_end'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
994
|
+
<div class='inline'><p>'buy' or 'sell'</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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>sell</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>buy</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Action must be either 'sell' or 'buy'!</span><span class='tstring_end'>"</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) ⇒ <tt>Array<Float, Float, Float, Float></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
|
+
—
|
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
|
+
—
|
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<Float, Float, Float, Float></tt>)</span>
|
1126
|
+
|
1127
|
+
|
1128
|
+
|
1129
|
+
—
|
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'>"</span><span class='tstring_content'>The array is empty!</span><span class='tstring_end'>"</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'>>=</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'><</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'>></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'>></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) ⇒ <tt>Array<Float, Float, Float, Float></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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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<Array<Array<Float>>></tt>)</span>
|
1271
|
+
|
1272
|
+
|
1273
|
+
|
1274
|
+
—
|
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<Float, Float, Float, Float></tt>)</span>
|
1289
|
+
|
1290
|
+
|
1291
|
+
|
1292
|
+
—
|
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'>></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'>></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) ⇒ <tt>Array<Array<Array<Float>>></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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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<Array<Array<Float>>></tt>)</span>
|
1489
|
+
|
1490
|
+
|
1491
|
+
|
1492
|
+
—
|
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'>>=</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'><</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'>></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'>></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'>&&</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'><<</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'>&&</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'><<</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) ⇒ <tt>Array<Integer></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
|
+
—
|
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
|
+
—
|
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<Integer></tt>)</span>
|
1712
|
+
|
1713
|
+
|
1714
|
+
|
1715
|
+
—
|
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'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'>></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'>></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'><<</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'><</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>model</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>model</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>laplace</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Invalid model type!</span><span class='tstring_end'>"</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'>"</span><span class='tstring_content'>Invalid inputs type!</span><span class='tstring_end'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>"</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'>"</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'>></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'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'>"</span><span class='tstring_content'>Maximum price cannot be less than minimum price!</span><span class='tstring_end'>"</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) ⇒ <tt>Array<Numo::DFloat, Float></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
|
+
—
|
2095
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
2110
|
+
<div class='inline'><p>'buy' or 'sell'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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<Numo::DFloat, Float></tt>)</span>
|
2201
|
+
|
2202
|
+
|
2203
|
+
|
2204
|
+
—
|
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'>'</span><span class='tstring_content'>buy</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>sell</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Action must be either 'buy' or 'sell'!</span><span class='tstring_end'>"</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'>"</span><span class='tstring_content'>Option type must be either 'call' or 'put'!</span><span class='tstring_end'>"</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) ⇒ <tt>Array<Numo::DFloat, Float></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
|
+
—
|
2293
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
2308
|
+
<div class='inline'><p>'buy' or 'sell'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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<Numo::DFloat, Float></tt>)</span>
|
2461
|
+
|
2462
|
+
|
2463
|
+
|
2464
|
+
—
|
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'>'</span><span class='tstring_content'>buy</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>sell</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Action must be either 'buy' or 'sell'!</span><span class='tstring_end'>"</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) ⇒ <tt>Array<Numo::DFloat, Float></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
|
+
—
|
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
|
+
—
|
2572
|
+
<div class='inline'><p>'buy' or 'sell'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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<Numo::DFloat, Float></tt>)</span>
|
2633
|
+
|
2634
|
+
|
2635
|
+
|
2636
|
+
—
|
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'>'</span><span class='tstring_content'>buy</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>sell</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Action must be either 'buy' or 'sell'!</span><span class='tstring_end'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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>
|