60 const std::string exprtk_montecarlo_option_pricing_model_program =
61 " var payoff_sum := 0; "
62 " var sqrt_t := sqrt(t); "
64 " for (var i := 0; i < n; i += 1) "
66 " var s_t := s * exp((r - v^2 / 2) * t + v * sqrt_t * normal(0,1)); "
70 " case callput_flag == 'call' : max(s_t - k, 0); "
71 " case callput_flag == 'put' : max(k - s_t, 0); "
75 " exp(-r * t) * payoff_sum / n; ";
84 std::string callput_flag;
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 );
98 expression_t expression;
99 expression.register_symbol_table(symbol_table);
102 parser.compile(exprtk_montecarlo_option_pricing_model_program, expression);
104 callput_flag =
"call";
106 const T montecarlo_call_option_price = expression.value();
108 callput_flag =
"put";
110 const T montecarlo_put_option_price = expression.value();
112 printf(
"MCOptionPrice(call, %5.3f, %5.3f, %5.3f, %5.3f, %5.3f) = %10.6f\n",
114 montecarlo_call_option_price);
116 printf(
"MCOptionPrice(put , %5.3f, %5.3f, %5.3f, %5.3f, %5.3f) = %10.6f\n",
118 montecarlo_put_option_price);
120 const double put_call_parity_diff =
121 (montecarlo_call_option_price - montecarlo_put_option_price) -
122 (s - k * std::exp(-r * t));
124 printf(
"Put-Call parity difference: %20.17f\n", put_call_parity_diff);