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