The very truth is that SAS has limited financial functions. Thanks to SAS Institute, they finally added some option pricing functions in the base module of SAS 9.2, such as Black-Scholes put/call functions, Garman-Kohlhagen put/call functions, etc. Thus, the number of financial functions in the SAS toolbox adds up to more than 20 now.
Functions made easy by Proc Fcmp. In the finance’s brave new world of functions, financial function is ammo in a war. A unique and resourceful stockpile of functions is desired. Previously, in SAS, macro may seem like a reasonable substitute. However, when we deal with situations like evaluating y=h(x1)*f(x2), macro is feeble. The new procedure debuted in SAS 9.2, Proc Fcmp, provides us an easy way to create and accumulate functions, which will benefit people who are struggling to use SAS to solve finance problems in Data Step.
Proc Fcmp is used for a Binomial tree function of European call option pricing in this example. Once set up, it is very handy to use a function in the common Data Step: the function just acts like an inherent one. In the example, the exercise price ‘E’ is 50, the time to maturation 't' is 5 months, the share price ‘S’ is 50 again, the risk-free interest rate ‘r’ during t is 0.05, and the volatility ‘sigma’ is 0.3. Then the SAS native Black-Scholes option call function ‘blkshclprc’ and the newly ‘manufactured’ Binomial tree function ‘Eurocall’ powered by Proc Fcmp are compared. With the increasing of the layers ‘n’ of the Binomial tree model or the expanding of the tree branches, the option price fluctuates and gets closer to the price by Black-Scholes model. Finally it may converge to the ‘correct’ price. The results show that more steps may provide more accurate result for a Binomial tree model.
Everything in Proc Fcmp is encapsulated. Typically in designing a macro, we concern about the local or global variables. While dealing with a function by Proc Fcmp, it is argument in and argument out: no variable in a function would leak. All arrays in Proc Fcmp are also temporary unless they are indicated as output. Those features are friendly in making a workable function rapidly.
Reference: 1. Paolo Brandimarte. Numerical Methods in Finance and Economics: A MATLAB-Based Introduction. Wiley-Interscience, 2006.
2. SAS 9.2 Language Reference: Dictionary, Third Edition. SAS Publishing. 2009.
proc fcmp outlib = myfunc.finance.price;
function Eurocall(E, t, F, r, sigma, N);
deltaT=T/N;
u=exp(sigma*sqrt(deltaT));
d=1/u;
p=(exp(r*deltaT)-d)/(u-d);
array tree[1]/ nosymbols;
call dynamic_array(tree, n+1, n+1);
call zeromatrix(tree);
do i=0 to N;
tree[i+1,N+1]=max(0 , E*(u**i)*(d**(N-i)) - F);
end;
do j=(N-1) to 0 by -1;
do i=0 to j by 1;
tree[i+1,j+1] = exp(-r*deltaT)*
(p * tree[i+2,j+2] + (1-p) * tree[i+1,j+2]);
end;
end;
price = tree[1,1];
return(price);
endsub;
run;
*****(2)Use Binomial tree model and Black-Scholes model functions *****;
options cmplib = (myfunc.finance);
data test;
BSprice=blkshclprc(50, 5/12, 50, 0.05, 0.3);
do n=1 to 100;
Treeprice=eurocall(50, 5/12, 50, 0.05, 0.3, n);
output;
end;
run;
***********(3)Display the comparision between the two functions***************;
proc sgplot data=test;
title 'The comparison between Black-Sholes model and Binomial tree model';
needle x=n y=Treeprice/baseline=4;
series x=n y=BSprice/ lineattrs=(color=red);
yaxis label='Option price';
run;
***************END***************TEST PASSED 12DEC2010**************;
thanks for this. one thing though.
ReplyDeletein the line of your code below, shouldn't "E" be the stock price and "F" be the strike price?
"tree[i+1,N+1]=max(0 , E*(u**i)*(d**(N-i)) - F)"
Also, it'd be great if you can shed some light on how to update this for american options of discrete dividend paying stocks!
thanks!