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,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
|
+
— 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> »
|
40
|
+
<span class='title'><span class='object_link'><a href="../OptionLab.html" title="OptionLab (module)">OptionLab</a></span></span>
|
41
|
+
»
|
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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ <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
|
+
—
|
243
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>></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) ⇒ <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
|
+
—
|
525
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>></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) ⇒ <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
|
+
—
|
873
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>call</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>put</span><span class='tstring_end'>'</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'>"</span><span class='tstring_content'>Option type must be either 'call' or 'put'!</span><span class='tstring_end'>"</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) ⇒ <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
|
+
—
|
991
|
+
<div class='inline'><p>'call' or 'put'</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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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>
|