fork download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #include<vector>
  5. #include<iostream>
  6. using namespace std;
  7.  
  8.  
  9. double MAX(double a,double b)
  10. {
  11. return a>b?a:b;
  12. }
  13.  
  14. int MIN(int a, int b)
  15. {
  16. return a>b?b:a;
  17. }
  18.  
  19. void interpolate(double* target, double max, double min, int k){
  20. int i;
  21. for(i = 0; i <= k; i++){
  22. target[i] = min*i/k + max*(k-i)/k;
  23. }
  24. }
  25.  
  26. int main()
  27. {
  28. double S,sigma,X,year,delta,m,r;
  29. int n,k;
  30. double u,d,R,p;
  31. int i,j,l,q,tmp;
  32. double max_aver,min_aver,Au,Ad,Cu,Cd,x,C1,C2;
  33.  
  34. cout << "enter stock price" << endl;
  35. cin >> S;
  36. cout << "enter strike price" << endl;
  37. cin >> X;
  38. cout << "enter year" << endl;
  39. cin >> year;
  40. cout << "the number of period" << endl;
  41. cin >> n;
  42. cout << "enter volatility " << endl;
  43. cin >> sigma;
  44. cout << "enter interest rate " << endl;
  45. cin >> r;
  46. cout << "enter the number of running average on each node" << endl;
  47. cin >> k;
  48.  
  49. sigma/=100;
  50. r/=100;
  51.  
  52. u = exp(sigma * sqrt(year/n));
  53. d = exp(-sigma * sqrt(year/n));
  54. R = exp(r * year / n);
  55. p = (R - d) / (u - d);
  56.  
  57. double** C = new double*[n+1];
  58. for(int i=0;i<=n;i++)
  59. {
  60. C[i] = new double[k+1];
  61. }
  62. double** A = new double*[n+1];
  63. for(int i=0;i<=n;i++)
  64. {
  65. A[i] = new double[k+1];
  66. }
  67. double* put_bucket = new double[k+1];
  68.  
  69. for(i = 0; i <= n; i++){
  70. max_aver = S*(1-pow(u,n-i+1))/(1-u) + S*pow(u,n-i)*d*(1-pow(d,i) )/(1-d);
  71. max_aver /= (n+1);
  72. min_aver = S*(1-pow(d,i+1))/(1-d) + S*pow(d,i)*u*(1-pow(u,n-i))/(1-u);
  73. min_aver /= (n+1);
  74. interpolate(A[i],max_aver,min_aver,k);
  75. for(j = 0; j <=k; j++)
  76. C[i][j] = MAX((double)0,X-A[i][j]);
  77. }
  78.  
  79. for(i = n-1; i >=0; i--){
  80. for(j = 0; j <= i; j++){
  81. max_aver = S*(1-pow(u,i-j+1))/(1-u) + S*pow(u,i-j)*d*(1-pow(d,j) )/(1-d);
  82. max_aver /= (i+1);
  83. min_aver = S*(1-pow(d,j+1)) /(1-d) + S*pow(d,j )*u*(1-pow(u,i-j))/(1-u);
  84. min_aver /= (i+1);
  85. double* stock_bucket = new double[k+1];
  86. interpolate(stock_bucket,max_aver,min_aver,k);
  87. for(l = 0; l <= k; l++){
  88. //next step is up
  89. Au = (stock_bucket[l]*(i+1) + S*pow(u,i+1-j)*pow(d,j)) / (i+2);
  90. tmp = 0;
  91. for(q = 0; q <= k; q++){
  92. if(Au < A[j][q])
  93. tmp++;
  94. }
  95. if(tmp == 0 || tmp == k+1 || A[j][tmp] == A[j][tmp+1]){
  96. Cu = C[j][MIN(tmp,k)];
  97. }
  98. else{
  99. x = (Au - A[j][tmp]) / (A[j][tmp-1] - A[j][tmp]);
  100. Cu = x*C[j][tmp-1] + (1-x)*C[j][tmp];
  101. }
  102.  
  103. //next step is down
  104. Ad = (stock_bucket[l]*(i+1) + S*pow(u,i-j)*pow(d,j+1)) / (i+2);
  105. tmp = 0;
  106. for(q = 0; q <= k; q++){
  107. if(Ad < A[j+1][q])
  108. tmp++;
  109. }
  110. if(tmp == 0 || tmp ==k+1 || Ad == A[j+1][tmp]){
  111. Cd = C[j+1][MIN(tmp,k)];
  112. }
  113. else{
  114. x = (Ad - A[j+1][tmp]) / (A[j+1][tmp-1] - A[j+1][tmp]);
  115. Cd = x*C[j+1][tmp-1] + (1-x)*C[j+1][tmp];
  116. }
  117. put_bucket[l] = MAX(X-stock_bucket[l] , (p*Cu+(1-p)*Cd)/R);
  118. }
  119.  
  120. //copy call_bucket[k] to C[j][k]
  121. for(l = 0; l <= k; l++){
  122. C[j][l] = put_bucket[l];
  123. }
  124. //copy stock_bucket[k] to A[j][k]
  125. for(l = 0; l <= k; l++){
  126. A[j][l] = stock_bucket[l];
  127. }
  128. }
  129. if( i == 1){
  130. C1=0;C2=0;
  131. for(j=0;j<=k;j++){
  132. C1+=C[0][j];
  133. C2+=C[1][j];
  134. }
  135. C1/=(k+1);
  136. C2/=(k+1);
  137. }
  138. }
  139. cout << "Put price is " << C[0][0] << endl;
  140. delta = (C1-C2)/(S*u - S*d);
  141. cout << "delta is " << delta << endl;
  142. system("pause");
  143. }
  144.  
Time limit exceeded #stdin #stdout 5s 3756KB
stdin
Standard input is empty
stdout
enter stock price
enter strike price
enter year
the number of period
enter volatility 
enter interest rate 
enter the number of running average on each node