americanfudge.cpp

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 

Generated on Fri Jan 7 12:36:18 2011 for public_options by  doxygen 1.5.1