40 { 60.11, 65.11, 0.31, 0.25, 0.08 },
41 { 60.22, 65.22, 0.32, 0.35, 0.07 },
42 { 60.33, 65.33, 0.33, 0.45, 0.06 },
43 { 60.44, 65.44, 0.34, 0.55, 0.05 },
44 { 60.55, 65.55, 0.35, 0.65, 0.04 },
45 { 60.66, 65.66, 0.36, 0.75, 0.03 },
46 { 60.77, 65.77, 0.37, 0.85, 0.08 },
47 { 60.88, 65.88, 0.38, 0.95, 0.07 },
48 { 60.11, 65.11, 0.31, 0.25, 0.06 },
49 { 60.22, 65.22, 0.32, 0.35, 0.05 },
50 { 60.33, 65.33, 0.33, 0.45, 0.04 },
51 { 60.44, 65.44, 0.34, 0.55, 0.03 },
52 { 60.55, 65.55, 0.35, 0.65, 0.08 },
53 { 60.66, 65.66, 0.36, 0.75, 0.07 },
54 { 60.77, 65.77, 0.37, 0.85, 0.06 },
55 { 60.88, 65.88, 0.38, 0.95, 0.05 }
87 const std::string bsm_model_program =
88 " var d1 := (log(s / k) + (r + v^2 / 2) * t) / (v * sqrt(t)); "
89 " var d2 := d1 - v * sqrt(t); "
91 " if (callput_flag == 'call') "
92 " s * ncdf(d1) - k * e^(-r * t) * ncdf(d2); "
93 " else if (callput_flag == 'put') "
94 " k * e^(-r * t) * ncdf(-d2) - s * ncdf(-d1); "
97 const std::string bsm_model_program_opt1 =
98 " var v_sqrtt := (v * sqrt(t)); "
99 " var d1 := (log(s / k) + (r + v * v / 2) * t) / v_sqrtt; "
100 " var d2 := d1 - v_sqrtt; "
101 " var kert := k * exp(-r * t); "
103 " if (callput_flag == 'call') "
104 " s * ncdf(d1) - kert * ncdf(d2); "
105 " else if (callput_flag == 'put') "
106 " kert * ncdf(-d2) - s * ncdf(-d1); "
109 const std::string bsm_model_program_opt2 =
110 " var v_sqrtt := (v * sqrt(t)); "
111 " var d1 := (log(s / k) + (r + v * v / 2) * t) / v_sqrtt; "
112 " var d2 := d1 - v_sqrtt; "
114 " if (callput_flag == 'call') "
115 " s * ncdf(d1) - (k * exp(-r * t)) * ncdf(d2); "
116 " else if (callput_flag == 'put') "
117 " (k * exp(-r * t)) * ncdf(-d2) - s * ncdf(-d1); "
120 const std::string bsm_model_program_opt3 =
121 " if (callput_flag == 'call') "
122 " call_bsm_model(s, k, t, r, v); "
123 " else if (callput_flag == 'put') "
124 " put_bsm_model(s, k, t, r, v); "
129 std::string callput_flag;
133 symbol_table_t symbol_table;
134 symbol_table.add_variable (
"s", parameters.
s );
135 symbol_table.add_variable (
"k", parameters.
k );
136 symbol_table.add_variable (
"t", parameters.
t );
137 symbol_table.add_variable (
"r", parameters.
r );
138 symbol_table.add_variable (
"v", parameters.
v );
139 symbol_table.add_constant (
"e", e );
140 symbol_table.add_stringvar(
"callput_flag" , callput_flag );
142 symbol_table.add_function (
"put_bsm_model" ,
put_bsm_model );
144 expression_t bsm_expression (symbol_table);
145 expression_t bsm_expression_opt1(symbol_table);
146 expression_t bsm_expression_opt2(symbol_table);
147 expression_t bsm_expression_opt3(symbol_table);
151 parser.compile(bsm_model_program , bsm_expression );
152 parser.compile(bsm_model_program_opt1, bsm_expression_opt1);
153 parser.compile(bsm_model_program_opt2, bsm_expression_opt2);
154 parser.compile(bsm_model_program_opt3, bsm_expression_opt3);
162 for (std::size_t i = 0; i <
rounds; ++i)
166 parameters = current_parameters;
168 callput_flag =
"call";
169 total += bsm_expression.value();
171 callput_flag =
"put";
172 total += bsm_expression.value();
177 printf(
"[exprtk0] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",
190 for (std::size_t i = 0; i <
rounds; ++i)
194 parameters = current_parameters;
196 callput_flag =
"call";
197 total += bsm_expression_opt1.value();
199 callput_flag =
"put";
200 total += bsm_expression_opt1.value();
205 printf(
"[exprtk1] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",
218 for (std::size_t i = 0; i <
rounds; ++i)
222 parameters = current_parameters;
224 callput_flag =
"call";
225 total += bsm_expression_opt2.value();
227 callput_flag =
"put";
228 total += bsm_expression_opt2.value();
233 printf(
"[exprtk2] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",
246 for (std::size_t i = 0; i <
rounds; ++i)
250 parameters = current_parameters;
252 callput_flag =
"call";
253 total += bsm_expression_opt3.value();
255 callput_flag =
"put";
256 total += bsm_expression_opt3.value();
261 printf(
"[exprtk3] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",