55{
59
60 const std::string exprtk_montecarlo_option_pricing_model_program =
61 " var payoff_sum := 0; "
62 " var sqrt_t := sqrt(t); "
63 " "
64 " for (var i := 0; i < n; i += 1) "
65 " { "
66 " var s_t := s * exp((r - v^2 / 2) * t + v * sqrt_t * normal(0,1)); "
67 " payoff_sum += "
68 " switch "
69 " { "
70 " case callput_flag == 'call' : max(s_t - k, 0); "
71 " case callput_flag == 'put' : max(k - s_t, 0); "
72 " }; "
73 " }; "
74 " "
75 " exp(-r * t) * payoff_sum / n; ";
76
77 T s = T(100.00);
78 T k = T(110.00);
79 T v = T( 0.30);
80 T t = T( 2.22);
81 T r = T( 0.05);
82 T n = T( 2.0e7);
83
84 std::string callput_flag;
85
87
88 symbol_table_t symbol_table(symbol_table_t::e_immutable);
89 symbol_table.add_variable("s",s);
90 symbol_table.add_variable("k",k);
91 symbol_table.add_variable("t",t);
92 symbol_table.add_variable("r",r);
93 symbol_table.add_variable("v",v);
94 symbol_table.add_constant("n",n);
95 symbol_table.add_stringvar("callput_flag", callput_flag);
96 symbol_table.add_function ("normal" , normal );
97
98 expression_t expression;
99 expression.register_symbol_table(symbol_table);
100
101 parser_t parser;
102 parser.compile(exprtk_montecarlo_option_pricing_model_program, expression);
103
104 callput_flag = "call";
105
106 const T montecarlo_call_option_price = expression.value();
107
108 callput_flag = "put";
109
110 const T montecarlo_put_option_price = expression.value();
111
112 printf("MCOptionPrice(call, %5.3f, %5.3f, %5.3f, %5.3f, %5.3f) = %10.6f\n",
113 s, k, t, r, v,
114 montecarlo_call_option_price);
115
116 printf("MCOptionPrice(put , %5.3f, %5.3f, %5.3f, %5.3f, %5.3f) = %10.6f\n",
117 s, k, t, r, v,
118 montecarlo_put_option_price);
119
120 const double put_call_parity_diff =
121 (montecarlo_call_option_price - montecarlo_put_option_price) -
122 (s - k * std::exp(-r * t));
123
124 printf("Put-Call parity difference: %20.17f\n", put_call_parity_diff);
125}