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