rustyqlib/rates/
build_contracts.rs1use crate::rates;
2use crate::rates::deposits::Deposit;
3use chrono::Local;
4use crate::rates::fra::FRA;
5use crate::core::traits::Rates;
6use crate::core::utils::Contract;
7use crate::rates::utils::TermStructure;
8
9pub fn build_ir_contracts(data: Contract) -> Box<dyn Rates> {
10 let rate_data = data.rate_data.clone().unwrap();
11 let start_date_str = rate_data.start_date; let maturity_date_str = rate_data.maturity_date;
13 let current_date = Local::now().date_naive();
14 let maturity_date = rates::utils::convert_mm_to_date(maturity_date_str);
15 let start_date = rates::utils::convert_mm_to_date(start_date_str);
16 if rate_data.instrument.as_str() == "Deposit" {
17 let mut deposit = Deposit {
18 start_date: start_date,
19 maturity_date: maturity_date,
20 valuation_date: current_date,
21 notional: rate_data.notional,
22 fix_rate: rate_data.fix_rate,
23 day_count: rates::utils::DayCountConvention::Act360,
24 business_day_adjustment: 0,
25 term_structure: None
26 };
27 match rate_data.day_count.as_str() {
28 "Act360" |"A360" => {
29 deposit.day_count = rates::utils::DayCountConvention::Act360;
30 }
31 "Act365" |"A365" => {
32 deposit.day_count = rates::utils::DayCountConvention::Act365;
33 }
34 "Thirty360" |"30/360" => {
35 deposit.day_count = rates::utils::DayCountConvention::Thirty360;
36 }
37 _ => {}
38 }
39 let ird:Box<dyn Rates> = Box::new(deposit);
40 return ird;
41 }
42 else if rate_data.instrument.as_str()=="FRA" {
43 let mut fra = FRA {
49 start_date: start_date,
50 maturity_date: maturity_date,
51 valuation_date: current_date,
52 notional: rate_data.notional,
53 currency: rate_data.currency,
54 fix_rate: rate_data.fix_rate,
55 day_count: rates::utils::DayCountConvention::Act360,
56 business_day_adjustment: 0,
57 term_structure: None
58 };
59 match rate_data.day_count.as_str() {
60 "Act360" |"A360" => {
61 fra.day_count = rates::utils::DayCountConvention::Act360;
62 }
63 "Act365" |"A365" => {
64 fra.day_count = rates::utils::DayCountConvention::Act365;
65 }
66 "Thirty360" |"30/360" => {
67 fra.day_count = rates::utils::DayCountConvention::Thirty360;
68 }
69 _ => {}
70 }
71 let ird:Box<dyn Rates> = Box::new(fra);
72 return ird;
73 }
74 else {
75 panic!("Invalid asset");
76 }
77}
78
79pub fn build_ir_contracts_from_json(data: Vec<Contract>) -> Vec<Box<dyn Rates>> {
80 let mut irds:Vec<Box<dyn Rates>> = Vec::new();
81 for contract in data {
82 let ird = build_ir_contracts(contract);
83 irds.push(ird);
84 }
85 return irds;
86}
87pub fn build_term_structure(mut contracts:Vec<Box<dyn Rates>>) -> TermStructure {
88 let mut ts:rates::utils::TermStructure = rates::utils::TermStructure::new(vec![],vec![],vec![],
89 rates::utils::DayCountConvention::Act360);
90 let contract = contracts[0].as_mut();
91 ts.discount_factor.push(contract.get_maturity_discount_factor());
92 ts.date.push(contract.get_maturity_date());
93 ts.rate.push(contract.get_rate());
94 for i in 1..contracts.len(){
95 let contract = contracts[i].as_mut();
96 contract.set_term_structure(ts.clone());
97 ts.discount_factor.push(contract.get_maturity_discount_factor());
98 ts.date.push(contract.get_maturity_date());
99 ts.rate.push(contract.get_rate());
100 }
101 return ts
102}