40 { 60.11, 65.11, 0.31, 0.25, 0.08 },
41 { 60.22, 65.22, 0.32, 0.25, 0.08 },
42 { 60.33, 65.33, 0.33, 0.25, 0.08 },
43 { 60.44, 65.44, 0.34, 0.25, 0.08 },
44 { 60.55, 65.55, 0.35, 0.25, 0.08 },
45 { 60.66, 65.66, 0.36, 0.25, 0.08 },
46 { 60.77, 65.77, 0.37, 0.25, 0.08 },
47 { 60.88, 65.88, 0.38, 0.25, 0.08 },
48 { 60.11, 65.11, 0.31, 0.25, 0.08 },
49 { 60.22, 65.22, 0.32, 0.25, 0.08 },
50 { 60.33, 65.33, 0.33, 0.25, 0.08 },
51 { 60.44, 65.44, 0.34, 0.25, 0.08 },
52 { 60.55, 65.55, 0.35, 0.25, 0.08 },
53 { 60.66, 65.66, 0.36, 0.25, 0.08 },
54 { 60.77, 65.77, 0.37, 0.25, 0.08 },
55 { 60.88, 65.88, 0.38, 0.25, 0.08 }
67 const std::string bsm_model_program =
68 " var d1 := (log(s / k) + (r + v^2 / 2) * t) / (v * sqrt(t)); "
69 " var d2 := d1 - v * sqrt(t); "
71 " if (callput_flag == 'call') "
72 " s * ncdf(d1) - k * e^(-r * t) * ncdf(d2); "
73 " else if (callput_flag == 'put') "
74 " k * e^(-r * t) * ncdf(-d2) - s * ncdf(-d1); "
77 const std::string bsm_model_program_opt1 =
78 " var v_sqrtt := (v * sqrt(t)); "
79 " var d1 := (log(s / k) + (r + v * v / 2) * t) / v_sqrtt; "
80 " var d2 := d1 - v_sqrtt; "
81 " var kert := k * exp(-r * t); "
83 " if (callput_flag == 'call') "
84 " s * ncdf(d1) - kert * ncdf(d2); "
85 " else if (callput_flag == 'put') "
86 " kert * ncdf(-d2) - s * ncdf(-d1); "
89 const std::string bsm_model_program_opt2 =
90 " var v_sqrtt := (v * sqrt(t)); "
91 " var d1 := (log(s / k) + (r + v * v / 2) * t) / v_sqrtt; "
92 " var d2 := d1 - v_sqrtt; "
94 " if (callput_flag == 'call') "
95 " s * ncdf(d1) - (k * exp(-r * t)) * ncdf(d2); "
96 " else if (callput_flag == 'put') "
97 " (k * exp(-r * t)) * ncdf(-d2) - s * ncdf(-d1); "
106 std::string callput_flag;
110 symbol_table_t symbol_table;
111 symbol_table.add_variable(
"s",s);
112 symbol_table.add_variable(
"k",k);
113 symbol_table.add_variable(
"t",t);
114 symbol_table.add_variable(
"r",r);
115 symbol_table.add_variable(
"v",v);
116 symbol_table.add_constant(
"e",e);
117 symbol_table.add_stringvar(
"callput_flag",callput_flag);
119 expression_t bsm_expression (symbol_table);
120 expression_t bsm_expression_opt1(symbol_table);
121 expression_t bsm_expression_opt2(symbol_table);
125 parser.compile(bsm_model_program , bsm_expression );
126 parser.compile(bsm_model_program_opt1, bsm_expression_opt1);
127 parser.compile(bsm_model_program_opt2, bsm_expression_opt2);
135 for (std::size_t i = 0; i <
rounds; ++i)
145 callput_flag =
"call";
146 total += bsm_expression.value();
148 callput_flag =
"put";
149 total += bsm_expression.value();
154 printf(
"[exprtk0] Total: %16.5f\tTime:%8.3fsec\tRate:%16.3fbsm/sec\n",
166 for (std::size_t i = 0; i <
rounds; ++i)
176 callput_flag =
"call";
177 total += bsm_expression_opt1.value();
179 callput_flag =
"put";
180 total += bsm_expression_opt1.value();
185 printf(
"[exprtk1] Total: %16.5f\tTime:%8.3fsec\tRate:%16.3fbsm/sec\n",
197 for (std::size_t i = 0; i <
rounds; ++i)
207 callput_flag =
"call";
208 total += bsm_expression_opt2.value();
210 callput_flag =
"put";
211 total += bsm_expression_opt2.value();
216 printf(
"[exprtk2] Total: %16.5f\tTime:%8.3fsec\tRate:%16.3fbsm/sec\n",