1%macro irmst_market_risk_funs_def_2;
6 function RSK_BINARY_ASSET_OPTION_PF(CallPutType $, Price, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility)
7 label=
"European binary asset or nothing option pricing by Reiner and Rubinstein (1991)";
12 if TimeToExpiration < 0 then
return(0);
17 Fname =
'rsk_binary_asset_option_pf';
19 ReturnMissingFlg = rsk_check_num_missing_pf( RiskFreeRate, Fname,
'4',
'RiskFreeRate', ReturnMissingFlg );
20 ReturnMissingFlg = rsk_check_num_missing_pf( YieldParam, Fname,
'5',
'YieldParam', ReturnMissingFlg );
24 ReturnMissingFlg = rsk_check_nonpositive_pf( Price, Fname,
'2',
'Price', ReturnMissingFlg );
25 ReturnMissingFlg = rsk_check_nonpositive_pf( Strike, Fname,
'3',
'Strike', ReturnMissingFlg );
26 ReturnMissingFlg = rsk_check_nonpositive_pf( Volatility, Fname,
'7',
'Volatility', ReturnMissingFlg );
28 if ReturnMissingFlg eq 1 then
return(.);
30 if abs(TimeToExpiration) le constant(
'SQRTMACEPS') then do;
31 if upcase(CallPutType) eq 'CALL' and Price > Strike then return(Price);
32 if upcase(CallPutType) ne'CALL' and Price < Strike then return(Price);
39 CostofCarry=RiskFreeRate - YieldParam;
40 g = Volatility*sqrt(TimeToExpiration);
41 d = (log(Price / Strike) + CostofCarry * TimeToExpiration )/g + 0.5 * g;
43 IF upcase(CallPutType) eq 'CALL' THEN DO;
44 OptionPrice = Price * exp((CostofCarry - RiskFreeRate )* TimeToExpiration) * probnorm(d);
48 OptionPrice = Price * exp((CostofCarry - RiskFreeRate )* TimeToExpiration) * probnorm(-d);
55 function RSK_BINARY_BARRIEROPTION_PF(CallPutType $, BarrierType $, SettlementType $, PayAtHitFlg, Price, Price_Chk_Barrier_Up, Price_Chk_Barrier_Down, Strike, Barrier, Cash_Amt, RiskFreeRate, YieldParam, TimeToExpiration, Volatility)
56 label="European binary barrier option pricing by Reiner and Rubinstein (1991)";
61 if TimeToExpiration < 0 then return(0);
66 Fname = 'rsk_binary_barrieroption_pf';
68 ReturnMissingFlg = rsk_check_num_missing_pf( RiskFreeRate, Fname, '11', 'RiskFreeRate', ReturnMissingFlg );
69 ReturnMissingFlg = rsk_check_num_missing_pf( YieldParam, Fname, '12', 'YieldParam', ReturnMissingFlg );
73 ReturnMissingFlg = rsk_check_nonpositive_pf( Price, Fname, '5', 'Price', ReturnMissingFlg );
74 ReturnMissingFlg = rsk_check_nonpositive_pf( Barrier, Fname, '9', 'Barrier', ReturnMissingFlg );
75 ReturnMissingFlg = rsk_check_nonpositive_pf( Volatility, Fname, '14', 'Volatility', ReturnMissingFlg );
77 if ReturnMissingFlg eq 1 then return(.);
79 BarrType = lowcase(BarrierType);
80 SettleType = upcase(SettlementType);
82 if TimeToexpiration eq 0 then do;
84 if ( upcase(CallPutType) eq 'CALL' and Price > Strike ) or ( upcase(CallPutType) eq 'PUT' and Price < Strike ) or ( upcase(CallPutType) not in ( 'CALL', 'PUT' ) ) then
86 if SettleType eq 'CASH' then Payoff = Cash_Amt;
92 if min(Price,Price_Chk_Barrier_Down) < Barrier then do;
93 if BarrType eq 'ui' then return(0);
94 if BarrType eq 'uo' then return(Payoff);
95 if BarrType eq 'di' then return(Payoff);
96 if BarrType eq 'do' then return(0);
99 if max(Price,Price_Chk_Barrier_Up) > Barrier then do;
100 if BarrType eq 'ui' then return(Payoff);
101 if BarrType eq 'uo' then return(0);
102 if BarrType eq 'di' then return(0);
103 if BarrType eq 'do' then return(Payoff);
107 if BarrType eq 'ui' then return(Payoff);
108 if BarrType eq 'uo' then return(0);
109 if BarrType eq 'di' then return(Payoff);
110 if BarrType eq 'do' then return(0);
147 CostofCarry=RiskFreeRate - YieldParam;
148 if upcase(CallPutType) not in ( 'CALL', 'PUT' ) then do;
149 IF BarrType eq 'di' and SettleType eq 'CASH' and PayAtHitFlg eq 1 THEN DO;
155 IF BarrType eq 'ui' and SettleType eq 'CASH' and PayAtHitFlg eq 1 THEN DO;
161 IF BarrType eq 'di' and SettleType ne 'CASH' and PayAtHitFlg eq 1 THEN DO;
167 IF BarrType eq 'ui' and SettleType ne 'CASH' and PayAtHitFlg eq 1 THEN DO;
173 IF BarrType eq 'di' and SettleType eq 'CASH' and PayAtHitFlg ne 1 THEN DO;
179 IF BarrType eq 'ui' and SettleType eq 'CASH' and PayAtHitFlg ne 1 THEN DO;
185 IF BarrType eq 'di' and SettleType ne 'CASH' and PayAtHitFlg ne 1 THEN DO;
191 IF BarrType eq 'ui' and SettleType ne 'CASH' and PayAtHitFlg ne 1 THEN DO;
197 IF BarrType eq 'do' and SettleType eq 'CASH' THEN DO;
203 IF BarrType eq 'uo' and SettleType eq 'CASH' THEN DO;
209 IF BarrType eq 'do' and SettleType ne 'CASH' THEN DO;
215 IF BarrType eq 'uo' and SettleType ne 'CASH' THEN DO;
225 if upcase(CallPutType) eq 'CALL' then do;
226 IF BarrType eq 'di' and SettleType eq 'CASH' THEN DO;
232 IF BarrType eq 'ui' and SettleType eq 'CASH' THEN DO;
238 IF BarrType eq 'di' and SettleType ne 'CASH' THEN DO;
244 IF BarrType eq 'ui' and SettleType ne 'CASH' THEN DO;
250 IF BarrType eq 'do' and SettleType eq 'CASH' THEN DO;
256 IF BarrType eq 'uo' and SettleType eq 'CASH' THEN DO;
262 IF BarrType eq 'do' and SettleType ne 'CASH' THEN DO;
268 IF BarrType eq 'uo' and SettleType ne 'CASH' THEN DO;
279 IF BarrType eq 'di' and SettleType eq 'CASH' THEN DO;
285 IF BarrType eq 'ui' and SettleType eq 'CASH' THEN DO;
291 IF BarrType eq 'di' and SettleType ne 'CASH' THEN DO;
297 IF BarrType eq 'ui' and SettleType ne 'CASH' THEN DO;
303 IF BarrType eq 'do' and SettleType eq 'CASH' THEN DO;
309 IF BarrType eq 'uo' and SettleType eq 'CASH' THEN DO;
316 IF BarrType eq 'do' and SettleType ne 'CASH' THEN DO;
322 IF BarrType eq 'uo' and SettleType ne 'CASH' THEN DO;
332 _mu_=(CostofCarry - ((volatility*volatility)/2) ) / (volatility*volatility);
333 _lambda_=sqrt( _mu_*_mu_ + ((2*RiskFreeRate)/(volatility*volatility)));
334 x1=(log(Price/Strike) / (volatility*sqrt(TimeToExpiration))) + (_mu_+1)* volatility*sqrt(TimeToExpiration);
335 x2=(log(Price/Barrier) / (volatility*sqrt(TimeToExpiration))) + (_mu_+1)* volatility*sqrt(TimeToExpiration);
336 y1=(log((Barrier*Barrier)/(Strike*Price)) / (volatility*sqrt( TimeToExpiration))) + (_mu_+1)*volatility*sqrt(TimeToExpiration);
337 y2=(log(Barrier/Price) / (volatility*sqrt(TimeToExpiration))) + (_mu_+1)* volatility*sqrt(TimeToExpiration);
338 z=(log(Barrier/Price) / (volatility*sqrt(TimeToExpiration))) + (_lambda_)* volatility*sqrt(TimeToExpiration);
339 A1=Price * exp((CostofCarry - RiskFreeRate)*(TimeToExpiration)) * probnorm(_fi_*x1);
340 B1=Cash_Amt * exp(- RiskFreeRate*(TimeToExpiration)) * probnorm(_fi_*x1 - _fi_*volatility*sqrt(TimeToExpiration));
341 A2=Price * exp((CostofCarry - RiskFreeRate)*(TimeToExpiration)) * probnorm(_fi_*x2);
342 B2=Cash_Amt * exp(- RiskFreeRate*(TimeToExpiration)) * probnorm(_fi_*x2 - _fi_*volatility*sqrt(TimeToExpiration));
343 A3=Price * exp((CostofCarry - RiskFreeRate)*(TimeToExpiration)) * probnorm(_eta_*y1) * ( (Barrier/Price)**(2*_mu_+2) ) ;
344 B3=Cash_Amt * exp(- RiskFreeRate*(TimeToExpiration)) * probnorm(_eta_*y1 - _eta_*volatility*sqrt(TimeToExpiration)) * ( (Barrier/Price)**(2* _mu_) );
345 A4=Price * exp((CostofCarry - RiskFreeRate)*(TimeToExpiration)) * probnorm(_eta_*y2) * ( (Barrier/Price)**(2*_mu_+2) ) ;
346 B4=Cash_Amt * exp(- RiskFreeRate*(TimeToExpiration)) * probnorm(_eta_*y2 - _eta_*volatility*sqrt(TimeToExpiration)) * ( (Barrier/Price)**(2* _mu_) );
347 A56 = ( ( (Barrier/Price)**(_mu_ + _lambda_) ) * probnorm(_eta_*z) + ( (Barrier/Price)**(_mu_ - _lambda_) ) * probnorm(_eta_*z - 2*_eta_*_lambda_*volatility*sqrt(TimeToExpiration)) );
352 if upcase(CallPutType) not in ( 'CALL', 'PUT' ) then do;
353 IF BarrType eq 'di' and SettleType eq 'CASH' and PayAtHitFlg eq 1 THEN DO;
356 IF Price_Chk_Barrier_Down le Barrier THEN DO;
358 OptionPrice=Cash_Amt;
362 IF BarrType eq 'ui' and SettleType eq 'CASH' and PayAtHitFlg eq 1 THEN DO;
365 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
367 OptionPrice=Cash_Amt;
371 IF BarrType eq 'di' and SettleType ne 'CASH' and PayAtHitFlg eq 1 THEN DO;
374 IF Price_Chk_Barrier_Down le Barrier THEN DO;
380 IF BarrType eq 'ui' and SettleType ne 'CASH' and PayAtHitFlg eq 1 THEN DO;
383 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
389 IF BarrType eq 'di' and SettleType eq 'CASH' and PayAtHitFlg ne 1 THEN DO;
392 IF Price_Chk_Barrier_Down le Barrier THEN DO;
394 OptionPrice=Cash_Amt*exp(-RiskFreeRate*TimeToExpiration);
398 IF BarrType eq 'ui' and SettleType eq 'CASH' and PayAtHitFlg ne 1 THEN DO;
401 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
403 OptionPrice=Cash_Amt*exp(-RiskFreeRate*TimeToExpiration);
407 IF BarrType eq 'di' and SettleType ne 'CASH' and PayAtHitFlg ne 1 THEN DO;
410 IF Price_Chk_Barrier_Down le Barrier THEN DO;
412 OptionPrice=Price*exp(-YieldParam*TimeToExpiration);
416 IF BarrType eq 'ui' and SettleType ne 'CASH' and PayAtHitFlg ne 1 THEN DO;
419 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
421 OptionPrice=Price*exp(-YieldParam*TimeToExpiration);
425 IF BarrType eq 'do' and SettleType eq 'CASH' THEN DO;
428 IF Price_Chk_Barrier_Down le Barrier THEN DO;
434 IF BarrType eq 'uo' and SettleType eq 'CASH' THEN DO;
437 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
443 IF BarrType eq 'do' and SettleType ne 'CASH' THEN DO;
446 IF Price_Chk_Barrier_Down le Barrier THEN DO;
452 IF BarrType eq 'uo' and SettleType ne 'CASH' THEN DO;
455 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
463 if upcase(CallPutType) eq 'CALL' then do;
464 IF BarrType eq 'di' and SettleType eq 'CASH' THEN DO;
466 IF Strike ge Barrier THEN DO;
471 OptionPrice=B1-B2+B4;
473 IF Price_Chk_Barrier_Down le Barrier THEN DO;
475 OptionPrice = rsk_binary_cash_option_pf( CallPutType, Price, Cash_Amt, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
479 IF BarrType eq 'ui' and SettleType eq 'CASH' THEN DO;
481 IF Strike ge Barrier THEN DO;
486 OptionPrice=B2-B3+B4;
488 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
490 OptionPrice = rsk_binary_cash_option_pf( CallPutType, Price, Cash_Amt, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
494 IF BarrType eq 'di' and SettleType ne 'CASH' THEN DO;
496 IF Strike ge Barrier THEN DO;
501 OptionPrice=A1-A2+A4;
503 IF Price_Chk_Barrier_Down le Barrier THEN DO;
505 OptionPrice = rsk_binary_asset_option_pf( CallPutType, Price, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
509 IF BarrType eq 'ui' and SettleType ne 'CASH' THEN DO;
511 IF Strike ge Barrier THEN DO;
516 OptionPrice=A2-A3+A4;
518 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
520 OptionPrice = rsk_binary_asset_option_pf( CallPutType, Price, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
524 IF BarrType eq 'do' and SettleType eq 'CASH' THEN DO;
526 IF Strike ge Barrier THEN DO;
533 IF Price_Chk_Barrier_Down le Barrier THEN DO;
539 IF BarrType eq 'uo' and SettleType eq 'CASH' THEN DO;
541 IF Strike ge Barrier THEN DO;
546 OptionPrice=B1-B2+B3-B4;
548 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
554 IF BarrType eq 'do' and SettleType ne 'CASH' THEN DO;
556 IF Strike ge Barrier THEN DO;
563 IF Price_Chk_Barrier_Down le Barrier THEN DO;
569 IF BarrType eq 'uo' and SettleType ne 'CASH' THEN DO;
571 IF Strike ge Barrier THEN DO;
576 OptionPrice=A1-A2+A3-A4;
578 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
587 IF BarrType eq 'di' and SettleType eq 'CASH' THEN DO;
589 IF Strike ge Barrier THEN DO;
590 OptionPrice=B2-B3+B4;
596 IF Price_Chk_Barrier_Down le Barrier THEN DO;
598 OptionPrice = rsk_binary_cash_option_pf( CallPutType, Price, Cash_Amt, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
602 IF BarrType eq 'ui' and SettleType eq 'CASH' THEN DO;
604 IF Strike ge Barrier THEN DO;
605 OptionPrice=B1-B2+B4;
611 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
613 OptionPrice = rsk_binary_cash_option_pf( CallPutType, Price, Cash_Amt, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
617 IF BarrType eq 'di' and SettleType ne 'CASH' THEN DO;
619 IF Strike ge Barrier THEN DO;
620 OptionPrice=A2-A3+A4;
626 IF Price_Chk_Barrier_Down le Barrier THEN DO;
628 OptionPrice = rsk_binary_asset_option_pf( CallPutType, Price, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
632 IF BarrType eq 'ui' and SettleType ne 'CASH' THEN DO;
634 IF Strike ge Barrier THEN DO;
635 OptionPrice=A1-A2+A3;
641 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
643 OptionPrice = rsk_binary_asset_option_pf( CallPutType, Price, Strike, RiskFreeRate, YieldParam, TimeToExpiration, Volatility );
647 IF BarrType eq 'do' and SettleType eq 'CASH' THEN DO;
649 IF Strike ge Barrier THEN DO;
650 OptionPrice=B1-B2+B3-B4;
656 IF Price_Chk_Barrier_Down le Barrier THEN DO;
662 IF BarrType eq 'uo' and SettleType eq 'CASH' THEN DO;
664 IF Strike ge Barrier THEN DO;
671 IF Price_Chk_Barrier_Up ge Barrier THEN DO;
677 IF BarrType eq 'do' and SettleType ne 'CASH' THEN DO;
679 IF Strike ge Barrier THEN DO;
680 OptionPrice=A1-A2+A3-A4;
686 IF Price_Chk_Barrier_Down le Barrier THEN DO;
692 IF BarrType eq 'uo' and SettleType ne 'CASH' THEN DO;
694 IF Strike ge Barrier THEN DO;
701 IF Price_Chk_Barrier_Up ge Barrier THEN DO;