C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
Functions
exprtk_american_option_binomial_model.cpp File Reference
#include <cstdio>
#include <string>
#include "exprtk.hpp"
Include dependency graph for exprtk_american_option_binomial_model.cpp:

Go to the source code of this file.

Functions

template<typename T >
void american_option_binomial_option_pricing_model ()
 
int main ()
 

Function Documentation

◆ american_option_binomial_option_pricing_model()

template<typename T >
void american_option_binomial_option_pricing_model ( )

Definition at line 27 of file exprtk_american_option_binomial_model.cpp.

28{
29 typedef exprtk::symbol_table<T> symbol_table_t;
30 typedef exprtk::expression<T> expression_t;
31 typedef exprtk::parser<T> parser_t;
32
33 const std::string american_option_binomial_model_program =
34 " var dt := t / n; "
35 " var z := exp(r * dt); "
36 " var u := exp(v * sqrt(dt)); "
37 " var p_up := (z * u - 1) / (u^2 - 1); "
38 " var p_down := 1 - p_up; "
39 " var discount := 1 / z; "
40 " "
41 " var option_price[n + 1] := [0]; "
42 " "
43 " for (var i := 0; i <= n; i += 1) "
44 " { "
45 " var base_price := s * u^(2 * i - n); "
46 " "
47 " option_price[i] := "
48 " switch "
49 " { "
50 " case callput_flag == 'call' : max(base_price - k, 0); "
51 " case callput_flag == 'put' : max(k - base_price, 0); "
52 " }; "
53 " }; "
54 " "
55 " for (var j := n - 1; j >= 0; j -= 1) "
56 " { "
57 " for (var i := 0; i <= j; i += 1) "
58 " { "
59 " var base_price_at_node := s * u^(2 * i - j); "
60 " "
61 " var intrinsic_value := "
62 " switch "
63 " { "
64 " case callput_flag == 'call' : base_price_at_node - k; "
65 " case callput_flag == 'put' : k - base_price_at_node; "
66 " }; "
67 " "
68 " var expected_value := discount * "
69 " (p_up * option_price[i + 1] + p_down * option_price[i]); "
70 " "
71 " option_price[i] := max(expected_value, intrinsic_value); "
72 " } "
73 " }; "
74 " "
75 " option_price[0]; ";
76
77 T s = T( 100.00); // Spot / Stock / Underlying / Base price
78 T k = T( 110.00); // Strike price
79 T v = T( 0.30); // Volatility
80 T t = T( 2.22); // Years to maturity
81 T r = T( 0.05); // Risk free rate
82 T n = T(1000.00); // Number of time steps
83
84 std::string callput_flag;
85
86 symbol_table_t symbol_table(symbol_table_t::e_immutable);
87 symbol_table.add_variable("s", s);
88 symbol_table.add_variable("k", k);
89 symbol_table.add_variable("t", t);
90 symbol_table.add_variable("r", r);
91 symbol_table.add_variable("v", v);
92 symbol_table.add_constant("n", n);
93 symbol_table.add_stringvar("callput_flag",callput_flag);
94
95 expression_t expression;
96 expression.register_symbol_table(symbol_table);
97
98 parser_t parser;
99 parser.compile(american_option_binomial_model_program,expression);
100
101 callput_flag = "call";
102
103 const T binomial_call_option_price = expression.value();
104
105 callput_flag = "put";
106
107 const T binomial_put_option_price = expression.value();
108
109 printf("American BinomialPrice(call, %5.3f, %5.3f, %5.3f, %5.3f, %5.3f) = %22.18f\n",
110 s, k, t, r, v,
111 binomial_call_option_price);
112
113 printf("American BinomialPrice(put , %5.3f, %5.3f, %5.3f, %5.3f, %5.3f) = %22.18f\n",
114 s, k, t, r, v,
115 binomial_put_option_price);
116
117 // American option put-call 'parity': s - k < call - put < s - k * e^(-rt)
118 const T callput_diff = (binomial_call_option_price - binomial_put_option_price);
119 const T basestrike_diff = s - k;
120 const T basepv_diff = s - k * std::exp(-r * t);
121 const bool put_call_parity = (basestrike_diff < callput_diff) &&
122 (callput_diff < basepv_diff ) ;
123
124 const T call_price_r0 = binomial_put_option_price + basestrike_diff;
125 const T call_price_r1 = binomial_put_option_price + basepv_diff;
126
127 const T put_price_r0 = binomial_call_option_price - basepv_diff;
128 const T put_price_r1 = binomial_call_option_price - basestrike_diff;
129
130 printf("Put-Call parity: %s\n", put_call_parity ? "True" : "False");
131
132 printf("Call price range: %7.4f < %7.4f < %7.4f\n",
133 call_price_r0,
134 binomial_call_option_price,
135 call_price_r1);
136
137 printf("Put price range: %7.4f < %7.4f < %7.4f\n",
138 put_price_r0,
139 binomial_put_option_price,
140 put_price_r1);
141}

◆ main()

int main ( )

Definition at line 143 of file exprtk_american_option_binomial_model.cpp.

144{
145 american_option_binomial_option_pricing_model<double>();
146 return 0;
147}