RE: Installing package "SpreadOption`"
- To: mathgroup at smc.vnet.net
- Subject: [mg35699] RE: [mg35673] Installing package "SpreadOption`"
- From: "David Park" <djmp at earthlink.net>
- Date: Fri, 26 Jul 2002 04:16:50 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hello Matthias, I downloaded the SpreadOptions package and modified it so that it will work like a standard package. The package file is attached. (Other readers can modify the package as I describe below.) To use it, create a new Finance folder in ExtraPackages. Put the SpreadOption.m file there. Then you can simply load the package with: Needs["Finance`SpreadOption`"] All I did was change the name of the package in the BeginPackage statement to "Finance`SpreadOption". Anyone can do this by editing the package file. This, it seems to me, is the method that should be used for third party packages. If this method is used, the packages behave just like standard packages. However, probably because it is not clearly presented in the WRI documentation, very few people use the method. The result is a lot of confusion in connecting to packages. Also, it seems to me that packages should be in a standard place and the StandardPackages and ExtraPackges folders that WRI provides are those places. David Park djmp at earthlink.net http://home.earthlink.net/~djmp/ From: Matthias.Bode at oppenheim.de [mailto:Matthias.Bode at oppenheim.de] To: mathgroup at smc.vnet.net Dear Colleagues, I successfully installed Packages by David Park in the past; now I got the package SpreadOption from Mathsource. I put SpreadOption.m in a directory after appending the appropriate path. So it should work. But I get: <<...OLE_Obj...>> <<...OLE_Obj...>> What has to be done? Best regards, Matthias Bode Sal. Oppenheim jr. & Cie. KGaA Koenigsberger Strasse 29 D-60487 Frankfurt am Main GERMANY Tel.: +49(0)69 71 34 53 80 Mobile: +49(0)172 6 74 95 77 Fax: +49(0)69 71 34 95 380 E-mail: matthias.bode at oppenheim.de Internet: http://www.oppenheim.de filename="SpreadOption.m" (* :Title: Spread Option Pricing Model *) (* :Author: Espen Gaarder Haug *) (* :Summary: Calculates the value for European call and put options on the difference between two utures contracts, better known as spread options.*) (* :Context: SpreadOption` *) (* :Package Version: 1.0, Last modified June 6, 1999 *) (* :Copyright: Copyright (c) 1999 Espen Gaarder Haug *) (* :Keywords: option pricing, spread option, financial derivatives, crack spread options, spark spread options. *) (* :Mathematica Versions 3.0 *) BeginPackage["Finance`SpreadOption`"] (* Usage Statments and Description *) SpreadOption::usage = "The SpreadOption package implemented by Espen Gaarder Haug (the author of 'The Complete Guide to Option Pricing Formulas') can be used for valuation and sensitivity analysis of European spread options on futures and forward contracts. Functions included are: SpreadOption calculates the spread option value, SpreadOptionDelta1 and SpreadOptionDelta2 calculates the Delta values, SpreadOptionGamma1 and SpreadOptionGamma2 calculates the Gamma values, SpreadOptionVega1 and SpreadOptionVega2 calculates the Vega values, SpreadOptionTheta calculates the Theta value, SpreadOptionRho calculates the Rho values, and SpreadOptionCor calculates the sensitivity for changes in the correaltion coeficient, A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the payoff from a put spread option is Max[X-F1+F2,0]. Spread options are popular in many markets, and especially in the energy markets. At New York Mercantile Exchange spread options are traded on the spread/difference between heating oil and crude oil, as well as between gasoline and crude oil. These are better known as crack spread options. With the deregulation of the electricity/power markets around the world, hedgers and risk takers are now also doing options on the price difference between oil and electricity. In the energy market such options are known as spark spread options. The valuation formula here assumes a Black-Scholes world, that is the future price follows a geometric Brownian motion (the future prices are Log-normal distributed etc.). Since the option is on two future contracts, that means two correlated geometric Brownian motions. The implementation is based on the formula published by: Kirk, E. 1995: 'Correlation in the Energy Markets,' in Managing Energy Price Risk. London: Risk Publications and Enron, 71-78. This is actually an approximation, but it is very accurate with respect to all practical purposes. More information on valuation of both European and American style spread options can be found in: Haug, E. G. 1997: 'The Complete Guide To Option Pricing Formulas,' McGraw-Hill, New York. " SpreadOptionDelta1::usage = "SpreadOptionDelta1[CPFlag, F1, F2, X, T, r, v1, v2, rho] calculates the delta-one for a European spread option. That is the the change in option \ value for a small change in future contract one (F1). CPFLag=1 for call option, -1 for put option. A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionDelta2::usage = "SpreadOptionDelta2[CPFlag, F1, F2, X, T, r, v1, v2, rho] calculates the delta-two for a European spread option. That is the change in option value \ for a small change in future contract two (F2). CPFLag=1 for call option, -1 for put option. A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionGamma1::usage = "SpreadOptionGamma1[ F1, F2, X, T, r, v1, v2, rho] calculates the Gamma-one for a European spread option. That is the second derivatives of the option value with respect to future contract one (F1). Same for call and put. A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionGamma2::usage = "SpreadOptionGamma2[ F1, F2, X, T, r, v1, v2, rho] calculates the Gamma-two for a European spread option. That is the second derivatives of the option value with respect to future contract two (F2). Same for call and put. A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionVega1::usage = "SpreadOptionVega1[ F1, F2, X, T, r, v1, v2, rho] calculates the Vega-one for a European spread option. That is the first derivatives of the option value with respect to the volatility of futures contract one (v1). The Vega number have been divided by 100 to get it for percent point changes (the practical market 'standard'). Same for call and put. A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionVega2::usage = "SpreadOptionVega2[ F1, F2, X, T, r, v1, v2, rho] calculates the Vega-two for a European spread option. That is the first derivatives of the option value with respect to the volatility of futures contract two (v2). The Vega number have been divided by 100 to get it for percent point changes (the practical market 'standard'). Same for call and put. A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionTheta::usage = "SpreadOptionTheta[CPFlag, F1, F2, X, T, r, v1, v2, rho] calculates the Theta value for a European spread option. That is partial derivatives of the \ option value with respect to time to expiration (T). The Theta number have been divided by 365 to get it on a daily basis. I have \ also taken the minus value of the partial derivatives. This because we always get \ closer to expiration, time moves in one direction. That is the theta value that comes \ out is a approximation for what will happen with the option value as you get one day \ closer to maturity (the market 'standard'). CPFLag=1 for call option, -1 for put option. A call spread option on two futures contracts will at maturity pay Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionRho::usage = "SpreadOptionRho[CPFlag, F1, F2, X, T, r, v1, v2, rho] calculates the Rho value for a European spread option. That is partial derivatives of the \ option value with respect to the risk-free interest rate (r). The Rho number have been divided by 100 to get it for percent point changes (the market standard). CPFLag=1 for call option, -1 for put option. A call spread option on two futures contracts will at maturity pay off Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" SpreadOptionCor::usage = "SpreadOptionCor[F1, F2, X, T, r, v1, v2, rho] calculates the the first derivatives of the option value with respect to the correaltion coefficient (Rho). The partial derivatives have then been divided by 10 to get it for a 0.1 change in correlation. Same for call and put. A call spread option on two futures contracts will at maturity pay off Max[F1-F2-X,0], where F1 is the price of future one at maturity, and F2 is the price of future two at maturity, X is the strike price. Similarly the \ payoff from a put spread option is Max[X-F1+F2,0]. T=time to maturity in years, r=risk-free interest rate, v1=volatility of future contract one, v2=volatility of future contract two, rho=correlation between the return of the two futures contracts" Begin["`Private`"] cnd[z_] := (1 + Erf[z / Sqrt[2]]) / 2; vv[F1_,F2_,X_,v1_,v2_,rho_]:=Sqrt[v1^2+(v2*F2/(F2+X))^2-2*rho*v1*v2*F2/ (F2+X)]; d1[F_,T_,r_,vv_]:=(Log[F]+vv^2/2*T)/(vv*Sqrt[T]); d2[F_,T_,r_,vv_]:= (Log[F]-vv^2/2*T)/(vv*Sqrt[T]); SpreadOption[CPFlag_,F1_,F2_,X_,T_,r_,v1_,v2_,rho_]:= CPFlag*(F2+X)* \ Exp[-r*T]*(F1/(F2+X)*cnd[CPFlag*d1[F1/(F2+X),T,r,vv[F1,F2,X,v1,v2,rho]]]- cnd[CPFlag*d2[F1/(F2+X),T,r,vv[F1,F2,X,v1,v2,rho]]]); SpreadOptionDelta1[CPFlag_,F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[CPFlag,F1,F2,X,T,r,v1,v2,rho], F1]]; SpreadOptionDelta2[CPFlag_,F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[CPFlag,F1,F2,X,T,r,v1,v2,rho], F2]]; SpreadOptionGamma1[F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[1,F1,F2,X,T,r,v1,v2,rho], {F1,2}]]; SpreadOptionGamma2[F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[1,F1,F2,X,T,r,v1,v2,rho], {F2,2}]]; SpreadOptionVega1[F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[1,F1,F2,X,T,r,v1,v2,rho], v1]/100]; SpreadOptionVega2[F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[1,F1,F2,X,T,r,v1,v2,rho], v2]/100]; SpreadOptionTheta[CPFlag_,F1_,F2_,X_,T_,r_,v1_,v2_,rho_]=Evaluate[ -D[SpreadOption[CPFlag,F1,F2,X,T,r,v1,v2,rho], T]/365]; SpreadOptionRho[CPFlag_,F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[CPFlag,F1,F2,X,T,r,v1,v2,rho], r]/100]; SpreadOptionCor[F1_,F2_,X_,T_,r_,v1_,v2_,rho_]= Evaluate[D[SpreadOption[1,F1,F2,X,T,r,v1,v2,rho], rho]/100]; End[] EndPackage[]