00001 #include "./payoff.h" 00002 #include "../../common/Normals.h" 00003 #include<minmax.h> 00004 00005 PayOff::PayOff(Real Strike_) : Strike(Strike_) 00006 { 00007 } 00008 00009 PayOff::PayOff(void) : Strike(0) 00010 { 00011 } 00012 00013 void PayOff::SetStrike(Real Strike_) 00014 { 00015 Strike=Strike_; 00016 } 00017 00018 00019 Real PayOff::operator () (Real Spot) const 00020 { 00021 return max(Spot-Strike,0.0); 00022 } 00023 00024 Real PayOff::Call(Real Fwd) 00025 { 00026 return max(Fwd-Strike,0.0); 00027 } 00028 00029 Real PayOff::Put(Real Fwd) 00030 { 00031 return max(Strike-Fwd,0.0); 00032 } 00033 00034 Real PayOff::AsianCall(valarray<Real> Path,LongNatural nDates) 00035 { 00036 return max(Average(Path,nDates)-Strike,0.0); 00037 } 00038 00039 Real PayOff::AsianPut(valarray<Real> Path,LongNatural nDates) 00040 { 00041 return max(Strike-Average(Path,nDates),0.0); 00042 } 00043 00044 Real PayOff::RevLookbackCall(valarray<Real> Path,LongNatural nDates) 00045 { 00046 return max(Maximize(Path,nDates)-Strike,0.0); 00047 } 00048 00049 Real PayOff::RevLookbackPut(valarray<Real> Path,LongNatural nDates) 00050 { 00051 return max(Strike-Maximize(Path,nDates),0.0); 00052 } 00053 00054 Real PayOff::BarrierCall(valarray<Real> Path,LongNatural nDates) 00055 { 00056 for (unsigned int i=0;i<nDates;i++) { 00057 if (Path[i]>=Strike) return 1.; 00058 } 00059 return 0.; 00060 } 00061 00062 Real PayOff::BarrierPut(valarray<Real> Path,LongNatural nDates) 00063 { 00064 for (unsigned int i=0;i<nDates;i++) { 00065 if (Path[i]<=Strike) return 1.; 00066 } 00067 return 0.; 00068 } 00069 00070 Real PayOff::FlooredCliquet (Real Spot, Real Fwd) 00071 { 00072 if (Fwd>=Strike) 00073 return Fwd-Spot; 00074 else return Strike-Spot; 00075 } 00076 00077 Real PayOff::CappedCliquet (Real Spot, Real Fwd) 00078 { 00079 if (Fwd<=Strike) 00080 return Fwd-Spot; 00081 else return Strike-Spot; 00082 } 00083 00084 Real PayOff::Rainbow2SpreadOptionMax(Real Fwd1,Real Fwd2,Real W1,Real W2,Real Mult) 00085 { 00086 return max(Mult*(W1*Fwd1-W2*Fwd2-Strike),0); 00087 } 00088 00089 Real PayOff::Rainbow2AssetsBasketMax(Real Fwd1,Real Fwd2,Real W1,Real W2,Real Mult) 00090 { 00091 return max(Mult*(W1*Fwd1+W2*Fwd2-Strike),0); 00092 } 00093 00094 Real PayOff::RainbowBestOf2AssetsCash(Real Fwd1,Real Fwd2,Real W1,Real W2) 00095 { 00096 return max(max(W1*Fwd1,W2*Fwd2),Strike); 00097 } 00098 00099 Real PayOff::RainbowWorstOf2AssetsCash(Real Fwd1,Real Fwd2,Real W1,Real W2) 00100 { 00101 return min(min(W1*Fwd1,W2*Fwd2),Strike); 00102 } 00103 00104 Real PayOff::RainbowMax2AssetsCall(Real Fwd1,Real Fwd2,Real W1,Real W2,Real Mult) 00105 { 00106 return max(Mult* (max(W1*Fwd1 , W2*Fwd2)-Strike), 0); 00107 } 00108 00109 Real PayOff::RainbowMin2AssetsCall(Real Fwd1,Real Fwd2,Real W1,Real W2,Real Mult) 00110 { 00111 return max(Mult* (min(W1*Fwd1 , W2*Fwd2)-Strike), 0);; 00112 } 00113 00114 Real PayOff::RainbowMax2AssetsPut(Real Fwd1,Real Fwd2,Real W1,Real W2,Real Mult) 00115 { 00116 return max(Strike-Mult* (max(W1*Fwd1 , W2*Fwd2)), 0); 00117 } 00118 00119 Real PayOff::RainbowMin2AssetsPut(Real Fwd1,Real Fwd2,Real W1,Real W2,Real Mult) 00120 { 00121 return max(Strike-Mult* (min(W1*Fwd1 , W2*Fwd2)), 0);; 00122 } 00123 00124 Real PayOff::Convertible(Real Fwd, Real ConversionRatio, Real BondValue, Real CallPrice, Real PutPrice) 00125 { 00126 return max( 00127 max(ConversionRatio * Fwd, min(BondValue, CallPrice)), 00128 PutPrice); 00129 } 00130