option_lab 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +139 -0
  4. data/.yard/hooks/before_generate.rb +7 -0
  5. data/.yardopts +11 -0
  6. data/Gemfile +26 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +180 -0
  9. data/Rakefile +44 -0
  10. data/docs/OptionLab/BinomialTree.html +1271 -0
  11. data/docs/OptionLab/BjerksundStensland.html +2022 -0
  12. data/docs/OptionLab/BlackScholes.html +2388 -0
  13. data/docs/OptionLab/Engine.html +1716 -0
  14. data/docs/OptionLab/Models/AmericanModelInputs.html +937 -0
  15. data/docs/OptionLab/Models/ArrayInputs.html +463 -0
  16. data/docs/OptionLab/Models/BaseModel.html +223 -0
  17. data/docs/OptionLab/Models/BinomialModelInputs.html +1161 -0
  18. data/docs/OptionLab/Models/BlackScholesInfo.html +967 -0
  19. data/docs/OptionLab/Models/BlackScholesModelInputs.html +851 -0
  20. data/docs/OptionLab/Models/ClosedPosition.html +445 -0
  21. data/docs/OptionLab/Models/EngineData.html +2523 -0
  22. data/docs/OptionLab/Models/EngineDataResults.html +435 -0
  23. data/docs/OptionLab/Models/Inputs.html +2241 -0
  24. data/docs/OptionLab/Models/LaplaceInputs.html +777 -0
  25. data/docs/OptionLab/Models/Option.html +736 -0
  26. data/docs/OptionLab/Models/Outputs.html +1753 -0
  27. data/docs/OptionLab/Models/PoPOutputs.html +645 -0
  28. data/docs/OptionLab/Models/PricingResult.html +848 -0
  29. data/docs/OptionLab/Models/Stock.html +583 -0
  30. data/docs/OptionLab/Models/TreeVisualization.html +688 -0
  31. data/docs/OptionLab/Models.html +251 -0
  32. data/docs/OptionLab/Plotting.html +548 -0
  33. data/docs/OptionLab/Support.html +2884 -0
  34. data/docs/OptionLab/Utils.html +619 -0
  35. data/docs/OptionLab.html +133 -0
  36. data/docs/_index.html +376 -0
  37. data/docs/class_list.html +54 -0
  38. data/docs/css/common.css +1 -0
  39. data/docs/css/full_list.css +58 -0
  40. data/docs/css/style.css +503 -0
  41. data/docs/file.LICENSE.html +70 -0
  42. data/docs/file.README.html +263 -0
  43. data/docs/file_list.html +64 -0
  44. data/docs/frames.html +22 -0
  45. data/docs/index.html +263 -0
  46. data/docs/js/app.js +344 -0
  47. data/docs/js/full_list.js +242 -0
  48. data/docs/js/jquery.js +4 -0
  49. data/docs/method_list.html +1974 -0
  50. data/docs/top-level-namespace.html +110 -0
  51. data/examples/american_options.rb +163 -0
  52. data/examples/covered_call.rb +76 -0
  53. data/lib/option_lab/binomial_tree.rb +238 -0
  54. data/lib/option_lab/bjerksund_stensland.rb +276 -0
  55. data/lib/option_lab/black_scholes.rb +323 -0
  56. data/lib/option_lab/engine.rb +492 -0
  57. data/lib/option_lab/models.rb +768 -0
  58. data/lib/option_lab/plotting.rb +182 -0
  59. data/lib/option_lab/support.rb +471 -0
  60. data/lib/option_lab/utils.rb +107 -0
  61. data/lib/option_lab/version.rb +5 -0
  62. data/lib/option_lab.rb +134 -0
  63. data/option_lab.gemspec +43 -0
  64. metadata +207 -0
@@ -0,0 +1,1271 @@
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::BinomialTree
8
+
9
+ &mdash; OptionLab Documentation
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="../css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="../css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "OptionLab::BinomialTree";
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 (B)</a> &raquo;
40
+ <span class='title'><span class='object_link'><a href="../OptionLab.html" title="OptionLab (module)">OptionLab</a></span></span>
41
+ &raquo;
42
+ <span class="title">BinomialTree</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::BinomialTree
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/binomial_tree.rb</dd>
82
+ </dl>
83
+
84
+ </div>
85
+
86
+ <h2>Overview</h2><div class="docstring">
87
+ <div class="discussion">
88
+ <p>Implementation of the Cox-Ross-Rubinstein (CRR) binomial tree model
89
+ for American and European options pricing</p>
90
+
91
+
92
+ </div>
93
+ </div>
94
+ <div class="tags">
95
+
96
+
97
+ </div>
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+ <h2>
106
+ Class Method Summary
107
+ <small><a href="#" class="summary_toggle">collapse</a></small>
108
+ </h2>
109
+
110
+ <ul class="summary">
111
+
112
+ <li class="public ">
113
+ <span class="summary_signature">
114
+
115
+ <a href="#get_greeks-class_method" title="get_greeks (class method)">.<strong>get_greeks</strong>(option_type, s0, x, r, volatility, years_to_maturity, n_steps = 100, is_american = true, dividend_yield = 0.0) &#x21d2; Hash </a>
116
+
117
+
118
+
119
+ </span>
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+ <span class="summary_desc"><div class='inline'><p>Calculate option Greeks using the CRR model and finite difference methods.</p>
130
+ </div></span>
131
+
132
+ </li>
133
+
134
+
135
+ <li class="public ">
136
+ <span class="summary_signature">
137
+
138
+ <a href="#get_tree-class_method" title="get_tree (class method)">.<strong>get_tree</strong>(option_type, s0, x, r, volatility, years_to_maturity, n_steps = 15, is_american = true, dividend_yield = 0.0) &#x21d2; Hash </a>
139
+
140
+
141
+
142
+ </span>
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+ <span class="summary_desc"><div class='inline'><p>Get a full binomial tree as a structured output.</p>
153
+ </div></span>
154
+
155
+ </li>
156
+
157
+
158
+ <li class="public ">
159
+ <span class="summary_signature">
160
+
161
+ <a href="#option_payoff-class_method" title="option_payoff (class method)">.<strong>option_payoff</strong>(option_type, stock_price, strike) &#x21d2; Float </a>
162
+
163
+
164
+
165
+ </span>
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+ <span class="summary_desc"><div class='inline'><p>Calculate option payoff at expiration.</p>
176
+ </div></span>
177
+
178
+ </li>
179
+
180
+
181
+ <li class="public ">
182
+ <span class="summary_signature">
183
+
184
+ <a href="#price_option-class_method" title="price_option (class method)">.<strong>price_option</strong>(option_type, s0, x, r, volatility, years_to_maturity, n_steps = 100, is_american = true, dividend_yield = 0.0) &#x21d2; Float </a>
185
+
186
+
187
+
188
+ </span>
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+ <span class="summary_desc"><div class='inline'><p>Price an option using the Cox-Ross-Rubinstein binomial tree model.</p>
199
+ </div></span>
200
+
201
+ </li>
202
+
203
+
204
+ </ul>
205
+
206
+
207
+
208
+
209
+ <div id="class_method_details" class="method_details_list">
210
+ <h2>Class Method Details</h2>
211
+
212
+
213
+ <div class="method_details first">
214
+ <h3 class="signature first" id="get_greeks-class_method">
215
+
216
+ .<strong>get_greeks</strong>(option_type, s0, x, r, volatility, years_to_maturity, n_steps = 100, is_american = true, dividend_yield = 0.0) &#x21d2; <tt>Hash</tt>
217
+
218
+
219
+
220
+
221
+
222
+ </h3><div class="docstring">
223
+ <div class="discussion">
224
+ <p>Calculate option Greeks using the CRR model and finite difference methods</p>
225
+
226
+
227
+ </div>
228
+ </div>
229
+ <div class="tags">
230
+ <p class="tag_title">Parameters:</p>
231
+ <ul class="param">
232
+
233
+ <li>
234
+
235
+ <span class='name'>option_type</span>
236
+
237
+
238
+ <span class='type'>(<tt>String</tt>)</span>
239
+
240
+
241
+
242
+ &mdash;
243
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
244
+ </div>
245
+
246
+ </li>
247
+
248
+ <li>
249
+
250
+ <span class='name'>s0</span>
251
+
252
+
253
+ <span class='type'>(<tt>Float</tt>)</span>
254
+
255
+
256
+
257
+ &mdash;
258
+ <div class='inline'><p>Spot price</p>
259
+ </div>
260
+
261
+ </li>
262
+
263
+ <li>
264
+
265
+ <span class='name'>x</span>
266
+
267
+
268
+ <span class='type'>(<tt>Float</tt>)</span>
269
+
270
+
271
+
272
+ &mdash;
273
+ <div class='inline'><p>Strike price</p>
274
+ </div>
275
+
276
+ </li>
277
+
278
+ <li>
279
+
280
+ <span class='name'>r</span>
281
+
282
+
283
+ <span class='type'>(<tt>Float</tt>)</span>
284
+
285
+
286
+
287
+ &mdash;
288
+ <div class='inline'><p>Risk-free interest rate</p>
289
+ </div>
290
+
291
+ </li>
292
+
293
+ <li>
294
+
295
+ <span class='name'>volatility</span>
296
+
297
+
298
+ <span class='type'>(<tt>Float</tt>)</span>
299
+
300
+
301
+
302
+ &mdash;
303
+ <div class='inline'><p>Volatility</p>
304
+ </div>
305
+
306
+ </li>
307
+
308
+ <li>
309
+
310
+ <span class='name'>years_to_maturity</span>
311
+
312
+
313
+ <span class='type'>(<tt>Float</tt>)</span>
314
+
315
+
316
+
317
+ &mdash;
318
+ <div class='inline'><p>Time to maturity in years</p>
319
+ </div>
320
+
321
+ </li>
322
+
323
+ <li>
324
+
325
+ <span class='name'>n_steps</span>
326
+
327
+
328
+ <span class='type'>(<tt>Integer</tt>)</span>
329
+
330
+
331
+ <em class="default">(defaults to: <tt>100</tt>)</em>
332
+
333
+
334
+ &mdash;
335
+ <div class='inline'><p>Number of time steps</p>
336
+ </div>
337
+
338
+ </li>
339
+
340
+ <li>
341
+
342
+ <span class='name'>is_american</span>
343
+
344
+
345
+ <span class='type'>(<tt>Boolean</tt>)</span>
346
+
347
+
348
+ <em class="default">(defaults to: <tt>true</tt>)</em>
349
+
350
+
351
+ &mdash;
352
+ <div class='inline'><p>True for American options, false for European</p>
353
+ </div>
354
+
355
+ </li>
356
+
357
+ <li>
358
+
359
+ <span class='name'>dividend_yield</span>
360
+
361
+
362
+ <span class='type'>(<tt>Float</tt>)</span>
363
+
364
+
365
+ <em class="default">(defaults to: <tt>0.0</tt>)</em>
366
+
367
+
368
+ &mdash;
369
+ <div class='inline'><p>Continuous dividend yield</p>
370
+ </div>
371
+
372
+ </li>
373
+
374
+ </ul>
375
+
376
+ <p class="tag_title">Returns:</p>
377
+ <ul class="return">
378
+
379
+ <li>
380
+
381
+
382
+ <span class='type'>(<tt>Hash</tt>)</span>
383
+
384
+
385
+
386
+ &mdash;
387
+ <div class='inline'><p>Option Greeks (delta, gamma, theta, vega, rho)</p>
388
+ </div>
389
+
390
+ </li>
391
+
392
+ </ul>
393
+
394
+ </div><table class="source_code">
395
+ <tr>
396
+ <td>
397
+ <pre class="lines">
398
+
399
+
400
+ 190
401
+ 191
402
+ 192
403
+ 193
404
+ 194
405
+ 195
406
+ 196
407
+ 197
408
+ 198
409
+ 199
410
+ 200
411
+ 201
412
+ 202
413
+ 203
414
+ 204
415
+ 205
416
+ 206
417
+ 207
418
+ 208
419
+ 209
420
+ 210
421
+ 211
422
+ 212
423
+ 213
424
+ 214
425
+ 215
426
+ 216
427
+ 217
428
+ 218
429
+ 219
430
+ 220
431
+ 221
432
+ 222
433
+ 223
434
+ 224
435
+ 225
436
+ 226
437
+ 227
438
+ 228
439
+ 229
440
+ 230
441
+ 231
442
+ 232</pre>
443
+ </td>
444
+ <td>
445
+ <pre class="code"><span class="info file"># File 'lib/option_lab/binomial_tree.rb', line 190</span>
446
+
447
+ <span class='kw'>def</span> <span class='id identifier rubyid_get_greeks'>get_greeks</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_s0'>s0</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_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>=</span> <span class='int'>100</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span> <span class='op'>=</span> <span class='kw'>true</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span> <span class='op'>=</span> <span class='float'>0.0</span><span class='rparen'>)</span>
448
+ <span class='comment'># Small increment for finite difference calculation
449
+ </span> <span class='id identifier rubyid_h_s'>h_s</span> <span class='op'>=</span> <span class='id identifier rubyid_s0'>s0</span> <span class='op'>*</span> <span class='float'>0.001</span> <span class='comment'># For Delta and Gamma
450
+ </span> <span class='id identifier rubyid_h_t'>h_t</span> <span class='op'>=</span> <span class='float'>1.0</span> <span class='op'>/</span> <span class='int'>365</span> <span class='comment'># For Theta (1 day)
451
+ </span> <span class='id identifier rubyid_h_v'>h_v</span> <span class='op'>=</span> <span class='float'>0.001</span> <span class='comment'># For Vega
452
+ </span> <span class='id identifier rubyid_h_r'>h_r</span> <span class='op'>=</span> <span class='float'>0.0001</span> <span class='comment'># For Rho
453
+ </span>
454
+ <span class='comment'># Base price
455
+ </span> <span class='id identifier rubyid_price'>price</span> <span class='op'>=</span> <span class='id identifier rubyid_price_option'>price_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_s0'>s0</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_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span><span class='rparen'>)</span>
456
+
457
+ <span class='comment'># Delta: ∂V/∂S
458
+ </span> <span class='id identifier rubyid_price_up'>price_up</span> <span class='op'>=</span> <span class='id identifier rubyid_price_option'>price_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_s0'>s0</span> <span class='op'>+</span> <span class='id identifier rubyid_h_s'>h_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_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span><span class='rparen'>)</span>
459
+ <span class='id identifier rubyid_price_down'>price_down</span> <span class='op'>=</span> <span class='id identifier rubyid_price_option'>price_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_s0'>s0</span> <span class='op'>-</span> <span class='id identifier rubyid_h_s'>h_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_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span><span class='rparen'>)</span>
460
+ <span class='id identifier rubyid_delta'>delta</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='id identifier rubyid_price_up'>price_up</span> <span class='op'>-</span> <span class='id identifier rubyid_price_down'>price_down</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='lparen'>(</span><span class='int'>2</span> <span class='op'>*</span> <span class='id identifier rubyid_h_s'>h_s</span><span class='rparen'>)</span>
461
+
462
+ <span class='comment'># Gamma: ∂²V/∂S²
463
+ </span> <span class='id identifier rubyid_gamma'>gamma</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='id identifier rubyid_price_up'>price_up</span> <span class='op'>-</span> <span class='int'>2</span> <span class='op'>*</span> <span class='id identifier rubyid_price'>price</span> <span class='op'>+</span> <span class='id identifier rubyid_price_down'>price_down</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='lparen'>(</span><span class='id identifier rubyid_h_s'>h_s</span> <span class='op'>*</span> <span class='id identifier rubyid_h_s'>h_s</span><span class='rparen'>)</span>
464
+
465
+ <span class='comment'># Theta: -∂V/∂t
466
+ </span> <span class='id identifier rubyid_price_t_down'>price_t_down</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='id identifier rubyid_years_to_maturity'>years_to_maturity</span> <span class='op'>-</span> <span class='id identifier rubyid_h_t'>h_t</span> <span class='op'>&gt;</span> <span class='int'>0</span>
467
+ <span class='id identifier rubyid_price_option'>price_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_s0'>s0</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_years_to_maturity'>years_to_maturity</span> <span class='op'>-</span> <span class='id identifier rubyid_h_t'>h_t</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span><span class='rparen'>)</span>
468
+ <span class='kw'>else</span>
469
+ <span class='id identifier rubyid_option_payoff'>option_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_s0'>s0</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
470
+ <span class='kw'>end</span>
471
+ <span class='id identifier rubyid_theta'>theta</span> <span class='op'>=</span> <span class='op'>-</span><span class='lparen'>(</span><span class='id identifier rubyid_price_t_down'>price_t_down</span> <span class='op'>-</span> <span class='id identifier rubyid_price'>price</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='id identifier rubyid_h_t'>h_t</span>
472
+
473
+ <span class='comment'># Vega: ∂V/∂σ
474
+ </span> <span class='id identifier rubyid_price_v_up'>price_v_up</span> <span class='op'>=</span> <span class='id identifier rubyid_price_option'>price_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_s0'>s0</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='op'>+</span> <span class='id identifier rubyid_h_v'>h_v</span><span class='comma'>,</span> <span class='id identifier rubyid_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span><span class='rparen'>)</span>
475
+ <span class='id identifier rubyid_vega'>vega</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='id identifier rubyid_price_v_up'>price_v_up</span> <span class='op'>-</span> <span class='id identifier rubyid_price'>price</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='id identifier rubyid_h_v'>h_v</span>
476
+
477
+ <span class='comment'># Rho: ∂V/∂r
478
+ </span> <span class='id identifier rubyid_price_r_up'>price_r_up</span> <span class='op'>=</span> <span class='id identifier rubyid_price_option'>price_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_s0'>s0</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='op'>+</span> <span class='id identifier rubyid_h_r'>h_r</span><span class='comma'>,</span> <span class='id identifier rubyid_volatility'>volatility</span><span class='comma'>,</span> <span class='id identifier rubyid_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span><span class='rparen'>)</span>
479
+ <span class='id identifier rubyid_rho'>rho</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='id identifier rubyid_price_r_up'>price_r_up</span> <span class='op'>-</span> <span class='id identifier rubyid_price'>price</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='id identifier rubyid_h_r'>h_r</span>
480
+
481
+ <span class='comment'># Return Greeks
482
+ </span> <span class='lbrace'>{</span>
483
+ <span class='label'>delta:</span> <span class='id identifier rubyid_delta'>delta</span><span class='comma'>,</span>
484
+ <span class='label'>gamma:</span> <span class='id identifier rubyid_gamma'>gamma</span><span class='comma'>,</span>
485
+ <span class='label'>theta:</span> <span class='id identifier rubyid_theta'>theta</span><span class='comma'>,</span>
486
+ <span class='label'>vega:</span> <span class='id identifier rubyid_vega'>vega</span><span class='comma'>,</span>
487
+ <span class='label'>rho:</span> <span class='id identifier rubyid_rho'>rho</span><span class='comma'>,</span>
488
+ <span class='rbrace'>}</span>
489
+ <span class='kw'>end</span></pre>
490
+ </td>
491
+ </tr>
492
+ </table>
493
+ </div>
494
+
495
+ <div class="method_details ">
496
+ <h3 class="signature " id="get_tree-class_method">
497
+
498
+ .<strong>get_tree</strong>(option_type, s0, x, r, volatility, years_to_maturity, n_steps = 15, is_american = true, dividend_yield = 0.0) &#x21d2; <tt>Hash</tt>
499
+
500
+
501
+
502
+
503
+
504
+ </h3><div class="docstring">
505
+ <div class="discussion">
506
+ <p>Get a full binomial tree as a structured output</p>
507
+
508
+
509
+ </div>
510
+ </div>
511
+ <div class="tags">
512
+ <p class="tag_title">Parameters:</p>
513
+ <ul class="param">
514
+
515
+ <li>
516
+
517
+ <span class='name'>option_type</span>
518
+
519
+
520
+ <span class='type'>(<tt>String</tt>)</span>
521
+
522
+
523
+
524
+ &mdash;
525
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
526
+ </div>
527
+
528
+ </li>
529
+
530
+ <li>
531
+
532
+ <span class='name'>s0</span>
533
+
534
+
535
+ <span class='type'>(<tt>Float</tt>)</span>
536
+
537
+
538
+
539
+ &mdash;
540
+ <div class='inline'><p>Spot price</p>
541
+ </div>
542
+
543
+ </li>
544
+
545
+ <li>
546
+
547
+ <span class='name'>x</span>
548
+
549
+
550
+ <span class='type'>(<tt>Float</tt>)</span>
551
+
552
+
553
+
554
+ &mdash;
555
+ <div class='inline'><p>Strike price</p>
556
+ </div>
557
+
558
+ </li>
559
+
560
+ <li>
561
+
562
+ <span class='name'>r</span>
563
+
564
+
565
+ <span class='type'>(<tt>Float</tt>)</span>
566
+
567
+
568
+
569
+ &mdash;
570
+ <div class='inline'><p>Risk-free interest rate</p>
571
+ </div>
572
+
573
+ </li>
574
+
575
+ <li>
576
+
577
+ <span class='name'>volatility</span>
578
+
579
+
580
+ <span class='type'>(<tt>Float</tt>)</span>
581
+
582
+
583
+
584
+ &mdash;
585
+ <div class='inline'><p>Volatility</p>
586
+ </div>
587
+
588
+ </li>
589
+
590
+ <li>
591
+
592
+ <span class='name'>years_to_maturity</span>
593
+
594
+
595
+ <span class='type'>(<tt>Float</tt>)</span>
596
+
597
+
598
+
599
+ &mdash;
600
+ <div class='inline'><p>Time to maturity in years</p>
601
+ </div>
602
+
603
+ </li>
604
+
605
+ <li>
606
+
607
+ <span class='name'>n_steps</span>
608
+
609
+
610
+ <span class='type'>(<tt>Integer</tt>)</span>
611
+
612
+
613
+ <em class="default">(defaults to: <tt>15</tt>)</em>
614
+
615
+
616
+ &mdash;
617
+ <div class='inline'><p>Number of time steps</p>
618
+ </div>
619
+
620
+ </li>
621
+
622
+ <li>
623
+
624
+ <span class='name'>is_american</span>
625
+
626
+
627
+ <span class='type'>(<tt>Boolean</tt>)</span>
628
+
629
+
630
+ <em class="default">(defaults to: <tt>true</tt>)</em>
631
+
632
+
633
+ &mdash;
634
+ <div class='inline'><p>True for American options, false for European</p>
635
+ </div>
636
+
637
+ </li>
638
+
639
+ <li>
640
+
641
+ <span class='name'>dividend_yield</span>
642
+
643
+
644
+ <span class='type'>(<tt>Float</tt>)</span>
645
+
646
+
647
+ <em class="default">(defaults to: <tt>0.0</tt>)</em>
648
+
649
+
650
+ &mdash;
651
+ <div class='inline'><p>Continuous dividend yield</p>
652
+ </div>
653
+
654
+ </li>
655
+
656
+ </ul>
657
+
658
+ <p class="tag_title">Returns:</p>
659
+ <ul class="return">
660
+
661
+ <li>
662
+
663
+
664
+ <span class='type'>(<tt>Hash</tt>)</span>
665
+
666
+
667
+
668
+ &mdash;
669
+ <div class='inline'><p>Tree structure with stock prices and option values</p>
670
+ </div>
671
+
672
+ </li>
673
+
674
+ </ul>
675
+
676
+ </div><table class="source_code">
677
+ <tr>
678
+ <td>
679
+ <pre class="lines">
680
+
681
+
682
+ 102
683
+ 103
684
+ 104
685
+ 105
686
+ 106
687
+ 107
688
+ 108
689
+ 109
690
+ 110
691
+ 111
692
+ 112
693
+ 113
694
+ 114
695
+ 115
696
+ 116
697
+ 117
698
+ 118
699
+ 119
700
+ 120
701
+ 121
702
+ 122
703
+ 123
704
+ 124
705
+ 125
706
+ 126
707
+ 127
708
+ 128
709
+ 129
710
+ 130
711
+ 131
712
+ 132
713
+ 133
714
+ 134
715
+ 135
716
+ 136
717
+ 137
718
+ 138
719
+ 139
720
+ 140
721
+ 141
722
+ 142
723
+ 143
724
+ 144
725
+ 145
726
+ 146
727
+ 147
728
+ 148
729
+ 149
730
+ 150
731
+ 151
732
+ 152
733
+ 153
734
+ 154
735
+ 155
736
+ 156
737
+ 157
738
+ 158
739
+ 159
740
+ 160
741
+ 161
742
+ 162
743
+ 163
744
+ 164
745
+ 165
746
+ 166
747
+ 167
748
+ 168
749
+ 169
750
+ 170
751
+ 171
752
+ 172
753
+ 173
754
+ 174
755
+ 175
756
+ 176
757
+ 177</pre>
758
+ </td>
759
+ <td>
760
+ <pre class="code"><span class="info file"># File 'lib/option_lab/binomial_tree.rb', line 102</span>
761
+
762
+ <span class='kw'>def</span> <span class='id identifier rubyid_get_tree'>get_tree</span><span class='lparen'>(</span><span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span> <span class='id identifier rubyid_s0'>s0</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_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>=</span> <span class='int'>15</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span> <span class='op'>=</span> <span class='kw'>true</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span> <span class='op'>=</span> <span class='float'>0.0</span><span class='rparen'>)</span>
763
+ <span class='comment'># Calculate time step
764
+ </span> <span class='id identifier rubyid_dt'>dt</span> <span class='op'>=</span> <span class='id identifier rubyid_years_to_maturity'>years_to_maturity</span> <span class='op'>/</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span>
765
+
766
+ <span class='comment'># Calculate up and down factors
767
+ </span> <span class='id identifier rubyid_u'>u</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</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_dt'>dt</span><span class='rparen'>)</span><span class='rparen'>)</span>
768
+ <span class='id identifier rubyid_d'>d</span> <span class='op'>=</span> <span class='float'>1.0</span> <span class='op'>/</span> <span class='id identifier rubyid_u'>u</span>
769
+
770
+ <span class='comment'># Calculate risk-neutral probability
771
+ </span> <span class='id identifier rubyid_effective_r'>effective_r</span> <span class='op'>=</span> <span class='id identifier rubyid_r'>r</span> <span class='op'>-</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span>
772
+ <span class='id identifier rubyid_p'>p</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</span><span class='id identifier rubyid_effective_r'>effective_r</span> <span class='op'>*</span> <span class='id identifier rubyid_dt'>dt</span><span class='rparen'>)</span> <span class='op'>-</span> <span class='id identifier rubyid_d'>d</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='lparen'>(</span><span class='id identifier rubyid_u'>u</span> <span class='op'>-</span> <span class='id identifier rubyid_d'>d</span><span class='rparen'>)</span>
773
+
774
+ <span class='comment'># Calculate discount factor
775
+ </span> <span class='id identifier rubyid_discount'>discount</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</span><span class='op'>-</span><span class='id identifier rubyid_r'>r</span> <span class='op'>*</span> <span class='id identifier rubyid_dt'>dt</span><span class='rparen'>)</span>
776
+
777
+ <span class='comment'># Initialize price tree
778
+ </span> <span class='id identifier rubyid_stock_prices'>stock_prices</span> <span class='op'>=</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
779
+ <span class='id identifier rubyid_option_values'>option_values</span> <span class='op'>=</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
780
+ <span class='id identifier rubyid_exercise_flags'>exercise_flags</span> <span class='op'>=</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='comma'>,</span> <span class='kw'>false</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
781
+
782
+ <span class='comment'># Fill stock price tree
783
+ </span> <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rparen'>)</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_i'>i</span><span class='op'>|</span>
784
+ <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_i'>i</span><span class='rparen'>)</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_j'>j</span><span class='op'>|</span>
785
+ <span class='id identifier rubyid_stock_prices'>stock_prices</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_s0'>s0</span> <span class='op'>*</span> <span class='lparen'>(</span><span class='id identifier rubyid_u'>u</span><span class='op'>**</span><span class='lparen'>(</span><span class='id identifier rubyid_i'>i</span> <span class='op'>-</span> <span class='id identifier rubyid_j'>j</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='op'>*</span> <span class='lparen'>(</span><span class='id identifier rubyid_d'>d</span><span class='op'>**</span><span class='id identifier rubyid_j'>j</span><span class='rparen'>)</span>
786
+ <span class='kw'>end</span>
787
+ <span class='kw'>end</span>
788
+
789
+ <span class='comment'># Calculate option values at expiration (i = n_steps)
790
+ </span> <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rparen'>)</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_j'>j</span><span class='op'>|</span>
791
+ <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_option_payoff'>option_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_stock_prices'>stock_prices</span><span class='lbracket'>[</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
792
+ <span class='kw'>end</span>
793
+
794
+ <span class='comment'># Work backwards through the tree
795
+ </span> <span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>-</span> <span class='int'>1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_downto'>downto</span><span class='lparen'>(</span><span class='int'>0</span><span class='rparen'>)</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
796
+ <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_i'>i</span><span class='rparen'>)</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_j'>j</span><span class='op'>|</span>
797
+ <span class='comment'># Expected value (European option value)
798
+ </span> <span class='id identifier rubyid_expected_value'>expected_value</span> <span class='op'>=</span> <span class='id identifier rubyid_discount'>discount</span> <span class='op'>*</span> <span class='lparen'>(</span><span class='id identifier rubyid_p'>p</span> <span class='op'>*</span> <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span> <span class='op'>+</span> <span class='int'>1</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>+</span> <span class='lparen'>(</span><span class='int'>1</span> <span class='op'>-</span> <span class='id identifier rubyid_p'>p</span><span class='rparen'>)</span> <span class='op'>*</span> <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span> <span class='op'>+</span> <span class='int'>1</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span> <span class='op'>+</span> <span class='int'>1</span><span class='rbracket'>]</span><span class='rparen'>)</span>
799
+
800
+ <span class='kw'>if</span> <span class='id identifier rubyid_is_american'>is_american</span>
801
+ <span class='comment'># For American options, compare with immediate exercise value
802
+ </span> <span class='id identifier rubyid_exercise_value'>exercise_value</span> <span class='op'>=</span> <span class='id identifier rubyid_option_payoff'>option_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_stock_prices'>stock_prices</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
803
+
804
+ <span class='kw'>if</span> <span class='id identifier rubyid_exercise_value'>exercise_value</span> <span class='op'>&gt;</span> <span class='id identifier rubyid_expected_value'>expected_value</span>
805
+ <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_exercise_value'>exercise_value</span>
806
+ <span class='id identifier rubyid_exercise_flags'>exercise_flags</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='kw'>true</span>
807
+ <span class='kw'>else</span>
808
+ <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_expected_value'>expected_value</span>
809
+ <span class='kw'>end</span>
810
+ <span class='kw'>else</span>
811
+ <span class='comment'># For European options, use expected value
812
+ </span> <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_expected_value'>expected_value</span>
813
+ <span class='kw'>end</span>
814
+ <span class='kw'>end</span>
815
+ <span class='kw'>end</span>
816
+
817
+ <span class='comment'># Return tree structure
818
+ </span> <span class='lbrace'>{</span>
819
+ <span class='label'>stock_prices:</span> <span class='id identifier rubyid_stock_prices'>stock_prices</span><span class='comma'>,</span>
820
+ <span class='label'>option_values:</span> <span class='id identifier rubyid_option_values'>option_values</span><span class='comma'>,</span>
821
+ <span class='label'>exercise_flags:</span> <span class='id identifier rubyid_exercise_flags'>exercise_flags</span><span class='comma'>,</span>
822
+ <span class='label'>parameters:</span> <span class='lbrace'>{</span>
823
+ <span class='label'>option_type:</span> <span class='id identifier rubyid_option_type'>option_type</span><span class='comma'>,</span>
824
+ <span class='label'>spot_price:</span> <span class='id identifier rubyid_s0'>s0</span><span class='comma'>,</span>
825
+ <span class='label'>strike_price:</span> <span class='id identifier rubyid_x'>x</span><span class='comma'>,</span>
826
+ <span class='label'>risk_free_rate:</span> <span class='id identifier rubyid_r'>r</span><span class='comma'>,</span>
827
+ <span class='label'>volatility:</span> <span class='id identifier rubyid_volatility'>volatility</span><span class='comma'>,</span>
828
+ <span class='label'>time_to_maturity:</span> <span class='id identifier rubyid_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span>
829
+ <span class='label'>steps:</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='comma'>,</span>
830
+ <span class='label'>is_american:</span> <span class='id identifier rubyid_is_american'>is_american</span><span class='comma'>,</span>
831
+ <span class='label'>dividend_yield:</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span><span class='comma'>,</span>
832
+ <span class='label'>up_factor:</span> <span class='id identifier rubyid_u'>u</span><span class='comma'>,</span>
833
+ <span class='label'>down_factor:</span> <span class='id identifier rubyid_d'>d</span><span class='comma'>,</span>
834
+ <span class='label'>risk_neutral_probability:</span> <span class='id identifier rubyid_p'>p</span><span class='comma'>,</span>
835
+ <span class='rbrace'>}</span><span class='comma'>,</span>
836
+ <span class='rbrace'>}</span>
837
+ <span class='kw'>end</span></pre>
838
+ </td>
839
+ </tr>
840
+ </table>
841
+ </div>
842
+
843
+ <div class="method_details ">
844
+ <h3 class="signature " id="option_payoff-class_method">
845
+
846
+ .<strong>option_payoff</strong>(option_type, stock_price, strike) &#x21d2; <tt>Float</tt>
847
+
848
+
849
+
850
+
851
+
852
+ </h3><div class="docstring">
853
+ <div class="discussion">
854
+ <p>Calculate option payoff at expiration</p>
855
+
856
+
857
+ </div>
858
+ </div>
859
+ <div class="tags">
860
+ <p class="tag_title">Parameters:</p>
861
+ <ul class="param">
862
+
863
+ <li>
864
+
865
+ <span class='name'>option_type</span>
866
+
867
+
868
+ <span class='type'>(<tt>String</tt>)</span>
869
+
870
+
871
+
872
+ &mdash;
873
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
874
+ </div>
875
+
876
+ </li>
877
+
878
+ <li>
879
+
880
+ <span class='name'>stock_price</span>
881
+
882
+
883
+ <span class='type'>(<tt>Float</tt>)</span>
884
+
885
+
886
+
887
+ &mdash;
888
+ <div class='inline'><p>Stock price</p>
889
+ </div>
890
+
891
+ </li>
892
+
893
+ <li>
894
+
895
+ <span class='name'>strike</span>
896
+
897
+
898
+ <span class='type'>(<tt>Float</tt>)</span>
899
+
900
+
901
+
902
+ &mdash;
903
+ <div class='inline'><p>Strike price</p>
904
+ </div>
905
+
906
+ </li>
907
+
908
+ </ul>
909
+
910
+ <p class="tag_title">Returns:</p>
911
+ <ul class="return">
912
+
913
+ <li>
914
+
915
+
916
+ <span class='type'>(<tt>Float</tt>)</span>
917
+
918
+
919
+
920
+ &mdash;
921
+ <div class='inline'><p>Option payoff</p>
922
+ </div>
923
+
924
+ </li>
925
+
926
+ </ul>
927
+
928
+ </div><table class="source_code">
929
+ <tr>
930
+ <td>
931
+ <pre class="lines">
932
+
933
+
934
+ 81
935
+ 82
936
+ 83
937
+ 84
938
+ 85
939
+ 86
940
+ 87
941
+ 88
942
+ 89</pre>
943
+ </td>
944
+ <td>
945
+ <pre class="code"><span class="info file"># File 'lib/option_lab/binomial_tree.rb', line 81</span>
946
+
947
+ <span class='kw'>def</span> <span class='id identifier rubyid_option_payoff'>option_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_stock_price'>stock_price</span><span class='comma'>,</span> <span class='id identifier rubyid_strike'>strike</span><span class='rparen'>)</span>
948
+ <span class='kw'>if</span> <span class='id identifier rubyid_option_type'>option_type</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>call</span><span class='tstring_end'>&#39;</span></span>
949
+ <span class='lbracket'>[</span><span class='id identifier rubyid_stock_price'>stock_price</span> <span class='op'>-</span> <span class='id identifier rubyid_strike'>strike</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_max'>max</span>
950
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_option_type'>option_type</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>put</span><span class='tstring_end'>&#39;</span></span>
951
+ <span class='lbracket'>[</span><span class='id identifier rubyid_strike'>strike</span> <span class='op'>-</span> <span class='id identifier rubyid_stock_price'>stock_price</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_max'>max</span>
952
+ <span class='kw'>else</span>
953
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option type must be either &#39;call&#39; or &#39;put&#39;!</span><span class='tstring_end'>&quot;</span></span>
954
+ <span class='kw'>end</span>
955
+ <span class='kw'>end</span></pre>
956
+ </td>
957
+ </tr>
958
+ </table>
959
+ </div>
960
+
961
+ <div class="method_details ">
962
+ <h3 class="signature " id="price_option-class_method">
963
+
964
+ .<strong>price_option</strong>(option_type, s0, x, r, volatility, years_to_maturity, n_steps = 100, is_american = true, dividend_yield = 0.0) &#x21d2; <tt>Float</tt>
965
+
966
+
967
+
968
+
969
+
970
+ </h3><div class="docstring">
971
+ <div class="discussion">
972
+ <p>Price an option using the Cox-Ross-Rubinstein binomial tree model</p>
973
+
974
+
975
+ </div>
976
+ </div>
977
+ <div class="tags">
978
+ <p class="tag_title">Parameters:</p>
979
+ <ul class="param">
980
+
981
+ <li>
982
+
983
+ <span class='name'>option_type</span>
984
+
985
+
986
+ <span class='type'>(<tt>String</tt>)</span>
987
+
988
+
989
+
990
+ &mdash;
991
+ <div class='inline'><p>&#39;call&#39; or &#39;put&#39;</p>
992
+ </div>
993
+
994
+ </li>
995
+
996
+ <li>
997
+
998
+ <span class='name'>s0</span>
999
+
1000
+
1001
+ <span class='type'>(<tt>Float</tt>)</span>
1002
+
1003
+
1004
+
1005
+ &mdash;
1006
+ <div class='inline'><p>Spot price</p>
1007
+ </div>
1008
+
1009
+ </li>
1010
+
1011
+ <li>
1012
+
1013
+ <span class='name'>x</span>
1014
+
1015
+
1016
+ <span class='type'>(<tt>Float</tt>)</span>
1017
+
1018
+
1019
+
1020
+ &mdash;
1021
+ <div class='inline'><p>Strike price</p>
1022
+ </div>
1023
+
1024
+ </li>
1025
+
1026
+ <li>
1027
+
1028
+ <span class='name'>r</span>
1029
+
1030
+
1031
+ <span class='type'>(<tt>Float</tt>)</span>
1032
+
1033
+
1034
+
1035
+ &mdash;
1036
+ <div class='inline'><p>Risk-free interest rate</p>
1037
+ </div>
1038
+
1039
+ </li>
1040
+
1041
+ <li>
1042
+
1043
+ <span class='name'>volatility</span>
1044
+
1045
+
1046
+ <span class='type'>(<tt>Float</tt>)</span>
1047
+
1048
+
1049
+
1050
+ &mdash;
1051
+ <div class='inline'><p>Volatility</p>
1052
+ </div>
1053
+
1054
+ </li>
1055
+
1056
+ <li>
1057
+
1058
+ <span class='name'>years_to_maturity</span>
1059
+
1060
+
1061
+ <span class='type'>(<tt>Float</tt>)</span>
1062
+
1063
+
1064
+
1065
+ &mdash;
1066
+ <div class='inline'><p>Time to maturity in years</p>
1067
+ </div>
1068
+
1069
+ </li>
1070
+
1071
+ <li>
1072
+
1073
+ <span class='name'>n_steps</span>
1074
+
1075
+
1076
+ <span class='type'>(<tt>Integer</tt>)</span>
1077
+
1078
+
1079
+ <em class="default">(defaults to: <tt>100</tt>)</em>
1080
+
1081
+
1082
+ &mdash;
1083
+ <div class='inline'><p>Number of time steps</p>
1084
+ </div>
1085
+
1086
+ </li>
1087
+
1088
+ <li>
1089
+
1090
+ <span class='name'>is_american</span>
1091
+
1092
+
1093
+ <span class='type'>(<tt>Boolean</tt>)</span>
1094
+
1095
+
1096
+ <em class="default">(defaults to: <tt>true</tt>)</em>
1097
+
1098
+
1099
+ &mdash;
1100
+ <div class='inline'><p>True for American options, false for European</p>
1101
+ </div>
1102
+
1103
+ </li>
1104
+
1105
+ <li>
1106
+
1107
+ <span class='name'>dividend_yield</span>
1108
+
1109
+
1110
+ <span class='type'>(<tt>Float</tt>)</span>
1111
+
1112
+
1113
+ <em class="default">(defaults to: <tt>0.0</tt>)</em>
1114
+
1115
+
1116
+ &mdash;
1117
+ <div class='inline'><p>Continuous dividend yield</p>
1118
+ </div>
1119
+
1120
+ </li>
1121
+
1122
+ </ul>
1123
+
1124
+ <p class="tag_title">Returns:</p>
1125
+ <ul class="return">
1126
+
1127
+ <li>
1128
+
1129
+
1130
+ <span class='type'>(<tt>Float</tt>)</span>
1131
+
1132
+
1133
+
1134
+ &mdash;
1135
+ <div class='inline'><p>Option price</p>
1136
+ </div>
1137
+
1138
+ </li>
1139
+
1140
+ </ul>
1141
+
1142
+ </div><table class="source_code">
1143
+ <tr>
1144
+ <td>
1145
+ <pre class="lines">
1146
+
1147
+
1148
+ 24
1149
+ 25
1150
+ 26
1151
+ 27
1152
+ 28
1153
+ 29
1154
+ 30
1155
+ 31
1156
+ 32
1157
+ 33
1158
+ 34
1159
+ 35
1160
+ 36
1161
+ 37
1162
+ 38
1163
+ 39
1164
+ 40
1165
+ 41
1166
+ 42
1167
+ 43
1168
+ 44
1169
+ 45
1170
+ 46
1171
+ 47
1172
+ 48
1173
+ 49
1174
+ 50
1175
+ 51
1176
+ 52
1177
+ 53
1178
+ 54
1179
+ 55
1180
+ 56
1181
+ 57
1182
+ 58
1183
+ 59
1184
+ 60
1185
+ 61
1186
+ 62
1187
+ 63
1188
+ 64
1189
+ 65
1190
+ 66
1191
+ 67
1192
+ 68
1193
+ 69
1194
+ 70
1195
+ 71
1196
+ 72
1197
+ 73
1198
+ 74</pre>
1199
+ </td>
1200
+ <td>
1201
+ <pre class="code"><span class="info file"># File 'lib/option_lab/binomial_tree.rb', line 24</span>
1202
+
1203
+ <span class='kw'>def</span> <span class='id identifier rubyid_price_option'>price_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_s0'>s0</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_years_to_maturity'>years_to_maturity</span><span class='comma'>,</span> <span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>=</span> <span class='int'>100</span><span class='comma'>,</span> <span class='id identifier rubyid_is_american'>is_american</span> <span class='op'>=</span> <span class='kw'>true</span><span class='comma'>,</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span> <span class='op'>=</span> <span class='float'>0.0</span><span class='rparen'>)</span>
1204
+ <span class='comment'># Calculate time step
1205
+ </span> <span class='id identifier rubyid_dt'>dt</span> <span class='op'>=</span> <span class='id identifier rubyid_years_to_maturity'>years_to_maturity</span> <span class='op'>/</span> <span class='id identifier rubyid_n_steps'>n_steps</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span>
1206
+
1207
+ <span class='comment'># Calculate up and down factors
1208
+ </span> <span class='id identifier rubyid_u'>u</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</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_dt'>dt</span><span class='rparen'>)</span><span class='rparen'>)</span>
1209
+ <span class='id identifier rubyid_d'>d</span> <span class='op'>=</span> <span class='float'>1.0</span> <span class='op'>/</span> <span class='id identifier rubyid_u'>u</span>
1210
+
1211
+ <span class='comment'># Calculate risk-neutral probability
1212
+ </span> <span class='id identifier rubyid_effective_r'>effective_r</span> <span class='op'>=</span> <span class='id identifier rubyid_r'>r</span> <span class='op'>-</span> <span class='id identifier rubyid_dividend_yield'>dividend_yield</span>
1213
+ <span class='id identifier rubyid_p'>p</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</span><span class='id identifier rubyid_effective_r'>effective_r</span> <span class='op'>*</span> <span class='id identifier rubyid_dt'>dt</span><span class='rparen'>)</span> <span class='op'>-</span> <span class='id identifier rubyid_d'>d</span><span class='rparen'>)</span> <span class='op'>/</span> <span class='lparen'>(</span><span class='id identifier rubyid_u'>u</span> <span class='op'>-</span> <span class='id identifier rubyid_d'>d</span><span class='rparen'>)</span>
1214
+
1215
+ <span class='comment'># Calculate discount factor
1216
+ </span> <span class='id identifier rubyid_discount'>discount</span> <span class='op'>=</span> <span class='const'>Math</span><span class='period'>.</span><span class='id identifier rubyid_exp'>exp</span><span class='lparen'>(</span><span class='op'>-</span><span class='id identifier rubyid_r'>r</span> <span class='op'>*</span> <span class='id identifier rubyid_dt'>dt</span><span class='rparen'>)</span>
1217
+
1218
+ <span class='comment'># Initialize price tree
1219
+ </span> <span class='id identifier rubyid_stock_prices'>stock_prices</span> <span class='op'>=</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
1220
+ <span class='id identifier rubyid_option_values'>option_values</span> <span class='op'>=</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='const'>Array</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>+</span> <span class='int'>1</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
1221
+
1222
+ <span class='comment'># Fill stock price tree
1223
+ </span> <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rparen'>)</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_i'>i</span><span class='op'>|</span>
1224
+ <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_i'>i</span><span class='rparen'>)</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_j'>j</span><span class='op'>|</span>
1225
+ <span class='id identifier rubyid_stock_prices'>stock_prices</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_s0'>s0</span> <span class='op'>*</span> <span class='lparen'>(</span><span class='id identifier rubyid_u'>u</span><span class='op'>**</span><span class='lparen'>(</span><span class='id identifier rubyid_i'>i</span> <span class='op'>-</span> <span class='id identifier rubyid_j'>j</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='op'>*</span> <span class='lparen'>(</span><span class='id identifier rubyid_d'>d</span><span class='op'>**</span><span class='id identifier rubyid_j'>j</span><span class='rparen'>)</span>
1226
+ <span class='kw'>end</span>
1227
+ <span class='kw'>end</span>
1228
+
1229
+ <span class='comment'># Calculate option values at expiration (i = n_steps)
1230
+ </span> <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rparen'>)</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_j'>j</span><span class='op'>|</span>
1231
+ <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_option_payoff'>option_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_stock_prices'>stock_prices</span><span class='lbracket'>[</span><span class='id identifier rubyid_n_steps'>n_steps</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
1232
+ <span class='kw'>end</span>
1233
+
1234
+ <span class='comment'># Work backwards through the tree
1235
+ </span> <span class='lparen'>(</span><span class='id identifier rubyid_n_steps'>n_steps</span> <span class='op'>-</span> <span class='int'>1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_downto'>downto</span><span class='lparen'>(</span><span class='int'>0</span><span class='rparen'>)</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1236
+ <span class='lparen'>(</span><span class='int'>0</span><span class='op'>..</span><span class='id identifier rubyid_i'>i</span><span class='rparen'>)</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_j'>j</span><span class='op'>|</span>
1237
+ <span class='comment'># Expected value (European option value)
1238
+ </span> <span class='id identifier rubyid_expected_value'>expected_value</span> <span class='op'>=</span> <span class='id identifier rubyid_discount'>discount</span> <span class='op'>*</span> <span class='lparen'>(</span><span class='id identifier rubyid_p'>p</span> <span class='op'>*</span> <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span> <span class='op'>+</span> <span class='int'>1</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>+</span> <span class='lparen'>(</span><span class='int'>1</span> <span class='op'>-</span> <span class='id identifier rubyid_p'>p</span><span class='rparen'>)</span> <span class='op'>*</span> <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span> <span class='op'>+</span> <span class='int'>1</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span> <span class='op'>+</span> <span class='int'>1</span><span class='rbracket'>]</span><span class='rparen'>)</span>
1239
+
1240
+ <span class='kw'>if</span> <span class='id identifier rubyid_is_american'>is_american</span>
1241
+ <span class='comment'># For American options, compare with immediate exercise value
1242
+ </span> <span class='id identifier rubyid_exercise_value'>exercise_value</span> <span class='op'>=</span> <span class='id identifier rubyid_option_payoff'>option_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_stock_prices'>stock_prices</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_x'>x</span><span class='rparen'>)</span>
1243
+ <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='id identifier rubyid_expected_value'>expected_value</span><span class='comma'>,</span> <span class='id identifier rubyid_exercise_value'>exercise_value</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_max'>max</span>
1244
+ <span class='kw'>else</span>
1245
+ <span class='comment'># For European options, use expected value
1246
+ </span> <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_j'>j</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_expected_value'>expected_value</span>
1247
+ <span class='kw'>end</span>
1248
+ <span class='kw'>end</span>
1249
+ <span class='kw'>end</span>
1250
+
1251
+ <span class='comment'># Root node contains the option price
1252
+ </span> <span class='id identifier rubyid_option_values'>option_values</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
1253
+ <span class='kw'>end</span></pre>
1254
+ </td>
1255
+ </tr>
1256
+ </table>
1257
+ </div>
1258
+
1259
+ </div>
1260
+
1261
+ </div>
1262
+
1263
+ <div id="footer">
1264
+ Generated on Sun Apr 27 16:09:33 2025 by
1265
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1266
+ 0.9.37 (ruby-3.3.3).
1267
+ </div>
1268
+
1269
+ </div>
1270
+ </body>
1271
+ </html>