1- use libm:: { exp, log} ;
2- use std:: f64:: consts:: { PI , SQRT_2 } ;
3- use crate :: core:: utils:: { dN, N } ;
4- use crate :: core:: trade;
5-
6- use super :: cmdty_option:: { CmdtyOption , Engine } ;
7- use super :: super :: core:: termstructure:: YieldTermStructure ;
8- use super :: super :: core:: traits:: { Instrument , Greeks } ;
9- use super :: super :: core:: interpolation;
10-
11- pub fn npv ( bsd_option : & & CmdtyOption ) -> f64 {
12- assert ! ( bsd_option. volatility >= 0.0 ) ;
13- assert ! ( bsd_option. time_to_maturity >= 0.0 ) ;
14- assert ! ( bsd_option. current_price. value >= 0.0 ) ;
15- if bsd_option. option_type == trade:: OptionType :: Call {
16- let option_price = bsd_option. current_price . value ( ) * N ( bsd_option. d1 ( ) )
17- - bsd_option. strike_price * N ( bsd_option. d2 ( ) ) ;
18- return option_price;
19- } else {
20- let option_price = -bsd_option. current_price . value ( )
21- * N ( -bsd_option. d1 ( ) )
22- + bsd_option. strike_price * N ( -bsd_option. d2 ( ) ) ;
23- return option_price;
24- }
25- }
26-
27-
28-
29- impl CmdtyOption {
30- pub fn set_risk_free_rate ( & mut self ) {
31- let model = interpolation:: CubicSpline :: new ( & self . term_structure . date , & self . term_structure . rates ) ;
32- let r = model. interpolation ( self . time_to_maturity ) ;
33- self . risk_free_rate = Some ( r) ;
34- }
35- pub fn get_premium_at_risk ( & self ) -> f64 {
36- let value = self . npv ( ) ;
37- let mut pay_off = 0.0 ;
38- if self . option_type == trade:: OptionType :: Call {
39- pay_off = self . current_price . value ( ) - self . strike_price ;
40- } else if self . option_type == trade:: OptionType :: Put {
41- pay_off = self . strike_price - self . current_price . value ( ) ;
42- }
43- if pay_off > 0.0 {
44- return value - pay_off;
45- } else {
46- return value;
47- }
48- }
49- pub fn d1 ( & self ) -> f64 {
50- //Black76 d1 function Parameters
51- let tmp1 = ( self . current_price . value ( ) / self . strike_price ) . ln ( )
52- + ( 0.5 * self . volatility . powi ( 2 ) )
53- * self . time_to_maturity ;
54-
55- let tmp2 = self . volatility * ( self . time_to_maturity . sqrt ( ) ) ;
56- return tmp1 / tmp2;
57- }
58- pub fn d2 ( & self ) -> f64 {
59- let d2 = self . d1 ( ) - self . volatility * self . time_to_maturity . powf ( 0.5 ) ;
60- return d2;
61- }
62- // pub fn imp_vol(&mut self,option_price:f64) -> f64 {
63- // for i in 0..100{
64- // let d_sigma = (self.npv()-option_price)/self.vega();
65- // self.volatility -= d_sigma
66- // }
67- // self.volatility
68- // }
69- }
70- impl Greeks for CmdtyOption {
71- fn delta ( & self ) -> f64 {
72- let mut delta = N ( self . d1 ( ) ) ;
73- if self . option_type == trade:: OptionType :: Call {
74- delta = delta;
75- } else if self . option_type == trade:: OptionType :: Put {
76- delta = delta - 1.0 ;
77- }
78- return delta;
79- }
80- fn gamma ( & self ) -> f64 {
81- let gamma = dN ( self . d1 ( ) ) ;
82-
83- let var_sqrt = self . volatility * ( self . time_to_maturity . sqrt ( ) ) ;
84- return gamma / ( self . current_price . value ( ) * var_sqrt) ;
85- }
86- fn vega ( & self ) -> f64 {
87- //St * dN(d1) * math.sqrt(T - t)
88- let vega = self . current_price . value ( ) * dN ( self . d1 ( ) ) * self . time_to_maturity . sqrt ( ) ;
89- return vega;
90- }
91- fn theta ( & self ) -> f64 {
92- let mut theta = 0.0 ;
93- if self . option_type == trade:: OptionType :: Call {
94- //-(St * dN(d1) * sigma / (2 * math.sqrt(T - t)) + r * K * math.exp(-r * (T - t)) * N(d2))
95- let t1 = -self . current_price . value ( ) * dN ( self . d1 ( ) ) * self . volatility
96- / ( 2.0 * self . time_to_maturity . sqrt ( ) ) ;
97-
98- theta = t1;
99- } else if self . option_type == trade:: OptionType :: Put {
100- //-(St * dN(d1) * sigma / (2 * math.sqrt(T - t)) - r * K * math.exp(-r * (T - t)) * N(d2))
101- let t1 = -self . current_price . value ( ) * dN ( self . d1 ( ) ) * self . volatility
102- / ( 2.0 * self . time_to_maturity . sqrt ( ) ) ;
103-
104- theta = t1;
105- }
106-
107- return theta;
108- }
109- fn rho ( & self ) -> f64 {
110- //rho K * (T - t) * math.exp(-r * (T - t)) * N(d2)
111- let mut rho = 0.0 ;
112- if self . option_type == trade:: OptionType :: Call {
113- rho = self . strike_price
114- * self . time_to_maturity
115-
116- * N ( self . d2 ( ) ) ;
117- } else if self . option_type == trade:: OptionType :: Put {
118- //put_rho = -K * (T - t) * math.exp(-r * (T - t)) * N(-d2)
119- rho = -self . strike_price
120- * self . time_to_maturity
121- * N ( -self . d2 ( ) ) ;
122- }
123-
124- return rho;
125- }
126- }
1+ // use libm::{exp, log};
2+ // use std::f64::consts::{PI, SQRT_2};
3+ // use crate::core::utils::{dN, N};
4+ // use crate::core::trade;
5+ //
6+ // use super::cmdty_option::{CmdtyOption,Engine};
7+ // use super::super::core::termstructure::YieldTermStructure;
8+ // use super::super::core::traits::{Instrument,Greeks};
9+ // use super::super::core::interpolation;
10+ //
11+ // pub fn npv(bsd_option: &&CmdtyOption) -> f64 {
12+ // assert!(bsd_option.volatility >= 0.0);
13+ // assert!(bsd_option.time_to_maturity >= 0.0);
14+ // assert!(bsd_option.current_price.value >= 0.0);
15+ // if bsd_option.option_type == trade::PutOrCall ::Call {
16+ // let option_price = bsd_option.current_price.value() * N(bsd_option.d1())
17+ // - bsd_option.strike_price * N(bsd_option.d2());
18+ // return option_price;
19+ // } else {
20+ // let option_price = -bsd_option.current_price.value()
21+ // * N(-bsd_option.d1())
22+ // + bsd_option.strike_price * N(-bsd_option.d2());
23+ // return option_price;
24+ // }
25+ // }
26+ //
27+ //
28+ //
29+ // impl CmdtyOption {
30+ // pub fn set_risk_free_rate(&mut self){
31+ // let model = interpolation::CubicSpline::new(&self.term_structure.date, &self.term_structure.rates);
32+ // let r = model.interpolation(self.time_to_maturity);
33+ // self.risk_free_rate = Some(r);
34+ // }
35+ // pub fn get_premium_at_risk(&self) -> f64 {
36+ // let value = self.npv();
37+ // let mut pay_off = 0.0;
38+ // if self.option_type == trade::OptionType::Call {
39+ // pay_off = self.current_price.value() - self.strike_price;
40+ // } else if self.option_type == trade::OptionType::Put {
41+ // pay_off = self.strike_price - self.current_price.value();
42+ // }
43+ // if pay_off > 0.0 {
44+ // return value - pay_off;
45+ // } else {
46+ // return value;
47+ // }
48+ // }
49+ // pub fn d1(&self) -> f64 {
50+ // //Black76 d1 function Parameters
51+ // let tmp1 = (self.current_price.value() / self.strike_price).ln()
52+ // + (0.5 * self.volatility.powi(2))
53+ // * self.time_to_maturity;
54+ //
55+ // let tmp2 = self.volatility * (self.time_to_maturity.sqrt());
56+ // return tmp1 / tmp2;
57+ // }
58+ // pub fn d2(&self) -> f64 {
59+ // let d2 = self.d1() - self.volatility * self.time_to_maturity.powf(0.5);
60+ // return d2;
61+ // }
62+ // // pub fn imp_vol(&mut self,option_price:f64) -> f64 {
63+ // // for i in 0..100{
64+ // // let d_sigma = (self.npv()-option_price)/self.vega();
65+ // // self.volatility -= d_sigma
66+ // // }
67+ // // self.volatility
68+ // // }
69+ // }
70+ // impl Greeks for CmdtyOption{
71+ // fn delta(&self) -> f64 {
72+ // let mut delta = N(self.d1());
73+ // if self.option_type == trade::OptionType::Call {
74+ // delta = delta;
75+ // } else if self.option_type == trade::OptionType::Put {
76+ // delta = delta - 1.0;
77+ // }
78+ // return delta;
79+ // }
80+ // fn gamma(&self) -> f64 {
81+ // let gamma = dN(self.d1());
82+ //
83+ // let var_sqrt = self.volatility * (self.time_to_maturity.sqrt());
84+ // return gamma / (self.current_price.value() * var_sqrt);
85+ // }
86+ // fn vega(&self) -> f64 {
87+ // //St * dN(d1) * math.sqrt(T - t)
88+ // let vega = self.current_price.value() * dN(self.d1()) * self.time_to_maturity.sqrt();
89+ // return vega;
90+ // }
91+ // fn theta(&self) -> f64 {
92+ // let mut theta = 0.0;
93+ // if self.option_type == trade::OptionType::Call {
94+ // //-(St * dN(d1) * sigma / (2 * math.sqrt(T - t)) + r * K * math.exp(-r * (T - t)) * N(d2))
95+ // let t1 = -self.current_price.value() * dN(self.d1()) * self.volatility
96+ // / (2.0 * self.time_to_maturity.sqrt());
97+ //
98+ // theta = t1;
99+ // } else if self.option_type == trade::OptionType::Put {
100+ // //-(St * dN(d1) * sigma / (2 * math.sqrt(T - t)) - r * K * math.exp(-r * (T - t)) * N(d2))
101+ // let t1 = -self.current_price.value() * dN(self.d1()) * self.volatility
102+ // / (2.0 * self.time_to_maturity.sqrt());
103+ //
104+ // theta = t1;
105+ // }
106+ //
107+ // return theta;
108+ // }
109+ // fn rho(&self) -> f64 {
110+ // //rho K * (T - t) * math.exp(-r * (T - t)) * N(d2)
111+ // let mut rho = 0.0;
112+ // if self.option_type == trade::OptionType::Call {
113+ // rho = self.strike_price
114+ // * self.time_to_maturity
115+ //
116+ // * N(self.d2());
117+ // } else if self.option_type == trade::OptionType::Put {
118+ // //put_rho = -K * (T - t) * math.exp(-r * (T - t)) * N(-d2)
119+ // rho = -self.strike_price
120+ // * self.time_to_maturity
121+ // * N(-self.d2());
122+ // }
123+ //
124+ // return rho;
125+ // }
126+ // }
0 commit comments