00001 #include <iostream>
00002 #include <iomanip>
00003
00004 #include "americanfudge.h"
00005 #include "GridSearch.h"
00006 #include "NewtonRaphson.h"
00007
00008 inline double max2( double tmp1, double tmp2) {
00009 return (tmp1 > tmp2)? tmp1 : tmp2;
00010 }
00011
00012 inline double max3( double tmp1, double tmp2, double tmp3) {
00013 return max2( tmp1, max2( tmp2, tmp3));
00014 }
00015
00016 void american_option_fudge::init_calc_derived_attributes() const
00017 {
00018 european_option_pair::init_calc_derived_attributes();
00019
00020 _call_fudge = max3( _S - _K, _exp_alpha_r_t * _S - _exp_r_t * _K, 0) - max2( _exp_alpha_r_t * _S - _exp_r_t * _K, 0);
00021 _d_call_fudge_ds = (_call_fudge != 0)? (1-_exp_alpha_r_t) : 0;
00022 _d_call_fudge_dt = (_call_fudge != 0)? ( -(_alpha - _r)*_S*_exp_alpha_r_t + _r * _exp_r_t * _K) : 0;
00023
00024 _put_fudge = max3( _K - _S, _exp_r_t * _K - _exp_alpha_r_t * _S, 0) - max2( _exp_r_t * _K - _exp_alpha_r_t * _S, 0);
00025 _d_put_fudge_ds = (_put_fudge != 0)? (_exp_alpha_r_t - 1) : 0;
00026 _d_put_fudge_dt = (_put_fudge != 0)? ( _r * _exp_r_t * _K - (_alpha - _r)*_S*_exp_alpha_r_t) : 0;
00027
00028 _C += _call_fudge;
00029 _dC_dS += _d_call_fudge_ds;
00030 _dC_dtau += _d_call_fudge_dt;
00031
00032 _P += _put_fudge;
00033 _dP_dS += _d_put_fudge_ds;
00034 _dP_dtau += _d_put_fudge_dt;
00035 }
00036
00037 double american_option_fudge::call_intrinsic_value() const {
00038 return max3( _S - _K, _exp_alpha_r_t * _S - _exp_r_t * _K, 0);
00039 }
00040
00041 double american_option_fudge::put_intrinsic_value() const {
00042 return max3( _K - _S, _exp_r_t * _K - _exp_alpha_r_t * _S, 0);
00043 }
00044