#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<iostream>
using namespace std;
double MAX( double a,double b)
{
return a> b? a: b;
}
int MIN( int a, int b)
{
return a> b? b: a;
}
void interpolate( double * target, double max, double min, int k) {
int i;
for ( i = 0 ; i <= k; i++ ) {
target[ i] = min* i/ k + max* ( k- i) / k;
}
}
int main( )
{
double S,sigma,X,year,delta,m,r;
int n,k;
double u,d,R,p;
int i,j,l,q,tmp;
double max_aver,min_aver,Au,Ad,Cu,Cd,x,C1,C2;
cout << "enter stock price" << endl;
cin >> S;
cout << "enter strike price" << endl;
cin >> X;
cout << "enter year" << endl;
cin >> year;
cout << "the number of period" << endl;
cin >> n;
cout << "enter volatility " << endl;
cin >> sigma;
cout << "enter interest rate " << endl;
cin >> r;
cout << "enter the number of running average on each node" << endl;
cin >> k;
sigma/ = 100 ;
r/ = 100 ;
u = exp ( sigma * sqrt ( year/ n) ) ;
d = exp ( - sigma * sqrt ( year/ n) ) ;
R = exp ( r * year / n) ;
p = ( R - d) / ( u - d) ;
double ** C = new double * [ n+ 1 ] ;
for ( int i= 0 ; i<= n; i++ )
{
C[ i] = new double [ k+ 1 ] ;
}
double ** A = new double * [ n+ 1 ] ;
for ( int i= 0 ; i<= n; i++ )
{
A[ i] = new double [ k+ 1 ] ;
}
double * put_bucket = new double [ k+ 1 ] ;
for ( i = 0 ; i <= n; i++ ) {
max_aver = S* ( 1 - pow ( u,n- i+ 1 ) ) / ( 1 - u) + S* pow ( u,n- i) * d* ( 1 - pow ( d,i) ) / ( 1 - d) ;
max_aver / = ( n+ 1 ) ;
min_aver = S* ( 1 - pow ( d,i+ 1 ) ) / ( 1 - d) + S* pow ( d,i) * u* ( 1 - pow ( u,n- i) ) / ( 1 - u) ;
min_aver / = ( n+ 1 ) ;
interpolate( A[ i] ,max_aver,min_aver,k) ;
for ( j = 0 ; j <= k; j++ )
C[ i] [ j] = MAX( ( double ) 0 ,X- A[ i] [ j] ) ;
}
for ( i = n- 1 ; i >= 0 ; i-- ) {
for ( j = 0 ; j <= i; j++ ) {
max_aver = S* ( 1 - pow ( u,i- j+ 1 ) ) / ( 1 - u) + S* pow ( u,i- j) * d* ( 1 - pow ( d,j) ) / ( 1 - d) ;
max_aver / = ( i+ 1 ) ;
min_aver = S* ( 1 - pow ( d,j+ 1 ) ) / ( 1 - d) + S* pow ( d,j ) * u* ( 1 - pow ( u,i- j) ) / ( 1 - u) ;
min_aver / = ( i+ 1 ) ;
double * stock_bucket = new double [ k+ 1 ] ;
interpolate( stock_bucket,max_aver,min_aver,k) ;
for ( l = 0 ; l <= k; l++ ) {
//next step is up
Au = ( stock_bucket[ l] * ( i+ 1 ) + S* pow ( u,i+ 1 - j) * pow ( d,j) ) / ( i+ 2 ) ;
tmp = 0 ;
for ( q = 0 ; q <= k; q++ ) {
if ( Au < A[ j] [ q] )
tmp++ ;
}
if ( tmp == 0 || tmp == k+ 1 || A[ j] [ tmp] == A[ j] [ tmp+ 1 ] ) {
Cu = C[ j] [ MIN( tmp,k) ] ;
}
else {
x = ( Au - A[ j] [ tmp] ) / ( A[ j] [ tmp- 1 ] - A[ j] [ tmp] ) ;
Cu = x* C[ j] [ tmp- 1 ] + ( 1 - x) * C[ j] [ tmp] ;
}
//next step is down
Ad = ( stock_bucket[ l] * ( i+ 1 ) + S* pow ( u,i- j) * pow ( d,j+ 1 ) ) / ( i+ 2 ) ;
tmp = 0 ;
for ( q = 0 ; q <= k; q++ ) {
if ( Ad < A[ j+ 1 ] [ q] )
tmp++ ;
}
if ( tmp == 0 || tmp == k+ 1 || Ad == A[ j+ 1 ] [ tmp] ) {
Cd = C[ j+ 1 ] [ MIN( tmp,k) ] ;
}
else {
x = ( Ad - A[ j+ 1 ] [ tmp] ) / ( A[ j+ 1 ] [ tmp- 1 ] - A[ j+ 1 ] [ tmp] ) ;
Cd = x* C[ j+ 1 ] [ tmp- 1 ] + ( 1 - x) * C[ j+ 1 ] [ tmp] ;
}
put_bucket[ l] = MAX( X- stock_bucket[ l] , ( p* Cu+ ( 1 - p) * Cd) / R) ;
}
//copy call_bucket[k] to C[j][k]
for ( l = 0 ; l <= k; l++ ) {
C[ j] [ l] = put_bucket[ l] ;
}
//copy stock_bucket[k] to A[j][k]
for ( l = 0 ; l <= k; l++ ) {
A[ j] [ l] = stock_bucket[ l] ;
}
}
if ( i == 1 ) {
C1= 0 ; C2= 0 ;
for ( j= 0 ; j<= k; j++ ) {
C1+ = C[ 0 ] [ j] ;
C2+ = C[ 1 ] [ j] ;
}
C1/ = ( k+ 1 ) ;
C2/ = ( k+ 1 ) ;
}
}
cout << "Put price is " << C[ 0 ] [ 0 ] << endl;
delta = ( C1- C2) / ( S* u - S* d) ;
cout << "delta is " << delta << endl;
system ( "pause" ) ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPG1hdGguaD4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpkb3VibGUgTUFYKGRvdWJsZSBhLGRvdWJsZSBiKQp7CglyZXR1cm4gYT5iP2E6YjsKfQoKaW50IE1JTihpbnQgYSwgaW50IGIpCnsKICAgIHJldHVybiBhPmI/YjphOwp9Cgp2b2lkIGludGVycG9sYXRlKGRvdWJsZSogdGFyZ2V0LCBkb3VibGUgbWF4LCBkb3VibGUgbWluLCBpbnQgayl7CglpbnQgaTsKCWZvcihpID0gMDsgaSA8PSBrOyBpKyspewoJCXRhcmdldFtpXSA9ICBtaW4qaS9rICsgbWF4KihrLWkpL2s7Cgl9Cn0KCmludCBtYWluKCkKewoJZG91YmxlIFMsc2lnbWEsWCx5ZWFyLGRlbHRhLG0scjsKCWludCBuLGs7Cglkb3VibGUgdSxkLFIscDsKCWludCBpLGosbCxxLHRtcDsKCWRvdWJsZSBtYXhfYXZlcixtaW5fYXZlcixBdSxBZCxDdSxDZCx4LEMxLEMyOwoJCgljb3V0IDw8ICJlbnRlciBzdG9jayBwcmljZSIgPDwgZW5kbDsKCWNpbiA+PiBTOwoJY291dCA8PCAiZW50ZXIgc3RyaWtlIHByaWNlIiA8PCBlbmRsOwoJY2luID4+IFg7Cgljb3V0IDw8ICJlbnRlciB5ZWFyIiA8PCBlbmRsOwoJY2luID4+IHllYXI7Cgljb3V0IDw8ICJ0aGUgbnVtYmVyIG9mIHBlcmlvZCIgPDwgZW5kbDsKCWNpbiA+PiBuOwoJY291dCA8PCAiZW50ZXIgdm9sYXRpbGl0eSAiIDw8IGVuZGw7CgljaW4gPj4gc2lnbWE7Cgljb3V0IDw8ICJlbnRlciBpbnRlcmVzdCByYXRlICIgPDwgZW5kbDsKCWNpbiA+PiByOwoJY291dCA8PCAiZW50ZXIgdGhlIG51bWJlciBvZiBydW5uaW5nIGF2ZXJhZ2Ugb24gZWFjaCBub2RlIiA8PCBlbmRsOwoJY2luID4+IGs7CgkKCXNpZ21hLz0xMDA7CglyLz0xMDA7CgkKCXUgPSBleHAoc2lnbWEgKiBzcXJ0KHllYXIvbikpOwoJZCA9IGV4cCgtc2lnbWEgKiBzcXJ0KHllYXIvbikpOwoJUiA9IGV4cChyICogeWVhciAvIG4pOwoJcCA9IChSIC0gZCkgLyAodSAtIGQpOwoJCglkb3VibGUqKiBDID0gbmV3IGRvdWJsZSpbbisxXTsKCWZvcihpbnQgaT0wO2k8PW47aSsrKQoJewoJCUNbaV0gPSBuZXcgZG91YmxlW2srMV07Cgl9Cglkb3VibGUqKiBBID0gbmV3IGRvdWJsZSpbbisxXTsKCWZvcihpbnQgaT0wO2k8PW47aSsrKQoJewoJCUFbaV0gPSBuZXcgZG91YmxlW2srMV07Cgl9Cglkb3VibGUqIHB1dF9idWNrZXQgPSBuZXcgZG91YmxlW2srMV07CgkKCWZvcihpID0gMDsgaSA8PSBuOyBpKyspewoJCW1heF9hdmVyID0gUyooMS1wb3codSxuLWkrMSkpLygxLXUpICsgUypwb3codSxuLWkpKmQqKDEtcG93KGQsaSkgICkvKDEtZCk7CgkJbWF4X2F2ZXIgLz0gKG4rMSk7CgkJbWluX2F2ZXIgPSBTKigxLXBvdyhkLGkrMSkpLygxLWQpICsgUypwb3coZCxpKSp1KigxLXBvdyh1LG4taSkpLygxLXUpOwogICAgICAgIG1pbl9hdmVyIC89IChuKzEpOwogICAgICAgIGludGVycG9sYXRlKEFbaV0sbWF4X2F2ZXIsbWluX2F2ZXIsayk7CgkJZm9yKGogPSAwOyBqIDw9azsgaisrKQoJCQlDW2ldW2pdID0gTUFYKChkb3VibGUpMCxYLUFbaV1bal0pOwoJfQoJCglmb3IoaSA9IG4tMTsgaSA+PTA7IGktLSl7CgkJZm9yKGogPSAwOyBqIDw9IGk7IGorKyl7CgkJCW1heF9hdmVyID0gUyooMS1wb3codSxpLWorMSkpLygxLXUpICsgUypwb3codSxpLWopKmQqKDEtcG93KGQsaikgICkvKDEtZCk7CgkJCW1heF9hdmVyIC89IChpKzEpOwogICAgICAgICAgICBtaW5fYXZlciA9IFMqKDEtcG93KGQsaisxKSkgIC8oMS1kKSArIFMqcG93KGQsaiAgKSp1KigxLXBvdyh1LGktaikpLygxLXUpOwoJCQltaW5fYXZlciAvPSAoaSsxKTsKICAgICAgICAgICAgZG91YmxlKiBzdG9ja19idWNrZXQgPSBuZXcgZG91YmxlW2srMV07CgkJCWludGVycG9sYXRlKHN0b2NrX2J1Y2tldCxtYXhfYXZlcixtaW5fYXZlcixrKTsKCQkJZm9yKGwgPSAwOyBsIDw9IGs7IGwrKyl7CiAgICAgICAgICAgICAgICAvL25leHQgc3RlcCBpcyB1cAoJCQkJQXUgPSAoc3RvY2tfYnVja2V0W2xdKihpKzEpICsgUypwb3codSxpKzEtaikqcG93KGQsaikpIC8gKGkrMik7CiAgICAgICAgICAgICAgICB0bXAgPSAwOwogICAgICAgICAgICAgICAgZm9yKHEgPSAwOyBxIDw9IGs7IHErKyl7CgkJCQkJaWYoQXUgPCBBW2pdW3FdKQogICAgICAgICAgICAgICAgICAgICAgICB0bXArKzsgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZih0bXAgPT0gMCB8fCB0bXAgPT0gaysxIHx8IEFbal1bdG1wXSA9PSBBW2pdW3RtcCsxXSl7CiAgICAgICAgICAgICAgICAgICAgQ3UgPSBDW2pdW01JTih0bXAsayldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICB4ID0gKEF1IC0gQVtqXVt0bXBdKSAvIChBW2pdW3RtcC0xXSAtIEFbal1bdG1wXSk7CiAgICAgICAgICAgICAgICAgICAgQ3UgPSB4KkNbal1bdG1wLTFdICsgKDEteCkqQ1tqXVt0bXBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCgkJCQkvL25leHQgc3RlcCBpcyBkb3duCgkJCQlBZCA9IChzdG9ja19idWNrZXRbbF0qKGkrMSkgKyBTKnBvdyh1LGktaikqcG93KGQsaisxKSkgLyAoaSsyKTsKICAgICAgICAgICAgICAgIHRtcCA9IDA7CiAgICAgICAgICAgICAgICBmb3IocSA9IDA7IHEgPD0gazsgcSsrKXsKCQkJCQlpZihBZCA8IEFbaisxXVtxXSkKICAgICAgICAgICAgICAgICAgICAgICAgdG1wKys7IAogICAgICAgICAgICAgICAgfQoJCQkJaWYodG1wID09IDAgfHwgdG1wID09aysxIHx8IEFkID09IEFbaisxXVt0bXBdKXsKICAgICAgICAgICAgICAgICAgICBDZCA9IENbaisxXVtNSU4odG1wLGspXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgeCA9IChBZCAtIEFbaisxXVt0bXBdKSAvIChBW2orMV1bdG1wLTFdIC0gQVtqKzFdW3RtcF0pOwoJCQkJICAgIENkID0geCpDW2orMV1bdG1wLTFdICsgKDEteCkqQ1tqKzFdW3RtcF07CiAgICAgICAgICAgICAgICB9CgkJCQlwdXRfYnVja2V0W2xdID0gTUFYKFgtc3RvY2tfYnVja2V0W2xdICwgKHAqQ3UrKDEtcCkqQ2QpL1IpOwogICAgICAgICAgICB9CgkJCQoJCQkvL2NvcHkgY2FsbF9idWNrZXRba10gdG8gQ1tqXVtrXSAKCQkJZm9yKGwgPSAwOyBsIDw9IGs7IGwrKyl7CgkJCQlDW2pdW2xdID0gcHV0X2J1Y2tldFtsXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2NvcHkgc3RvY2tfYnVja2V0W2tdIHRvIEFbal1ba10KICAgICAgICAgICAgZm9yKGwgPSAwOyBsIDw9IGs7IGwrKyl7CiAgICAgICAgICAgICAgICBBW2pdW2xdID0gc3RvY2tfYnVja2V0W2xdOwogICAgICAgICAgICB9CgkJfQogICAgICAgIGlmKCBpID09IDEpewoJCSAgICBDMT0wO0MyPTA7CiAgICAgICAgICAgIGZvcihqPTA7ajw9aztqKyspewogICAgICAgICAgICAgICAgQzErPUNbMF1bal07CiAgICAgICAgICAgICAgICBDMis9Q1sxXVtqXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBDMS89KGsrMSk7CiAgICAgICAgICAgIEMyLz0oaysxKTsKICAgICAgICB9Cgl9Cgljb3V0IDw8ICJQdXQgcHJpY2UgaXMgIiA8PCBDWzBdWzBdIDw8IGVuZGw7CglkZWx0YSA9IChDMS1DMikvKFMqdSAtIFMqZCk7Cgljb3V0IDw8ICJkZWx0YSBpcyAiIDw8IGRlbHRhIDw8IGVuZGw7CiAgICBzeXN0ZW0oInBhdXNlIik7Cn0K