1 PACKAGE QRM_FX_FORMULAS AUTHID CURRENT_USER AS
2 /* $Header: qrmfxfls.pls 115.15 2003/11/22 00:36:21 prafiuly ship $ */
3
4 --bug 3236479
5 g_debug_level NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6 g_proc_level NUMBER := FND_LOG.LEVEL_PROCEDURE;
7
8 -- added fhu 3/36/02
9 TYPE GK_OPTION_SENS_IN_REC_TYPE IS RECORD (
10 p_SPOT_DATE date,
11 p_MATURITY_DATE date,
12 p_CCY_FOR VARCHAR2(15),
13 p_CCY_DOM VARCHAR2(15),
14 p_RATE_DOM NUMBER,
15 p_RATE_TYPE_DOM varchar2(1) DEFAULT 'S',
16 p_COMPOUND_FREQ_DOM NUMBER,
17 p_DAY_COUNT_BASIS_DOM varchar2(15),
18 p_RATE_FOR NUMBER,
19 p_RATE_TYPE_FOR varchar2(1) DEFAULT 'S',
20 p_COMPOUND_FREQ_FOR NUMBER,
21 p_DAY_COUNT_BASIS_FOR varchar2(15),
22 p_SPOT_RATE NUMBER,
23 p_STRIKE_RATE NUMBER,
24 p_VOLATILITY NUMBER);
25
26 TYPE GK_OPTION_SENS_OUT_REC_TYPE IS RECORD (
27 p_DELTA_CALL NUMBER,
28 p_DELTA_PUT NUMBER,
29 p_THETA_CALL NUMBER,
30 p_THETA_PUT NUMBER,
31 p_RHO_CALL NUMBER,
32 p_RHO_PUT NUMBER,
33 p_RHO_F_CALL NUMBER,
34 p_RHO_F_PUT NUMBER,
35 p_GAMMA NUMBER,
36 p_VEGA NUMBER);
37
38
39 /*-------------------------------------------------------------
40 FX_GK_OPTION_SENS_CV
41 Cover procedure to calculate the sensitivity of a currency option
42 using Garman-Kohlhagen formula, which is the extension of
43 Black-Scholes formula.
44
45 IMPORTANT: it is better to supply a Simple 30/360 (from GET_MD_FROM_SET)
46 interest rates for this procedure in order to avoid redundant conversions.
47
48 IMPORTANT: this procedure is only accurate up to six decimal places due
49 to CUMULATIVE_NORM_DISTRIBUTION procedure it calls.
50
51 GK_OPTION_SENS_IN_REC_TYPE:
52 p_SPOT_DATE
53 p_MATURITY_DATE
54 p_CCY_FOR
55 p_CCY_DOM
56 p_RATE_DOM
57 p_RATE_TYPE_DOM
58 p_COMPOUND_FREQ_DOM
59 p_DAY_COUNT_BASIS_DOM
60 p_RATE_FOR
61 p_RATE_TYPE_FOR
62 p_COMPOUND_FREQ
63 p_DAY_COUNT_BASIS_FOR
64 p_SPOT_RATE
65 p_STRIKE_RATE
66 p_VOLATILITY
67
68 GK_OPTION_SENS_OUT_REC_TYPE:
69 p_DELTA_CALL
70 p_DELTA_PUT
71 p_THETA_CALL
72 p_THETA_PUT
73 p_RHO_CALL
74 p_RHO_PUT
75 p_RHO_F_CALL
76 p_RHO_F_PUT
77 p_GAMMA
78 p_VEGA
79
80
81 Formula:
82 Calls FX_GK_OPTION_SENS
83
84 p_SPOT_DATE = the spot date where the option value is evaluated
85 p_MATURITY_DATE = the maturity date where the option expires
86 p_CCY_DOM = domestic currency
87 p_CCY_FOR = foreign currency
88 p_RATE_DOM = domestic risk free interest rate.
89 p_RATE_TYPE_DOM/FOR = the p_RF_RATE_DOM/FOR rate's type. 'S' for Simple
90 Rate. 'C' for Continuous Rate, and 'P' for Compounding Rate.
91 Default value = 'S' (Simple IR)
92 p_DAY_COUNT_BASIS_DOM/FOR = day count basis for p_RF_RATE_DOM/FOR.
93 p_RATE_FOR = foreign risk free interest rate.
94 p_SPOT_RATE = the current market exchange rate = the value of one unit
95 of the foreign currency measured in the domestic currency.
96 p_STRIKE_RATE = the strike price agreed in the option.
97 p_VOLATILITY = volatility
98 p_COMPOUND_FREQ_DOM/FOR = frequencies of discretely compounded input/output
99 rate. This is only necessary if p_RATE_TYPE_DOM/FOR is 'P'.
100 ---------------------------------------------------------------*/
101
102
103 PROCEDURE FX_GK_OPTION_SENS_CV(p_rec_in IN GK_OPTION_SENS_IN_REC_TYPE,
104 p_rec_out OUT NOCOPY GK_OPTION_SENS_OUT_REC_TYPE);
105
106
107 -- added fhu 6/19/01
108 PROCEDURE FX_GK_OPTION_SENS(
109 l_days IN NUMBER,
110 l_for_int_rate IN NUMBER,
111 l_dom_int_rate IN NUMBER,
112 l_spot_rate IN NUMBER,
113 l_strike_rate IN NUMBER,
114 vol IN NUMBER,
115 l_delta_call IN OUT NOCOPY NUMBER,
116 l_delta_put IN OUT NOCOPY NUMBER,
117 l_theta_call IN OUT NOCOPY NUMBER,
118 l_theta_put IN OUT NOCOPY NUMBER,
119 l_rho_call IN OUT NOCOPY NUMBER,
120 l_rho_put IN OUT NOCOPY NUMBER,
121 l_rho_f_call IN OUT NOCOPY NUMBER,
122 l_rho_f_put IN OUT NOCOPY NUMBER,
123 l_gamma IN OUT NOCOPY NUMBER,
124 l_vega IN OUT NOCOPY NUMBER);
125
126
127 --###############################################################
128 --# #
129 --# Functions #
130 --# #
131 --###############################################################
132
133
134
135 -- mofified by sankim 9/14/01
136 /*
137 Calculates the DELTA SPOT of a FX forward. The Delta spot measures the
138 rate of change of the FX Forward Rate with respect to the Spot Rate.
139 See Deal Calculations HLD.
140
141 The arguments are defined as follows:
142 * p_CONTRA/BASE_CUR = Contra/Bid currency
143 * p_DF_CONTRA_BID/ASK = discount factor for the contra currency(Bid and Ask
144 side)
145 * p_DF_BASE_BID/ASK = discount factor for the base currency(Bid and Ask side)
146 * p_DF_USD_BID/ASK = discount factor for the USD(Bid and Ask side) required
147 only if USD is not Base or Contra
148 Returned:
149 * p_DELTA = delta spot(bid and ask returned as xtr_md_num_table[2]
150 (BID side = xtr_md_num_table[1],ASK side = xtr_md_num_table[2]))
151 All of USD discount factor parameters defaults to null because they are not
152 required if Base or Contra currency is USD. They are required if USD is not
153 Base or Contra However, if insufficient input is provided, error will be
154 raised. Because of the optional parameters, to use this function, the caller
155 can just pass in 6 parameters instead of 8, not passing in the last two USD
156 discount factors if they are not necessary.If it makes it easier, feel free to
157 pass values to all six discount factor parameters. This procedure will only
158 use the relevant parameters and ignore the rest.
159 */
160 FUNCTION FX_FORWARD_DELTA_SPOT(p_contra_cur IN VARCHAR2,
161 p_base_cur IN VARCHAR2,
162 p_df_contra_bid IN NUMBER,
163 p_df_contra_ask IN NUMBER,
164 p_df_base_bid IN NUMBER,
165 p_df_base_ask IN NUMBER,
166 p_df_usd_bid IN NUMBER DEFAULT NULL,
167 p_df_usd_ask IN NUMBER DEFAULT NULL)
168 RETURN XTR_MD_NUM_TABLE;
169
170
171 --modified sankim 9/18/01
172 /*
173 Calculates the RHO, DELTA CONTRA/BASE INTEREST RATE of a FX forward.
174 See Deal Calculations HLD.
175 Example for FX: CHFGBP -> CHF = Base Currency
176 GBP = Contra Currency
177 parameters
178 * p_OUT = 'C' if want p_RHO to be rho contra, 'B' if want p_RHO to be rho base,
179 or 'D' if want both
180 * p_SPOT_RATE_BASE_BID/ASK = fair exchange rate of between the base currency
181 against USD. If the base currency is USD, then the default value of 1 should be
182 used.
183 * p_SPOT_RATE_CONTRA_BID/ASK = fair exchange rate of between the contra
184 currency against USD. If the contra currency is USD, then the default value of
185 1 should be used.
186 * p_BASE_CURR_INT_RATE_BID/ASK = bid/ask risk free interest rate for the base
187 currency. This parameter should be null if the base currency is USD.
188 * p_CONTRA_CURR_INT_RATE_BID/ASK = bid/ask risk free interest rate for the
189 contra currency. This parameter should be null if the contra currency is USD.
190 * p_USD _CURR_INT_RATE = risk free interest rate for the USD.
191 * p_DAY_COUNT_BASE/CONTRA = number of days between the spot date and the
192 forward date. If the contra currency is USD, then p_DAY_COUNT_CONTRA should be
193 null, and vice versa in the case of base is USD.
194 * p_ANNUAL_BASIS_BASE/CONTRA = number of days in a year of which the
195 p_DAY_COUNT_BASE/CONTRA and the p_BASE/CONTRA_CURR_INT_RATE are based on. If
196 the contra currency is USD, then p_ANNUAL_BASIS_CONTRA should be null, and vice
197 versa in the case of base is USD.
198 * p_DAY_COUNT_USD = number of days between the spot date and the forward date.
199 = number of days in a year of which the p_DAY_COUNT_USD and the
200 p_USD _CURR_INT_RATE are based on.
201 * p_ANNUAL_BASIS_USD = number of days in a year of which the p_DAY_COUNT_USD
202 and the p_USD _CURR_INT_RATE are based on.
203 * p_CURRENCY_CONTRA/BASE = the currency for contra/base.
204 * p_QUOTATION_BASIS_CONTRA/BASE indicates the quotation basis against USD for
205 the CONTRA /BASE side, 'C' for Commodity Unit Quote (=USDGBP) and 'B' for Base
206 Unit Quote (= GBPUSD) (Definitions are in FX Calculator HLD). This parameter is
207 required if base/contra is non-USD accordingly.
208 Returned:
209 * p_RHO (BID/ASK) indicates the bid/ask side of rho(bid and ask returned as
210 xtr_md_num_table[2](BID side = xtr_md_num_table[1],
211 ASK side = xtr_md_num_table[2]))
212 if p_OUT ='D' then the returned value is as following:
213 p_RHO xtr_md_num_table[4](Base BID side = xtr_md_num_table[1],
214 Base ASK side = xtr_md_num_table[2],
215 Contra BID side = xtr_md_num_table[3],
216 Contra ASK side = xtr_md_num_table[4])
217
218 Calls XTR_FX_FORMULAS.FX_FORWARD_RATE_CV (see def of fx_forward_rate above)
219 */
220
221
222 FUNCTION FX_FORWARD_RHO(p_out IN VARCHAR2,
223 p_spot_rate_base_bid IN NUMBER DEFAULT 1,
224 p_spot_rate_base_ask IN NUMBER DEFAULT 1,
225 p_spot_rate_contra_bid IN NUMBER DEFAULT 1,
226 p_spot_rate_contra_ask IN NUMBER DEFAULT 1,
227 p_base_curr_int_rate_bid IN NUMBER,
228 p_base_curr_int_rate_ask IN NUMBER,
229 p_contra_curr_int_rate_bid IN NUMBER,
230 p_contra_curr_int_rate_ask IN NUMBER,
231 p_usd_curr_int_rate_bid IN NUMBER,
232 p_usd_curr_int_rate_ask IN NUMBER,
233 p_day_count_base IN NUMBER,
234 p_day_count_contra IN NUMBER,
235 p_day_count_usd IN NUMBER,
236 p_annual_basis_base IN NUMBER,
237 p_annual_basis_contra IN NUMBER,
238 p_annual_basis_usd IN NUMBER,
239 p_currency_base IN VARCHAR2,
240 p_currency_contra IN VARCHAR2,
241 p_quotation_basis_base IN VARCHAR2 DEFAULT 'C',
242 p_quotation_basis_contra IN VARCHAR2 DEFAULT 'C')
243 RETURN XTR_MD_NUM_TABLE;
244
245
246
247 /* SENSITIVITIES of FX OPTION -- See FX_GK_OPTION_PRICE procedure */
248
249 /*************** Fair Value Calculations *******/
250
251
252 PROCEDURE get_base_contra(
253 p_base IN OUT NOCOPY VARCHAR2,
254 p_contra IN OUT NOCOPY VARCHAR2,
255 p_reverse OUT NOCOPY BOOLEAN);
256
257
258 PROCEDURE fv_fxo(p_price_model IN VARCHAR2,
259 p_deal_subtype IN VARCHAR2,
260 p_option_type IN VARCHAR2,
261 p_set_code IN VARCHAR2,
262 p_for_ccy IN VARCHAR2,
263 p_premium_ccy IN VARCHAR2,
264 p_buy_ccy IN VARCHAR2,
265 p_sell_ccy IN VARCHAR2,
266 p_interpolation_method IN VARCHAR2,
267 p_spot_date IN DATE,
268 p_future_date IN DATE,
269 p_strike_price IN NUMBER,
270 p_for_amount IN NUMBER,
271 p_side IN OUT NOCOPY VARCHAR2,
272 p_forward_rate IN OUT NOCOPY NUMBER,
273 p_fair_value IN OUT NOCOPY NUMBER);
274
275
276 PROCEDURE fv_fx (p_price_model IN VARCHAR2,
277 p_set_code IN VARCHAR2,
278 p_buy_ccy IN VARCHAR2,
279 p_sell_ccy IN VARCHAR2,
280 p_sob_ccy IN VARCHAR2,
281 p_interpolation_method IN VARCHAR2,
282 p_spot_date IN DATE,
283 p_future_date IN DATE,
287 p_forward_rate IN OUT NOCOPY NUMBER,
284 p_buy_amount IN NUMBER,
285 p_sell_amount IN NUMBER,
286 p_side IN OUT NOCOPY VARCHAR2,
288 p_fair_value IN OUT NOCOPY NUMBER);
289
290
291
292 END QRM_FX_FORMULAS;